diff --git a/nshlib/Kconfig b/nshlib/Kconfig index 2123c1bf3..1acad06f4 100644 --- a/nshlib/Kconfig +++ b/nshlib/Kconfig @@ -519,6 +519,11 @@ config NSH_DISABLE_READLINK default DEFAULT_SMALL depends on PSEUDOFS_SOFTLINKS +config NSH_DISABLE_BOOT + bool "Disable boot" + default DEFAULT_SMALL + depends on BOARDCTL_BOOT_IMAGE + config NSH_DISABLE_REBOOT bool "Disable reboot" default DEFAULT_SMALL diff --git a/nshlib/README.md b/nshlib/README.md index 336d72a69..8a4e6f4aa 100644 --- a/nshlib/README.md +++ b/nshlib/README.md @@ -1158,6 +1158,14 @@ system image. Show target of a soft link. +- `boot [ [
]]` + + Boot a new firmware image. This command depends on hardware support + CONFIG_BOARDCTL_BOOT_IMAGE. `` may point to a partion or file + which contain the firmware to boot. The optional, numeric argument + `
` may be useful for skipping metadata information preprended + to the firmware image. + - `reboot []` Reset and reboot the system immediately. This command depends on hardware diff --git a/nshlib/nsh.h b/nshlib/nsh.h index ddf294672..cfde18aca 100644 --- a/nshlib/nsh.h +++ b/nshlib/nsh.h @@ -1149,6 +1149,10 @@ int cmd_irqinfo(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv); int cmd_pmconfig(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv); #endif +#if defined(CONFIG_BOARDCTL_BOOT_IMAGE) && !defined(CONFIG_NSH_DISABLE_BOOT) + int cmd_boot(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv); +#endif + #if defined(CONFIG_BOARDCTL_RESET) && !defined(CONFIG_NSH_DISABLE_REBOOT) int cmd_reboot(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv); #endif diff --git a/nshlib/nsh_command.c b/nshlib/nsh_command.c index 79da9341d..36088210e 100644 --- a/nshlib/nsh_command.c +++ b/nshlib/nsh_command.c @@ -129,6 +129,10 @@ static const struct cmdmap_s g_cmdmap[] = { "basename", cmd_basename, 2, 3, " []" }, #endif +#if defined(CONFIG_BOARDCTL_BOOT_IMAGE) && !defined(CONFIG_NSH_DISABLE_BOOT) + { "boot", cmd_boot, 1, 3, "[ [
]]" }, +#endif + #if !defined(CONFIG_NSH_DISABLESCRIPT) && !defined(CONFIG_NSH_DISABLE_LOOPS) { "break", cmd_break, 1, 1, NULL }, #endif diff --git a/nshlib/nsh_syscmds.c b/nshlib/nsh_syscmds.c index 475483130..15fbc6ec3 100644 --- a/nshlib/nsh_syscmds.c +++ b/nshlib/nsh_syscmds.c @@ -165,7 +165,7 @@ int cmd_shutdown(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) #endif /* boardctl() will not return in any case. It if does, it means that - * there was a problem with the shutdown/resaet operation. + * there was a problem with the shutdown/reset operation. */ nsh_error(vtbl, g_fmtcmdfailed, argv[0], "boardctl", NSH_ERRNO); @@ -318,6 +318,52 @@ int cmd_poweroff(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) } #endif +/**************************************************************************** + * Name: cmd_boot + ****************************************************************************/ + +#if defined(CONFIG_BOARDCTL_BOOT_IMAGE) && !defined(CONFIG_NSH_DISABLE_BOOT) +int cmd_boot(FAR struct nsh_vtbl_s *vtbl, int argc, FAR char **argv) +{ + struct boardioc_boot_info_s info; + + memset(&info, 0, sizeof(info)); + + /* Invoke the BOARDIOC_BOOT_IMAGE board control to reset the board. If + * the board_boot_image() function returns, then it was not possible to + * boot the image due to some constraints. + */ + + switch (argc) + { + default: + info.header_size = strtoul(argv[2], NULL, 0); + + /* Go through */ + + case 1: + info.path = argv[1]; + + /* Go through */ + + case 0: + + /* Nothing to do */ + + break; + } + + boardctl(BOARDIOC_BOOT_IMAGE, (uintptr_t)&info); + + /* boardctl() will not return in this case. It if does, it means that + * there was a problem with the boot operation. + */ + + nsh_error(vtbl, g_fmtcmdfailed, argv[0], "boardctl", NSH_ERRNO); + return ERROR; +} +#endif + /**************************************************************************** * Name: cmd_reboot ****************************************************************************/