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