1*9c5db199SXin Li# Lint as: python2, python3 2*9c5db199SXin Li# Copyright 2021 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 Lifrom autotest_lib.server.cros.servo import chrome_cr50 7*9c5db199SXin Lifrom autotest_lib.client.common_lib import error 8*9c5db199SXin Li 9*9c5db199SXin Li 10*9c5db199SXin Liclass ChromeTi50(chrome_cr50.ChromeCr50): 11*9c5db199SXin Li """Manages control of a Chrome Ti50. 12*9c5db199SXin Li 13*9c5db199SXin Li We control the Chrome Ti50 via the console of a Servo board. Chrome Ti50 14*9c5db199SXin Li provides many interfaces to set and get its behavior via console commands. 15*9c5db199SXin Li This class is to abstract these interfaces. 16*9c5db199SXin Li """ 17*9c5db199SXin Li 18*9c5db199SXin Li WAKE_RESPONSE = ['(>|ti50_common)'] 19*9c5db199SXin Li START_STR = ['ti50_common'] 20*9c5db199SXin Li 21*9c5db199SXin Li # List of all ti50 ccd capabilities. Same order of 'ccd' output. 22*9c5db199SXin Li # This is not the same as cr50 list. 23*9c5db199SXin Li CAP_NAMES = [ 24*9c5db199SXin Li 'UartGscRxAPTx', 'UartGscTxAPRx', 'UartGscRxECTx', 'UartGscTxECRx', 25*9c5db199SXin Li 'UartGscRxFpmcuTx', 'UartGscTxFpmcuRx', 'FlashAP', 'FlashEC', 26*9c5db199SXin Li 'OverrideWP', 'RebootECAP', 'GscFullConsole', 'UnlockNoReboot', 27*9c5db199SXin Li 'UnlockNoShortPP', 'OpenNoTPMWipe', 'OpenNoLongPP', 28*9c5db199SXin Li 'BatteryBypassPP', 'I2C', 'FlashRead', 'OpenNoDevMode', 29*9c5db199SXin Li 'OpenFromUSB', 'OverrideBatt' 30*9c5db199SXin Li ] 31*9c5db199SXin Li # Ti50 only supports v2 32*9c5db199SXin Li AP_RO_VERSIONS = [2] 33*9c5db199SXin Li 34*9c5db199SXin Li def __init__(self, servo, faft_config): 35*9c5db199SXin Li """Initializes a ChromeCr50 object. 36*9c5db199SXin Li 37*9c5db199SXin Li @param servo: A servo object. 38*9c5db199SXin Li @param faft_config: A faft config object. 39*9c5db199SXin Li """ 40*9c5db199SXin Li super(ChromeTi50, self).__init__(servo, 'cr50_uart') 41*9c5db199SXin Li self.faft_config = faft_config 42*9c5db199SXin Li # Update CCD_FORMAT to use ti50 version of CAP_NAMES. 43*9c5db199SXin Li self.CCD_FORMAT['Capabilities'] = \ 44*9c5db199SXin Li '(Capabilities:.*(?P<Capabilities>%s))' % \ 45*9c5db199SXin Li (self.CAP_FORMAT.join(self.CAP_NAMES) + self.CAP_FORMAT) 46*9c5db199SXin Li 47*9c5db199SXin Li def set_ccd_level(self, level, password=''): 48*9c5db199SXin Li if level == 'unlock': 49*9c5db199SXin Li raise error.TestError( 50*9c5db199SXin Li "Ti50 does not support privilege level unlock") 51*9c5db199SXin Li super(ChromeTi50, self).set_ccd_level(level, password) 52*9c5db199SXin Li 53*9c5db199SXin Li def unlock_is_supported(self): 54*9c5db199SXin Li return False 55*9c5db199SXin Li 56*9c5db199SXin Li def check_boot_mode(self, mode_exp='NORMAL'): 57*9c5db199SXin Li """Query the Ti50 boot mode, and compare it against mode_exp. 58*9c5db199SXin Li 59*9c5db199SXin Li Args: 60*9c5db199SXin Li mode_exp: expected boot mode. It should be either 'NORMAL' 61*9c5db199SXin Li or 'NO_BOOT'. 62*9c5db199SXin Li Returns: 63*9c5db199SXin Li True if the boot mode matches mode_exp. 64*9c5db199SXin Li False, otherwise. 65*9c5db199SXin Li Raises: 66*9c5db199SXin Li TestError: Input parameter is not valid. 67*9c5db199SXin Li """ 68*9c5db199SXin Li 69*9c5db199SXin Li # Ti50 implements EFS 2.1, Cr50 implements EFS 2.0. This means 70*9c5db199SXin Li # 'NORMAL' is renamed to 'VERIFIED'. Ti50 also changes the case. 71*9c5db199SXin Li rv = self.send_command_retry_get_output('ec_comm', 72*9c5db199SXin Li [r'boot_mode\s*:\s*(Verified|NoBoot)'], safe=True) 73*9c5db199SXin Li if mode_exp == 'NORMAL': 74*9c5db199SXin Li return rv[0][1] == 'Verified' 75*9c5db199SXin Li elif mode_exp == 'NO_BOOT': 76*9c5db199SXin Li return rv[0][1] == 'NoBoot' 77*9c5db199SXin Li else: 78*9c5db199SXin Li raise error.TestError('parameter, mode_exp is not valid: %s' % 79*9c5db199SXin Li mode_exp) 80