blob: ab6ec3ae006e6e44550fae36a5f8f05fabdcbaac [file] [log] [blame]
# 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