# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """A Python library to interact with TTCI module for TPM testing. Background - TTCI stands for TPM Test Controller Interface - TTCI is a custom-designed hardware board that can be used to test TPM module - TTCI board contains two modules: PCA9555 and INA219. This library provides methods to interact with these modules programmatically Dependency - This library depends on a new C shared library called "libsmogcheck.so". - In order to run test cases built using this API, one needs a TTCI board Notes: - An exception is raised if it doesn't make logical sense to continue program flow (e.g. I/O error prevents test case from executing) - An exception is caught and then converted to an error code if the caller expects to check for error code per API definition """ import logging from autotest_lib.client.common_lib import smogcheck_ina219, smogcheck_pca9555 # I2C slave addresses of INA219 module INA219_BPWR_SLV = 0x40 # Backup Power INA219_MPWR_SLV = 0x44 # Main Power class TtciError(Exception): """Base class for all errors in this module.""" class TtciController(object): """Object to control TTCI board used for TPM module testing.""" def __init__(self): """Constructor. Mandatory params: err: error string. ina_backup_obj: an instance of InaController (for Backup Power port of INA219 module). ina_main_obj: an instance of InaController (for Main Power port of INA219 module). pca_obj: an instance of PcaController. Raises: TtciError: if error initializing TTCI controller. """ self.err = None try: # Initialize PCA9555 module. self.pca_obj = smogcheck_pca9555.PcaController() # Initialize INA219 module. self.ina_main_obj = smogcheck_ina219.InaController( slave_addr=INA219_MPWR_SLV) self.ina_backup_obj = smogcheck_ina219.InaController( slave_addr=INA219_BPWR_SLV) except smogcheck_pca9555.PcaError, e: raise TtciError('Error initialize PCA9555 module: %s' % e) except smogcheck_ina219.InaError, e: raise TtciError('Error initialize INA219 module: %s' % e) def TTCI_Get_Main_Power_Metrics(self): """Gets voltage and current measurements from INA219 Main Power. See docstring of getPowerMetrics() in smogcheck_ina219.py. """ return self.ina_main_obj.getPowerMetrics() def TTCI_Get_Backup_Power_Metrics(self): """Gets voltage and current measurements from INA219 Backup Power. See docstring of getPowerMetrics() in smogcheck_ina219.py. """ return self.ina_backup_obj.getPowerMetrics() def TTCI_Set_Main_Power_Control(self, turn_on): """De/activated TPM Main Power. Args: turn_on: a boolean, on (true) = set bit to 1. See docstring of setPCAcontrol() in smogcheck_pca9555.py. """ return self.pca_obj.setPCAcontrol('main_power', turn_on=turn_on) def TTCI_Set_Backup_Power_Control(self, turn_on): """De/activated TPM Backup Power. Args: turn_on: a boolean, on (true) = set bit to 1. See docstring of setPCAcontrol() in smogcheck_pca9555.py. """ return self.pca_obj.setPCAcontrol('backup_power', turn_on=turn_on) def TTCI_Set_Reset_Control(self, turn_on): """De/activated TPM Reset. Exception note: for TPM Reset, true means setting bit value to 0 (not 1). Args: turn_on: a boolean, on (true) = set bit to 0. See docstring of setPCAcontrol() in smogcheck_pca9555.py. """ return self.pca_obj.setPCAcontrol('reset', turn_on=not(turn_on)) def TTCI_Set_PP_Control(self, turn_on): """De/activated TPM Physical Presence. Args: turn_on: a boolean, on (true) = set bit to 1. See docstring of setPCAcontrol() in smogcheck_pca9555.py. """ return self.pca_obj.setPCAcontrol('pp', turn_on=turn_on) def TTCI_Set_TPM_I2C_Control(self, turn_on): """Enable/Disable I2C communication with TPM. Args: turn_on: a boolean, on (true) = set bit to 1. See docstring of setPCAcontrol() in smogcheck_pca9555.py. """ return self.pca_obj.setPCAcontrol('tpm_i2c', turn_on=turn_on) def TTCI_Get_Main_Power_Status(self): """Checks bit value of Main Power. See docstring of getPCAbitStatus() in smogcheck_pca9555.py. """ return self.pca_obj.getPCAbitStatus('main_power') def TTCI_Get_Backup_Power_Status(self): """Checks bit value of Backup Power. See docstring of getPCAbitStatus() in smogcheck_pca9555.py. """ return self.pca_obj.getPCAbitStatus('backup_power') def TTCI_Get_PP_Status(self): """Checks bit value of Physical Presence. See docstring of getPCAbitStatus() in smogcheck_pca9555.py. """ return self.pca_obj.getPCAbitStatus('pp') def TTCI_Get_TPM_I2C_Status(self): """Checks bit value of TPM I2C. See docstring of getPCAbitStatus() in smogcheck_pca9555.py. """ return self.pca_obj.getPCAbitStatus('tpm_i2c') def TTCI_Set_LEDs(self, bit_value, failure, warning): """De/activates PCA9555 LEDs. See docstring of setLEDs() in smogcheck_pca9555.py. """ return self.pca_obj.setLEDs(bit_value, failure, warning) def TTCI_Get_Switch_Status(self): """Checks status of DIP Switches (2-bit). See docstring of getSwitchStatus() in smogcheck_pca9555.py. """ return self.pca_obj.getSwitchStatus() def TTCI_Get_LED_Status(self): """Checks LED status. See docstring of getLEDstatus() in smogcheck_pca9555.py. """ return self.pca_obj.getLEDstatus() def computeTimeElapsed(end, start): """Computes time difference in microseconds. Args: end: a datetime.datetime() object, end timestamp. start: a datetime.datetime() object, start timestamp. Returns: usec: an integer. """ t = end - start usec = 1000000 * t.seconds + t.microseconds logging.info('Elapsed time = %d usec', usec) return usec