drivers: clock_control: nrf: Add clock status shell command
Added shell command to clock driver to get clock status. Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
parent
6f01c0bc79
commit
04e770b20c
2 changed files with 65 additions and 1 deletions
|
@ -21,6 +21,11 @@ menuconfig CLOCK_CONTROL_NRF
|
|||
|
||||
if CLOCK_CONTROL_NRF
|
||||
|
||||
config CLOCK_CONTROL_NRF_SHELL
|
||||
bool "Shell commands"
|
||||
depends on SHELL
|
||||
default y if SHELL
|
||||
|
||||
choice CLOCK_CONTROL_NRF_SOURCE
|
||||
prompt "32KHz clock source"
|
||||
default CLOCK_CONTROL_NRF_K32SRC_XTAL
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "nrf_clock_calibration.h"
|
||||
#include <logging/log.h>
|
||||
#include <hal/nrf_power.h>
|
||||
#include <shell/shell.h>
|
||||
|
||||
LOG_MODULE_REGISTER(clock_control, CONFIG_CLOCK_CONTROL_LOG_LEVEL);
|
||||
|
||||
|
@ -75,6 +76,8 @@ struct nrf_clock_control_config {
|
|||
};
|
||||
|
||||
static atomic_t hfclk_users;
|
||||
static uint64_t hf_start_tstamp;
|
||||
static uint64_t hf_stop_tstamp;
|
||||
|
||||
/* Return true if given event has enabled interrupt and is triggered. Event
|
||||
* is cleared.
|
||||
|
@ -241,11 +244,19 @@ static void lfclk_stop(void)
|
|||
|
||||
static void hfclk_start(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_CLOCK_CONTROL_NRF_SHELL)) {
|
||||
hf_start_tstamp = k_uptime_get();
|
||||
}
|
||||
|
||||
nrf_clock_task_trigger(NRF_CLOCK, NRF_CLOCK_TASK_HFCLKSTART);
|
||||
}
|
||||
|
||||
static void hfclk_stop(void)
|
||||
{
|
||||
if (IS_ENABLED(CONFIG_CLOCK_CONTROL_NRF_SHELL)) {
|
||||
hf_stop_tstamp = k_uptime_get();
|
||||
}
|
||||
|
||||
nrf_clock_event_clear(NRF_CLOCK, NRF_CLOCK_EVENT_HFCLKSTARTED);
|
||||
nrf_clock_task_trigger(NRF_CLOCK, NRF_CLOCK_TASK_HFCLKSTOP);
|
||||
}
|
||||
|
@ -657,3 +668,51 @@ void nrf5_power_usb_power_int_enable(bool enable)
|
|||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static int cmd_status(const struct shell *shell, size_t argc, char **argv)
|
||||
{
|
||||
nrf_clock_hfclk_t hfclk_src;
|
||||
bool hf_status;
|
||||
bool lf_status =
|
||||
nrf_clock_is_running(NRF_CLOCK, NRF_CLOCK_DOMAIN_LFCLK, NULL);
|
||||
struct onoff_manager *hf_mgr =
|
||||
get_onoff_manager(DEVICE_GET(clock_nrf),
|
||||
CLOCK_CONTROL_NRF_TYPE_HFCLK);
|
||||
struct onoff_manager *lf_mgr =
|
||||
get_onoff_manager(DEVICE_GET(clock_nrf),
|
||||
CLOCK_CONTROL_NRF_TYPE_LFCLK);
|
||||
uint32_t abs_start, abs_stop;
|
||||
int key = irq_lock();
|
||||
uint64_t now = k_uptime_get();
|
||||
|
||||
(void)nrf_clock_is_running(NRF_CLOCK, NRF_CLOCK_DOMAIN_HFCLK,
|
||||
(void *)&hfclk_src);
|
||||
hf_status = (hfclk_src == NRF_CLOCK_HFCLK_HIGH_ACCURACY);
|
||||
|
||||
abs_start = hf_start_tstamp;
|
||||
abs_stop = hf_stop_tstamp;
|
||||
irq_unlock(key);
|
||||
|
||||
shell_print(shell, "HF clock:");
|
||||
shell_print(shell, "\t- %srunning (users: %u)",
|
||||
hf_status ? "" : "not ", hf_mgr->refs);
|
||||
shell_print(shell, "\t- last start: %u ms (%u ms ago)",
|
||||
(uint32_t)abs_start, (uint32_t)(now - abs_start));
|
||||
shell_print(shell, "\t- last stop: %u ms (%u ms ago)",
|
||||
(uint32_t)abs_stop, (uint32_t)(now - abs_stop));
|
||||
shell_print(shell, "LF clock:");
|
||||
shell_print(shell, "\t- %srunning (users: %u)",
|
||||
lf_status ? "" : "not ", lf_mgr->refs);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
SHELL_STATIC_SUBCMD_SET_CREATE(subcmds,
|
||||
SHELL_CMD_ARG(status, NULL, "Status", cmd_status, 1, 0),
|
||||
SHELL_SUBCMD_SET_END
|
||||
);
|
||||
|
||||
SHELL_COND_CMD_REGISTER(CONFIG_CLOCK_CONTROL_NRF_SHELL,
|
||||
nrf_clock_control, &subcmds,
|
||||
"Clock control commmands",
|
||||
cmd_status);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue