diff --git a/nshlib/Kconfig b/nshlib/Kconfig index 24e42e5a2..665051bae 100644 --- a/nshlib/Kconfig +++ b/nshlib/Kconfig @@ -430,6 +430,11 @@ config NSH_DISABLE_PASSWD default y depends on NSH_LOGIN_PASSWD && FS_WRITABLE && !FSUTILS_PASSWD_READONLY +config NSH_DISABLE_PMCONFIG + bool "Disable pmconfig" + default n + depends on PM + config NSH_DISABLE_POWEROFF bool "Disable poweroff" default n if !DEFAULT_SMALL diff --git a/nshlib/nsh.h b/nshlib/nsh.h index 64e4a2a07..d3952bcac 100644 --- a/nshlib/nsh.h +++ b/nshlib/nsh.h @@ -1163,6 +1163,10 @@ int cmd_irqinfo(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); int cmd_poweroff(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); #endif +#if defined(CONFIG_PM) && !defined(CONFIG_NSH_DISABLE_PMCONFIG) +int cmd_pmconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); +#endif + #if defined(CONFIG_BOARDCTL_RESET) && !defined(CONFIG_NSH_DISABLE_REBOOT) int cmd_reboot(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); #endif diff --git a/nshlib/nsh_command.c b/nshlib/nsh_command.c index f04431f20..9db13dade 100644 --- a/nshlib/nsh_command.c +++ b/nshlib/nsh_command.c @@ -378,6 +378,10 @@ static const struct cmdmap_s g_cmdmap[] = # endif #endif +#if defined(CONFIG_PM) && !defined(CONFIG_NSH_DISABLE_PMCONFIG) + { "pmconfig", cmd_pmconfig, 1, 3, "[stay|relax] [normal|idle|standby|sleep]" }, +#endif + #if defined(CONFIG_BOARDCTL_POWEROFF) && !defined(CONFIG_NSH_DISABLE_POWEROFF) { "poweroff", cmd_poweroff, 1, 2, NULL }, #endif diff --git a/nshlib/nsh_syscmds.c b/nshlib/nsh_syscmds.c index 7bf89de02..8d19c4dde 100644 --- a/nshlib/nsh_syscmds.c +++ b/nshlib/nsh_syscmds.c @@ -181,6 +181,99 @@ int cmd_shutdown(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) } #endif /* CONFIG_BOARDCTL_POWEROFF && !CONFIG_NSH_DISABLE_SHUTDOWN */ +/**************************************************************************** + * Name: cmd_pmconfig + ****************************************************************************/ + +#if defined(CONFIG_PM) && !defined(CONFIG_NSH_DISABLE_PMCONFIG) +int cmd_pmconfig(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) +{ + struct boardioc_pm_ctrl_s ctrl = + { + }; + + if (argc == 1) + { + int current_state; + int normal_count; + int idle_count; + int standby_count; + int sleep_count; + + ctrl.action = BOARDIOC_PM_QUERYSTATE; + boardctl(BOARDIOC_PM_CONTROL, (uintptr_t)&ctrl); + current_state = ctrl.state; + + ctrl.action = BOARDIOC_PM_STAYCOUNT; + ctrl.state = PM_NORMAL; + boardctl(BOARDIOC_PM_CONTROL, (uintptr_t)&ctrl); + normal_count = ctrl.count; + + ctrl.state = PM_IDLE; + boardctl(BOARDIOC_PM_CONTROL, (uintptr_t)&ctrl); + idle_count = ctrl.count; + + ctrl.state = PM_STANDBY; + boardctl(BOARDIOC_PM_CONTROL, (uintptr_t)&ctrl); + standby_count = ctrl.count; + + ctrl.state = PM_SLEEP; + boardctl(BOARDIOC_PM_CONTROL, (uintptr_t)&ctrl); + sleep_count = ctrl.count; + + nsh_output(vtbl, "Current state %d, PM stay [%d, %d, %d, %d]\n", + current_state, normal_count, idle_count, standby_count, sleep_count); + } + else if (argc == 3) + { + if (strcmp(argv[1], "stay") == 0) + { + ctrl.action = BOARDIOC_PM_STAY; + } + else if (strcmp(argv[1], "relax") == 0) + { + ctrl.action = BOARDIOC_PM_RELAX; + } + else + { + nsh_output(vtbl, g_fmtarginvalid, argv[1]); + return ERROR; + } + + if (strcmp(argv[2], "normal") == 0) + { + ctrl.state = PM_NORMAL; + } + else if (strcmp(argv[2], "idle") == 0) + { + ctrl.state = PM_IDLE; + } + else if (strcmp(argv[2], "standby") == 0) + { + ctrl.state = PM_STANDBY; + } + else if (strcmp(argv[2], "sleep") == 0) + { + ctrl.state = PM_SLEEP; + } + else + { + nsh_output(vtbl, g_fmtarginvalid, argv[2]); + return ERROR; + } + + boardctl(BOARDIOC_PM_CONTROL, (uintptr_t)&ctrl); + } + else + { + nsh_error(vtbl, g_fmttoomanyargs, argv[0]); + return ERROR; + } + + return 0; +} +#endif + /**************************************************************************** * Name: cmd_poweroff ****************************************************************************/