xref: /aosp_15_r20/external/autotest/client/common_lib/smogcheck_ttci.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Lint as: python2, python3
2*9c5db199SXin Li# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
4*9c5db199SXin Li# found in the LICENSE file.
5*9c5db199SXin Li
6*9c5db199SXin Li"""A Python library to interact with TTCI module for TPM testing.
7*9c5db199SXin Li
8*9c5db199SXin LiBackground
9*9c5db199SXin Li - TTCI stands for TPM Test Controller Interface
10*9c5db199SXin Li - TTCI is a custom-designed hardware board that can be used to test TPM module
11*9c5db199SXin Li - TTCI board contains two modules: PCA9555 and INA219. This library provides
12*9c5db199SXin Li   methods to interact with these modules programmatically
13*9c5db199SXin Li
14*9c5db199SXin LiDependency
15*9c5db199SXin Li - This library depends on a new C shared library called "libsmogcheck.so".
16*9c5db199SXin Li - In order to run test cases built using this API, one needs a TTCI board
17*9c5db199SXin Li
18*9c5db199SXin LiNotes:
19*9c5db199SXin Li - An exception is raised if it doesn't make logical sense to continue program
20*9c5db199SXin Li   flow (e.g. I/O error prevents test case from executing)
21*9c5db199SXin Li - An exception is caught and then converted to an error code if the caller
22*9c5db199SXin Li   expects to check for error code per API definition
23*9c5db199SXin Li"""
24*9c5db199SXin Li
25*9c5db199SXin Liimport logging
26*9c5db199SXin Lifrom autotest_lib.client.common_lib import smogcheck_ina219, smogcheck_pca9555
27*9c5db199SXin Li
28*9c5db199SXin Li
29*9c5db199SXin Li# I2C follower addresses of INA219 module
30*9c5db199SXin LiINA219_BPWR_SLV = 0x40  # Backup Power
31*9c5db199SXin LiINA219_MPWR_SLV = 0x44  # Main Power
32*9c5db199SXin Li
33*9c5db199SXin Li
34*9c5db199SXin Liclass TtciError(Exception):
35*9c5db199SXin Li    """Base class for all errors in this module."""
36*9c5db199SXin Li
37*9c5db199SXin Li
38*9c5db199SXin Liclass TtciController(object):
39*9c5db199SXin Li    """Object to control TTCI board used for TPM module testing."""
40*9c5db199SXin Li
41*9c5db199SXin Li    def __init__(self):
42*9c5db199SXin Li        """Constructor.
43*9c5db199SXin Li
44*9c5db199SXin Li        Mandatory params:
45*9c5db199SXin Li          err: error string.
46*9c5db199SXin Li          ina_backup_obj: an instance of InaController (for Backup Power port
47*9c5db199SXin Li                          of INA219 module).
48*9c5db199SXin Li          ina_main_obj: an instance of InaController (for Main Power port
49*9c5db199SXin Li                        of INA219 module).
50*9c5db199SXin Li          pca_obj: an instance of PcaController.
51*9c5db199SXin Li
52*9c5db199SXin Li        Raises:
53*9c5db199SXin Li          TtciError: if error initializing TTCI controller.
54*9c5db199SXin Li        """
55*9c5db199SXin Li        self.err = None
56*9c5db199SXin Li        try:
57*9c5db199SXin Li            # Initialize PCA9555 module.
58*9c5db199SXin Li            self.pca_obj = smogcheck_pca9555.PcaController()
59*9c5db199SXin Li
60*9c5db199SXin Li            # Initialize INA219 module.
61*9c5db199SXin Li            self.ina_main_obj = smogcheck_ina219.InaController(
62*9c5db199SXin Li                node_addr=INA219_MPWR_SLV)
63*9c5db199SXin Li            self.ina_backup_obj = smogcheck_ina219.InaController(
64*9c5db199SXin Li                node_addr=INA219_BPWR_SLV)
65*9c5db199SXin Li        except smogcheck_pca9555.PcaError as e:
66*9c5db199SXin Li            raise TtciError('Error initialize PCA9555 module: %s' % e)
67*9c5db199SXin Li        except smogcheck_ina219.InaError as e:
68*9c5db199SXin Li            raise TtciError('Error initialize INA219 module: %s' % e)
69*9c5db199SXin Li
70*9c5db199SXin Li    def TTCI_Get_Main_Power_Metrics(self):
71*9c5db199SXin Li        """Gets voltage and current measurements from INA219 Main Power.
72*9c5db199SXin Li
73*9c5db199SXin Li        See docstring of getPowerMetrics() in smogcheck_ina219.py.
74*9c5db199SXin Li        """
75*9c5db199SXin Li        return self.ina_main_obj.getPowerMetrics()
76*9c5db199SXin Li
77*9c5db199SXin Li    def TTCI_Get_Backup_Power_Metrics(self):
78*9c5db199SXin Li        """Gets voltage and current measurements from INA219 Backup Power.
79*9c5db199SXin Li
80*9c5db199SXin Li        See docstring of getPowerMetrics() in smogcheck_ina219.py.
81*9c5db199SXin Li        """
82*9c5db199SXin Li        return self.ina_backup_obj.getPowerMetrics()
83*9c5db199SXin Li
84*9c5db199SXin Li    def TTCI_Set_Main_Power_Control(self, turn_on):
85*9c5db199SXin Li        """De/activated TPM Main Power.
86*9c5db199SXin Li
87*9c5db199SXin Li        Args:
88*9c5db199SXin Li          turn_on: a boolean, on (true) = set bit to 1.
89*9c5db199SXin Li
90*9c5db199SXin Li        See docstring of setPCAcontrol() in smogcheck_pca9555.py.
91*9c5db199SXin Li        """
92*9c5db199SXin Li        return self.pca_obj.setPCAcontrol('main_power', turn_on=turn_on)
93*9c5db199SXin Li
94*9c5db199SXin Li    def TTCI_Set_Backup_Power_Control(self, turn_on):
95*9c5db199SXin Li        """De/activated TPM Backup Power.
96*9c5db199SXin Li
97*9c5db199SXin Li        Args:
98*9c5db199SXin Li          turn_on: a boolean, on (true) = set bit to 1.
99*9c5db199SXin Li
100*9c5db199SXin Li        See docstring of setPCAcontrol() in smogcheck_pca9555.py.
101*9c5db199SXin Li        """
102*9c5db199SXin Li        return self.pca_obj.setPCAcontrol('backup_power', turn_on=turn_on)
103*9c5db199SXin Li
104*9c5db199SXin Li    def TTCI_Set_Reset_Control(self, turn_on):
105*9c5db199SXin Li        """De/activated TPM Reset.
106*9c5db199SXin Li
107*9c5db199SXin Li        Exception note:
108*9c5db199SXin Li          for TPM Reset, true means setting bit value to 0 (not 1).
109*9c5db199SXin Li
110*9c5db199SXin Li        Args:
111*9c5db199SXin Li          turn_on: a boolean, on (true) = set bit to 0.
112*9c5db199SXin Li
113*9c5db199SXin Li        See docstring of setPCAcontrol() in smogcheck_pca9555.py.
114*9c5db199SXin Li        """
115*9c5db199SXin Li        return self.pca_obj.setPCAcontrol('reset', turn_on=not(turn_on))
116*9c5db199SXin Li
117*9c5db199SXin Li    def TTCI_Set_PP_Control(self, turn_on):
118*9c5db199SXin Li        """De/activated TPM Physical Presence.
119*9c5db199SXin Li
120*9c5db199SXin Li        Args:
121*9c5db199SXin Li          turn_on: a boolean, on (true) = set bit to 1.
122*9c5db199SXin Li
123*9c5db199SXin Li        See docstring of setPCAcontrol() in smogcheck_pca9555.py.
124*9c5db199SXin Li        """
125*9c5db199SXin Li        return self.pca_obj.setPCAcontrol('pp', turn_on=turn_on)
126*9c5db199SXin Li
127*9c5db199SXin Li    def TTCI_Set_TPM_I2C_Control(self, turn_on):
128*9c5db199SXin Li        """Enable/Disable I2C communication with TPM.
129*9c5db199SXin Li
130*9c5db199SXin Li        Args:
131*9c5db199SXin Li          turn_on: a boolean, on (true) = set bit to 1.
132*9c5db199SXin Li
133*9c5db199SXin Li        See docstring of setPCAcontrol() in smogcheck_pca9555.py.
134*9c5db199SXin Li        """
135*9c5db199SXin Li        return self.pca_obj.setPCAcontrol('tpm_i2c', turn_on=turn_on)
136*9c5db199SXin Li
137*9c5db199SXin Li    def TTCI_Get_Main_Power_Status(self):
138*9c5db199SXin Li        """Checks bit value of Main Power.
139*9c5db199SXin Li
140*9c5db199SXin Li        See docstring of getPCAbitStatus() in smogcheck_pca9555.py.
141*9c5db199SXin Li        """
142*9c5db199SXin Li        return self.pca_obj.getPCAbitStatus('main_power')
143*9c5db199SXin Li
144*9c5db199SXin Li    def TTCI_Get_Backup_Power_Status(self):
145*9c5db199SXin Li        """Checks bit value of Backup Power.
146*9c5db199SXin Li
147*9c5db199SXin Li        See docstring of getPCAbitStatus() in smogcheck_pca9555.py.
148*9c5db199SXin Li        """
149*9c5db199SXin Li        return self.pca_obj.getPCAbitStatus('backup_power')
150*9c5db199SXin Li
151*9c5db199SXin Li    def TTCI_Get_PP_Status(self):
152*9c5db199SXin Li        """Checks bit value of Physical Presence.
153*9c5db199SXin Li
154*9c5db199SXin Li        See docstring of getPCAbitStatus() in smogcheck_pca9555.py.
155*9c5db199SXin Li        """
156*9c5db199SXin Li        return self.pca_obj.getPCAbitStatus('pp')
157*9c5db199SXin Li
158*9c5db199SXin Li    def TTCI_Get_TPM_I2C_Status(self):
159*9c5db199SXin Li        """Checks bit value of TPM I2C.
160*9c5db199SXin Li
161*9c5db199SXin Li        See docstring of getPCAbitStatus() in smogcheck_pca9555.py.
162*9c5db199SXin Li        """
163*9c5db199SXin Li        return self.pca_obj.getPCAbitStatus('tpm_i2c')
164*9c5db199SXin Li
165*9c5db199SXin Li    def TTCI_Set_LEDs(self, bit_value, failure, warning):
166*9c5db199SXin Li        """De/activates PCA9555 LEDs.
167*9c5db199SXin Li
168*9c5db199SXin Li        See docstring of setLEDs() in smogcheck_pca9555.py.
169*9c5db199SXin Li        """
170*9c5db199SXin Li        return self.pca_obj.setLEDs(bit_value, failure, warning)
171*9c5db199SXin Li
172*9c5db199SXin Li    def TTCI_Get_Switch_Status(self):
173*9c5db199SXin Li        """Checks status of DIP Switches (2-bit).
174*9c5db199SXin Li
175*9c5db199SXin Li        See docstring of getSwitchStatus() in smogcheck_pca9555.py.
176*9c5db199SXin Li        """
177*9c5db199SXin Li        return self.pca_obj.getSwitchStatus()
178*9c5db199SXin Li
179*9c5db199SXin Li    def TTCI_Get_LED_Status(self):
180*9c5db199SXin Li        """Checks LED status.
181*9c5db199SXin Li
182*9c5db199SXin Li        See docstring of getLEDstatus() in smogcheck_pca9555.py.
183*9c5db199SXin Li        """
184*9c5db199SXin Li        return self.pca_obj.getLEDstatus()
185*9c5db199SXin Li
186*9c5db199SXin Li
187*9c5db199SXin Lidef computeTimeElapsed(end, start):
188*9c5db199SXin Li    """Computes time difference in microseconds.
189*9c5db199SXin Li
190*9c5db199SXin Li    Args:
191*9c5db199SXin Li      end: a datetime.datetime() object, end timestamp.
192*9c5db199SXin Li      start: a datetime.datetime() object, start timestamp.
193*9c5db199SXin Li
194*9c5db199SXin Li    Returns:
195*9c5db199SXin Li      usec: an integer.
196*9c5db199SXin Li    """
197*9c5db199SXin Li    t = end - start
198*9c5db199SXin Li    usec = 1000000 * t.seconds + t.microseconds
199*9c5db199SXin Li    logging.info('Elapsed time = %d usec', usec)
200*9c5db199SXin Li    return usec
201