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