1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- # 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
|