# Copyright (c) 2017 Linaro Limited. # Copyright (c) 2019 Intel Corporation # # SPDX-License-Identifier: Apache-2.0 '''Dediprog (dpcmd) flash only runner for SPI chips.''' import platform import subprocess from runners.core import ZephyrBinaryRunner, RunnerCaps DPCMD_EXE = 'dpcmd.exe' if platform.system() == 'Windows' else 'dpcmd' DEFAULT_MAX_RETRIES = 3 class DediProgBinaryRunner(ZephyrBinaryRunner): '''Runner front-end for DediProg (dpcmd).''' def __init__(self, cfg, spi_image, vcc, retries): super().__init__(cfg) self.spi_image = spi_image self.vcc = vcc self.dpcmd_retries = retries @classmethod def name(cls): return 'dediprog' @classmethod def capabilities(cls): return RunnerCaps(commands={'flash'}) @classmethod def do_add_parser(cls, parser): parser.add_argument('--spi-image', required=True, help='path to SPI image') parser.add_argument('--vcc', help='VCC (0=3.5V, 1=2.5V, 2=1.8V)') parser.add_argument('--retries', default=5, help='Number of retries (default 5)') @classmethod def do_create(cls, cfg, args): return DediProgBinaryRunner(cfg, spi_image=args.spi_image, vcc=args.vcc, retries=args.retries) def do_run(self, command, **kwargs): self.require(DPCMD_EXE) cmd_flash = [DPCMD_EXE, '--auto', self.spi_image] if self.vcc: cmd_flash.append('--vcc') cmd_flash.append(self.vcc) # Allow to flash images smaller than flash device capacity cmd_flash.append('-x') cmd_flash.append('ff') cmd_flash.append('--silent') cmd_flash.append('--verify') try: max_retries = int(self.dpcmd_retries) except ValueError: max_retries = DEFAULT_MAX_RETRIES retries = 0 while retries <= max_retries: try: self.check_call(cmd_flash) except subprocess.CalledProcessError as cpe: retries += 1 if retries > max_retries: raise cpe else: continue break