| # Copyright (c) 2015 Stephen Warren | |
| # Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved. | |
| # | |
| # SPDX-License-Identifier: GPL-2.0 | |
| # Logic to interact with U-Boot running on real hardware, typically via a | |
| # physical serial port. | |
| import sys | |
| from u_boot_spawn import Spawn | |
| from u_boot_console_base import ConsoleBase | |
| class ConsoleExecAttach(ConsoleBase): | |
| """Represents a physical connection to a U-Boot console, typically via a | |
| serial port. This implementation executes a sub-process to attach to the | |
| console, expecting that the stdin/out of the sub-process will be forwarded | |
| to/from the physical hardware. This approach isolates the test infra- | |
| structure from the user-/installation-specific details of how to | |
| communicate with, and the identity of, serial ports etc.""" | |
| def __init__(self, log, config): | |
| """Initialize a U-Boot console connection. | |
| Args: | |
| log: A multiplexed_log.Logfile instance. | |
| config: A "configuration" object as defined in conftest.py. | |
| Returns: | |
| Nothing. | |
| """ | |
| # The max_fifo_fill value might need tweaking per-board/-SoC? | |
| # 1 would be safe anywhere, but is very slow (a pexpect issue?). | |
| # 16 is a common FIFO size. | |
| # HW flow control would mean this could be infinite. | |
| super(ConsoleExecAttach, self).__init__(log, config, max_fifo_fill=16) | |
| with self.log.section('flash'): | |
| self.log.action('Flashing U-Boot') | |
| cmd = ['u-boot-test-flash', config.board_type, config.board_identity] | |
| runner = self.log.get_runner(cmd[0], sys.stdout) | |
| runner.run(cmd) | |
| runner.close() | |
| self.log.status_pass('OK') | |
| def get_spawn(self): | |
| """Connect to a fresh U-Boot instance. | |
| The target board is reset, so that U-Boot begins running from scratch. | |
| Args: | |
| None. | |
| Returns: | |
| A u_boot_spawn.Spawn object that is attached to U-Boot. | |
| """ | |
| args = [self.config.board_type, self.config.board_identity] | |
| s = Spawn(['u-boot-test-console'] + args) | |
| try: | |
| self.log.action('Resetting board') | |
| cmd = ['u-boot-test-reset'] + args | |
| runner = self.log.get_runner(cmd[0], sys.stdout) | |
| runner.run(cmd) | |
| runner.close() | |
| except: | |
| s.close() | |
| raise | |
| return s |