xref: /aosp_15_r20/external/autotest/server/cros/servo/chrome_ti50.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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