Add a basic RFP runner that supports the `flash` command targettting the Renesas Standard Boot Firmware. Signed-off-by: Peter Johanson <peter@peterjohanson.com>
121 lines
2.9 KiB
Python
121 lines
2.9 KiB
Python
# Copyright (c) 2025 Pete Johanson
|
|
#
|
|
# SPDX-License-Identifier: Apache-2.0
|
|
#
|
|
# pylint: disable=duplicate-code
|
|
|
|
'''Runner for rfp.'''
|
|
|
|
import platform
|
|
import re
|
|
|
|
from runners.core import RunnerCaps, ZephyrBinaryRunner
|
|
|
|
if platform.system() == 'Darwin':
|
|
DEFAULT_RFP_PORT = None
|
|
else:
|
|
DEFAULT_RFP_PORT = '/dev/ttyACM0'
|
|
|
|
|
|
def to_num(number):
|
|
dev_match = re.search(r"^\d*\+dev", number)
|
|
dev_version = dev_match is not None
|
|
|
|
num_match = re.search(r"^\d*", number)
|
|
num = int(num_match.group(0))
|
|
|
|
if dev_version:
|
|
num += 1
|
|
|
|
return num
|
|
|
|
|
|
class RfpBinaryRunner(ZephyrBinaryRunner):
|
|
'''Runner front-end for rfp.'''
|
|
|
|
def __init__(
|
|
self,
|
|
cfg,
|
|
rfp_cli='rfp-cli',
|
|
device=None,
|
|
erase=False,
|
|
verify=False,
|
|
port=DEFAULT_RFP_PORT,
|
|
speed=None,
|
|
):
|
|
super().__init__(cfg)
|
|
|
|
self.rfp_cmd = [rfp_cli]
|
|
self.verify = verify
|
|
self.erase = erase
|
|
self.port = port
|
|
self.device = device
|
|
self.speed = speed
|
|
|
|
@classmethod
|
|
def name(cls):
|
|
return 'rfp'
|
|
|
|
@classmethod
|
|
def capabilities(cls):
|
|
return RunnerCaps(commands={'flash'}, erase=True)
|
|
|
|
@classmethod
|
|
def do_add_parser(cls, parser):
|
|
parser.add_argument(
|
|
'--rfp-cli', default='rfp-cli', help='path to rfp-cli, default is rfp-cli'
|
|
)
|
|
parser.add_argument(
|
|
'--port',
|
|
default=DEFAULT_RFP_PORT,
|
|
help='serial port to use, default is ' + str(DEFAULT_RFP_PORT),
|
|
)
|
|
parser.add_argument('--device', help='Specify the device type to pass to rfp-cli')
|
|
parser.add_argument('--verify', action='store_true', help='if given, verify after flash')
|
|
parser.add_argument('--speed', help='Specify the serial port speed')
|
|
|
|
@classmethod
|
|
def do_create(cls, cfg, args):
|
|
return RfpBinaryRunner(
|
|
cfg,
|
|
rfp_cli=args.rfp_cli,
|
|
device=args.device,
|
|
port=args.port,
|
|
erase=args.erase,
|
|
speed=args.speed,
|
|
verify=args.verify,
|
|
)
|
|
|
|
def do_run(self, command, **kwargs):
|
|
if command == 'flash':
|
|
self.do_flash(**kwargs)
|
|
else:
|
|
self.logger.error("Unsuppported command")
|
|
|
|
def do_flash(self, **kwargs):
|
|
self.ensure_output('hex')
|
|
|
|
hex_name = self.cfg.hex_file
|
|
|
|
self.logger.info(f'Flashing file: {hex_name}')
|
|
|
|
load_image = ['-run']
|
|
if self.erase:
|
|
load_image += ['-erase']
|
|
else:
|
|
load_image += ['-noerase']
|
|
|
|
if self.verify:
|
|
load_image += ['-v']
|
|
|
|
# Load image
|
|
load_image += ['-p', '-file', hex_name]
|
|
|
|
port = ['-port', self.port]
|
|
if self.speed:
|
|
port += ['-s', self.speed]
|
|
device = ['-device', self.device]
|
|
|
|
cmd = self.rfp_cmd + port + device + load_image
|
|
self.check_call(cmd)
|