# Lint as: python2, python3 # Copyright 2021 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. from autotest_lib.server.cros.servo import chrome_cr50 from autotest_lib.client.common_lib import error class ChromeTi50(chrome_cr50.ChromeCr50): """Manages control of a Chrome Ti50. We control the Chrome Ti50 via the console of a Servo board. Chrome Ti50 provides many interfaces to set and get its behavior via console commands. This class is to abstract these interfaces. """ WAKE_RESPONSE = ['(>|ti50_common)'] START_STR = ['ti50_common'] # List of all ti50 ccd capabilities. Same order of 'ccd' output. # This is not the same as cr50 list. CAP_NAMES = [ 'UartGscRxAPTx', 'UartGscTxAPRx', 'UartGscRxECTx', 'UartGscTxECRx', 'UartGscRxFpmcuTx', 'UartGscTxFpmcuRx', 'FlashAP', 'FlashEC', 'OverrideWP', 'RebootECAP', 'GscFullConsole', 'UnlockNoReboot', 'UnlockNoShortPP', 'OpenNoTPMWipe', 'OpenNoLongPP', 'BatteryBypassPP', 'I2C', 'FlashRead', 'OpenNoDevMode', 'OpenFromUSB', 'OverrideBatt' ] # Ti50 only supports v2 AP_RO_VERSIONS = [2] def __init__(self, servo, faft_config): """Initializes a ChromeCr50 object. @param servo: A servo object. @param faft_config: A faft config object. """ super(ChromeTi50, self).__init__(servo, 'cr50_uart') self.faft_config = faft_config # Update CCD_FORMAT to use ti50 version of CAP_NAMES. self.CCD_FORMAT['Capabilities'] = \ '(Capabilities:.*(?P%s))' % \ (self.CAP_FORMAT.join(self.CAP_NAMES) + self.CAP_FORMAT) def set_ccd_level(self, level, password=''): if level == 'unlock': raise error.TestError( "Ti50 does not support privilege level unlock") super(ChromeTi50, self).set_ccd_level(level, password) def unlock_is_supported(self): return False def check_boot_mode(self, mode_exp='NORMAL'): """Query the Ti50 boot mode, and compare it against mode_exp. Args: mode_exp: expected boot mode. It should be either 'NORMAL' or 'NO_BOOT'. Returns: True if the boot mode matches mode_exp. False, otherwise. Raises: TestError: Input parameter is not valid. """ # Ti50 implements EFS 2.1, Cr50 implements EFS 2.0. This means # 'NORMAL' is renamed to 'VERIFIED'. Ti50 also changes the case. rv = self.send_command_retry_get_output('ec_comm', [r'boot_mode\s*:\s*(Verified|NoBoot)'], safe=True) if mode_exp == 'NORMAL': return rv[0][1] == 'Verified' elif mode_exp == 'NO_BOOT': return rv[0][1] == 'NoBoot' else: raise error.TestError('parameter, mode_exp is not valid: %s' % mode_exp)