You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.9 KiB
120 lines
2.9 KiB
# 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)
|
|
|