dediprog.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # Copyright (c) 2017 Linaro Limited.
  2. # Copyright (c) 2019 Intel Corporation
  3. #
  4. # SPDX-License-Identifier: Apache-2.0
  5. '''Dediprog (dpcmd) flash only runner for SPI chips.'''
  6. import platform
  7. import subprocess
  8. from runners.core import ZephyrBinaryRunner, RunnerCaps
  9. DPCMD_EXE = 'dpcmd.exe' if platform.system() == 'Windows' else 'dpcmd'
  10. DEFAULT_MAX_RETRIES = 3
  11. class DediProgBinaryRunner(ZephyrBinaryRunner):
  12. '''Runner front-end for DediProg (dpcmd).'''
  13. def __init__(self, cfg, spi_image, vcc, retries):
  14. super().__init__(cfg)
  15. self.spi_image = spi_image
  16. self.vcc = vcc
  17. self.dpcmd_retries = retries
  18. @classmethod
  19. def name(cls):
  20. return 'dediprog'
  21. @classmethod
  22. def capabilities(cls):
  23. return RunnerCaps(commands={'flash'})
  24. @classmethod
  25. def do_add_parser(cls, parser):
  26. parser.add_argument('--spi-image', required=True,
  27. help='path to SPI image')
  28. parser.add_argument('--vcc',
  29. help='VCC (0=3.5V, 1=2.5V, 2=1.8V)')
  30. parser.add_argument('--retries', default=5,
  31. help='Number of retries (default 5)')
  32. @classmethod
  33. def do_create(cls, cfg, args):
  34. return DediProgBinaryRunner(cfg,
  35. spi_image=args.spi_image,
  36. vcc=args.vcc,
  37. retries=args.retries)
  38. def do_run(self, command, **kwargs):
  39. self.require(DPCMD_EXE)
  40. cmd_flash = [DPCMD_EXE, '--auto', self.spi_image]
  41. if self.vcc:
  42. cmd_flash.append('--vcc')
  43. cmd_flash.append(self.vcc)
  44. # Allow to flash images smaller than flash device capacity
  45. cmd_flash.append('-x')
  46. cmd_flash.append('ff')
  47. cmd_flash.append('--silent')
  48. cmd_flash.append('--verify')
  49. try:
  50. max_retries = int(self.dpcmd_retries)
  51. except ValueError:
  52. max_retries = DEFAULT_MAX_RETRIES
  53. retries = 0
  54. while retries <= max_retries:
  55. try:
  56. self.check_call(cmd_flash)
  57. except subprocess.CalledProcessError as cpe:
  58. retries += 1
  59. if retries > max_retries:
  60. raise cpe
  61. else:
  62. continue
  63. break