From 358113b114886d560ea516e20b51d2d47f2a3582 Mon Sep 17 00:00:00 2001 From: Michael Hope Date: Sat, 1 Jun 2024 22:58:27 +0530 Subject: [PATCH] runners: add minichlink This commit adds a runner wrapper for the 'minichlink' program which offers a free, open mechanism to use the CH-LinkE programming dongle for the CH32V003. https://github.com/cnlohr/ch32v003fun/tree/master/minichlink Signed-off-by: Michael Hope Signed-off-by: Dhiru Kholia --- boards/common/minichlink.board.cmake | 5 ++ boards/wch/ch32v003evt/board.cmake | 3 + scripts/west_commands/runners/__init__.py | 1 + scripts/west_commands/runners/minichlink.py | 95 +++++++++++++++++++++ scripts/west_commands/tests/test_imports.py | 1 + 5 files changed, 105 insertions(+) create mode 100644 boards/common/minichlink.board.cmake create mode 100644 scripts/west_commands/runners/minichlink.py diff --git a/boards/common/minichlink.board.cmake b/boards/common/minichlink.board.cmake new file mode 100644 index 00000000000000..99f79da0ca0450 --- /dev/null +++ b/boards/common/minichlink.board.cmake @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Dhiru Kholia +# SPDX-License-Identifier: Apache-2.0 + +board_set_flasher_ifnset(minichlink) +board_finalize_runner_args(minichlink) diff --git a/boards/wch/ch32v003evt/board.cmake b/boards/wch/ch32v003evt/board.cmake index 835618aa42383c..1e0edfa18791eb 100644 --- a/boards/wch/ch32v003evt/board.cmake +++ b/boards/wch/ch32v003evt/board.cmake @@ -3,3 +3,6 @@ board_runner_args(openocd "--use-elf" "--cmd-reset-halt" "halt") include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) + +board_runner_args(minichlink) +include(${ZEPHYR_BASE}/boards/common/minichlink.board.cmake) diff --git a/scripts/west_commands/runners/__init__.py b/scripts/west_commands/runners/__init__.py index 6d5539905e334c..83d11f7ce1d07a 100644 --- a/scripts/west_commands/runners/__init__.py +++ b/scripts/west_commands/runners/__init__.py @@ -39,6 +39,7 @@ def _import_runner_module(runner_name): 'jlink', 'linkserver', 'mdb', + 'minichlink', 'misc', 'native', 'nios2', diff --git a/scripts/west_commands/runners/minichlink.py b/scripts/west_commands/runners/minichlink.py new file mode 100644 index 00000000000000..80d6b52180bb09 --- /dev/null +++ b/scripts/west_commands/runners/minichlink.py @@ -0,0 +1,95 @@ +# Copyright (c) 2024 Google LLC. +# +# SPDX-License-Identifier: Apache-2.0 + +"""WCH CH32V00x specific runner.""" + +import argparse + +from runners.core import ZephyrBinaryRunner, RunnerCaps, RunnerConfig + + +class MiniChLinkBinaryRunner(ZephyrBinaryRunner): + """Runner for CH32V00x based devices using minichlink.""" + + def __init__( + self, + cfg: RunnerConfig, + minichlink: str, + erase: bool, + reset: bool, + dt_flash: bool, + terminal: bool, + ): + super().__init__(cfg) + + self.minichlink = minichlink + self.erase = erase + self.reset = reset + self.dt_flash = dt_flash + self.terminal = terminal + + @classmethod + def name(cls): + return "minichlink" + + @classmethod + def capabilities(cls) -> RunnerCaps: + return RunnerCaps(commands={"flash"}, flash_addr=True, erase=True, reset=True) + + @classmethod + def do_add_parser(cls, parser: argparse.ArgumentParser): + parser.add_argument( + "--minichlink", default="minichlink", help="path to the minichlink binary" + ) + parser.add_argument( + "--terminal", + default=False, + action=argparse.BooleanOptionalAction, + help="open the terminal after flashing. Implies --reset.", + ) + parser.set_defaults(reset=True) + + @classmethod + def do_create(cls, cfg: RunnerConfig, args: argparse.Namespace): + return MiniChLinkBinaryRunner( + cfg, + minichlink=args.minichlink, + erase=args.erase, + reset=args.reset, + dt_flash=(args.dt_flash == "y"), + terminal=args.terminal, + ) + + def do_run(self, command: str, **kwargs): + self.require(self.minichlink) + + if command == "flash": + self.flash() + else: + raise ValueError("BUG: unhandled command f{command}") + + def flash(self): + self.ensure_output("bin") + + cmd = [self.minichlink, "-a"] + + if self.erase: + cmd.append("-E") + + flash_addr = 0 + if self.dt_flash: + flash_addr = self.flash_address_from_build_conf(self.build_conf) + + cmd.extend(["-w", self.cfg.bin_file or "", f"0x{flash_addr:x}"]) + + if self.reset or self.terminal: + cmd.append("-b") + + if self.terminal: + cmd.append("-T") + + if self.terminal: + self.check_call(cmd) + else: + self.check_output(cmd) diff --git a/scripts/west_commands/tests/test_imports.py b/scripts/west_commands/tests/test_imports.py index 42fb983586dfa0..381f51038a7503 100644 --- a/scripts/west_commands/tests/test_imports.py +++ b/scripts/west_commands/tests/test_imports.py @@ -30,6 +30,7 @@ def test_runner_imports(): 'linkserver', 'mdb-nsim', 'mdb-hw', + 'minichlink', 'misc-flasher', 'native', 'nios2',