80 lines
3.0 KiB
Python
80 lines
3.0 KiB
Python
|
|
# 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<Capabilities>%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)
|