• 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
6
7from autotest_lib.client.common_lib import error
8from autotest_lib.server.cros.faft.firmware_test import FirmwareTest
9
10class firmware_ECCharging(FirmwareTest):
11    """
12    Servo based EC charging control test.
13    """
14    version = 1
15
16    # Threshold of trickle charging current in mA
17    TRICKLE_CHARGE_THRESHOLD = 100
18
19    def initialize(self, host, cmdline_args):
20        super(firmware_ECCharging, self).initialize(host, cmdline_args)
21        # Only run in normal mode
22        self.switcher.setup_mode('normal')
23        self.ec.send_command("chan 0")
24
25
26    def cleanup(self):
27        self.ec.send_command("chan 0xffffffff")
28        super(firmware_ECCharging, self).cleanup()
29
30
31    def _get_battery_desired_voltage(self):
32        """Get battery desired voltage value."""
33        voltage = int(self.ec.send_command_get_output("battery",
34                ["V-desired:\s+0x[0-9a-f]*\s+=\s+(\d+)\s+mV"])[0][1])
35        logging.info("Battery desired voltage = %d mV", voltage)
36        return voltage
37
38
39    def _get_battery_desired_current(self):
40        """Get battery desired current value."""
41        current = int(self.ec.send_command_get_output("battery",
42                ["I-desired:\s+0x[0-9a-f]*\s+=\s+(\d+)\s+mA"])[0][1])
43        logging.info("Battery desired current = %d mA", current)
44        return current
45
46
47    def _get_battery_actual_voltage(self):
48        """Get the actual voltage from charger to battery."""
49        voltage = int(self.ec.send_command_get_output("battery",
50                ["V:\s+0x[0-9a-f]*\s+=\s+(\d+)\s+mV"])[0][1])
51        logging.info("Battery actual voltage = %d mV", voltage)
52        return voltage
53
54
55    def _get_battery_actual_current(self):
56        """Get the actual current from charger to battery."""
57        current = int(self.ec.send_command_get_output("battery",
58                ["I:\s+0x[0-9a-f]*\s+=\s+([0-9-]+)\s+mA"])[0][1])
59        logging.info("Battery actual current = %d mA", current)
60        return current
61
62
63    def _get_battery_charge(self):
64        """Get battery charge state."""
65        charge = int(self.ec.send_command_get_output("battery",
66                ["Charge:\s+(\d+)\s+"])[0][1])
67        logging.info("Battery charge = %d %%", charge)
68        return charge
69
70
71    def _get_charger_target_voltage(self):
72        """Get target charging voltage set in charger."""
73        voltage = int(self.ec.send_command_get_output("charger",
74                ["V_batt:\s+(\d+)\s"])[0][1])
75        logging.info("Charger target voltage = %d mV", voltage)
76        return voltage
77
78
79    def _get_charger_target_current(self):
80        """Get target charging current set in charger."""
81        current = int(self.ec.send_command_get_output("charger",
82                ["I_batt:\s+(\d+)\s"])[0][1])
83        logging.info("Charger target current = %d mA", current)
84        return current
85
86
87    def _get_trickle_charging(self):
88        """Check if we are trickle charging battery."""
89        return (self._get_battery_desired_current() <
90                self.TRICKLE_CHARGE_THRESHOLD)
91
92
93    def _check_target_value(self):
94        """Check charger target values are correct.
95
96        Raise:
97          error.TestFail: Raised when check fails.
98        """
99        if (self._get_charger_target_voltage() >=
100                1.05 * self._get_battery_desired_voltage()):
101            raise error.TestFail("Charger target voltage is too high.")
102        if (self._get_charger_target_current() >=
103                1.05 * self._get_battery_desired_current()):
104            raise error.TestFail("Charger target current is too high.")
105
106
107    def _check_actual_value(self):
108        """Check actual voltage/current values are correct.
109
110        Raise:
111          error.TestFail: Raised when check fails.
112        """
113        if (self._get_battery_actual_voltage() >=
114                1.05 * self._get_charger_target_voltage()):
115            raise error.TestFail("Battery actual voltage is too high.")
116        if (self._get_battery_actual_current() >=
117                1.05 * self._get_charger_target_current()):
118            raise error.TestFail("Battery actual current is too high.")
119
120
121    def run_once(self):
122        if not self.check_ec_capability(['battery', 'charging']):
123            raise error.TestNAError("Nothing needs to be tested on this device")
124        if self._get_battery_charge() == 100:
125            logging.info("Battery is full. Unable to test.")
126            return
127        if self._get_trickle_charging():
128            logging.info("Trickling charging battery. Unable to test.")
129            return
130        if self._get_battery_actual_current() < 0:
131            raise error.TestFail("This test must be run with AC power.")
132
133        logging.info("Checking charger target values...")
134        self._check_target_value()
135
136        logging.info("Checking battery actual values...")
137        self._check_actual_value()
138