• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import logging
6import re
7from threading import Timer
8
9from autotest_lib.client.common_lib import error
10from autotest_lib.server.cros.faft.firmware_test import FirmwareTest
11
12
13class firmware_ECPowerButton(FirmwareTest):
14    """
15    Servo based EC power button test.
16    """
17    version = 1
18
19    # Delay between shutdown and wake by power button
20    LONG_WAKE_DELAY = 13
21    SHORT_WAKE_DELAY = 7
22
23    # Short duration of holding down power button to power on
24    POWER_BUTTON_SHORT_POWER_ON_DURATION = 0.05
25
26    # Long duration of holding down power button to power on
27    POWER_BUTTON_LONG_POWER_ON_DURATION = 1
28
29    # Duration of holding down power button to shut down with powerd
30    POWER_BUTTON_POWERD_DURATION = 6
31
32    # Duration of holding down power button to shut down without powerd
33    POWER_BUTTON_NO_POWERD_DURATION = 11
34
35    def initialize(self, host, cmdline_args):
36        super(firmware_ECPowerButton, self).initialize(host, cmdline_args)
37        # Only run in normal mode
38        self.switcher.setup_mode('normal')
39
40    def kill_powerd(self):
41        """Stop powerd on client."""
42        self.faft_client.system.run_shell_command("stop powerd")
43
44    def debounce_power_button(self):
45        """Check if power button debouncing works.
46
47        Press power button for a very short period and checks for power
48        button keycode.
49        """
50        # Delay 3 seconds to ensure client machine is waiting for key press.
51        # Press power button for only 10ms. Should be debounced.
52        logging.info('ECPowerButton: debounce_power_button')
53        Timer(3, self.servo.power_key, [0.001]).start()
54        return self.faft_client.system.check_keys([116])
55
56    def shutdown_and_wake(self,
57                          shutdown_powerkey_duration,
58                          wake_delay,
59                          wake_powerkey_duration):
60        """
61        Shutdown the system by power button, delay, and then power on
62        by power button again.
63        """
64        self.servo.power_key(shutdown_powerkey_duration)
65        Timer(wake_delay,
66              self.servo.power_key,
67              [wake_powerkey_duration]).start()
68
69    def run_once(self):
70        if not self.check_ec_capability():
71            raise error.TestNAError("Nothing needs to be tested on this device")
72
73        logging.info("Shutdown when powerd is still running and wake from S5 "
74                     "with short power button press.")
75
76        if self.servo.is_localhost():
77            self.check_state(self.debounce_power_button)
78        self.switcher.mode_aware_reboot(
79                'custom',
80                lambda:self.shutdown_and_wake(
81                        self.POWER_BUTTON_POWERD_DURATION,
82                        self.SHORT_WAKE_DELAY,
83                        self.POWER_BUTTON_SHORT_POWER_ON_DURATION))
84
85        logging.info("Shutdown when powerd is stopped and wake from G3 "
86                          "with short power button press.")
87        self.kill_powerd()
88        self.switcher.mode_aware_reboot(
89                'custom',
90                lambda:self.shutdown_and_wake(
91                        self.POWER_BUTTON_NO_POWERD_DURATION,
92                        self.LONG_WAKE_DELAY,
93                        self.POWER_BUTTON_SHORT_POWER_ON_DURATION))
94
95        logging.info("Shutdown when powerd is still running and wake from G3 "
96                     "with long power button press.")
97        self.switcher.mode_aware_reboot(
98                'custom',
99                lambda:self.shutdown_and_wake(
100                        self.POWER_BUTTON_POWERD_DURATION,
101                        self.LONG_WAKE_DELAY,
102                        self.POWER_BUTTON_LONG_POWER_ON_DURATION))
103
104        logging.info("Shutdown when powerd is stopped and wake from S5 "
105                     "with long power button press.")
106        self.kill_powerd()
107        self.switcher.mode_aware_reboot(
108                'custom',
109                lambda:self.shutdown_and_wake(
110                        self.POWER_BUTTON_NO_POWERD_DURATION,
111                        self.SHORT_WAKE_DELAY,
112                        self.POWER_BUTTON_LONG_POWER_ON_DURATION))
113