You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
6.4 KiB
201 lines
6.4 KiB
# Lint as: python2, python3
|
|
# 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(
|
|
node_addr=INA219_MPWR_SLV)
|
|
self.ina_backup_obj = smogcheck_ina219.InaController(
|
|
node_addr=INA219_BPWR_SLV)
|
|
except smogcheck_pca9555.PcaError as e:
|
|
raise TtciError('Error initialize PCA9555 module: %s' % e)
|
|
except smogcheck_ina219.InaError as 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
|