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