From a485d9636b7d100e8a38a9647e1a10e6f55b06d8 Mon Sep 17 00:00:00 2001 From: wangjianyu3 Date: Mon, 13 Oct 2025 16:49:39 +0800 Subject: [PATCH] system/nxinit: Add boot support for action Add support for booting a new application firmware image. Depends on `BOARDCTL_BOOT_IMAGE`. When the built-in boot command of nsh is enabled, the built-in boot command of Init will take precedence (see init_builtin_run()). To use the built-in boot command of nsh, use: `exec -- sh boot [args...]`. Referred to nshlib/nsh_syscmds.c: cmd_boot() Signed-off-by: wangjianyu3 --- system/nxinit/builtin.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/system/nxinit/builtin.c b/system/nxinit/builtin.c index 6da046b69..807bfb734 100644 --- a/system/nxinit/builtin.c +++ b/system/nxinit/builtin.c @@ -25,9 +25,11 @@ ****************************************************************************/ #include +#include #include #include #include +#include #include #include @@ -70,6 +72,10 @@ static int cmd_class_start(FAR struct action_manager_s *am, int argc, FAR char **argv); static int cmd_class_stop(FAR struct action_manager_s *am, int argc, FAR char **argv); +#ifdef CONFIG_BOARDCTL_BOOT_IMAGE +static int cmd_boot(FAR struct action_manager_s *am, + int argc, FAR char **argv); +#endif /**************************************************************************** * Private Data @@ -77,6 +83,9 @@ static int cmd_class_stop(FAR struct action_manager_s *am, static const struct cmd_map_s g_builtin[] = { +#ifdef CONFIG_BOARDCTL_BOOT_IMAGE + {"boot", 1, 3, cmd_boot}, +#endif {"class_start", 2, 2, cmd_class_start}, {"class_stop", 2, 2, cmd_class_stop}, {"exec", 3, 99, cmd_exec}, @@ -93,6 +102,32 @@ static const struct cmd_map_s g_builtin[] = * Private Functions ****************************************************************************/ +#ifdef CONFIG_BOARDCTL_BOOT_IMAGE +static int cmd_boot(FAR struct action_manager_s *am, + int argc, FAR char **argv) +{ + struct boardioc_boot_info_s info; + + UNUSED(am); + memset(&info, 0, sizeof(info)); + + if (argc > 1) + { + info.path = argv[1]; + } + + if (argc > 2) + { + info.header_size = strtoul(argv[2], NULL, 0); + } + + boardctl(BOARDIOC_BOOT_IMAGE, (uintptr_t)&info); + init_err("boot image '%s' %" PRIu32 "", info.path ? info.path : "", + info.header_size); + return -ENOENT; +} +#endif + static int cmd_class_start(FAR struct action_manager_s *am, int argc, FAR char **argv) {