2 #include <dev/watchdog.h> 8 #include <hal/nrf_wdt.h> 10 #define WATCHDOG_TIMEOUT_S 4 12 struct watchdog_state_t
18 static void watchdog_work_cb(
struct mwork_t *work);
20 static struct watchdog_state_t watchdog_state;
22 void watchdog_init(
void)
24 nrf_wdt_behaviour_set(NRF_WDT_BEHAVIOUR_PAUSE_SLEEP_HALT);
25 nrf_wdt_reload_value_set(32768UL * WATCHDOG_TIMEOUT_S - 1);
26 nrf_wdt_reload_request_enable(0);
27 nrf_wdt_int_enable(NRF_WDT_INT_TIMEOUT_MASK);
28 watchdog_state.work =
MWORK_INIT_TYPED(watchdog_state.work, watchdog_work_cb);
30 sd_nvic_ClearPendingIRQ(WDT_IRQn);
31 sd_nvic_SetPriority(WDT_IRQn, EVE_IRQ_PRIORITY_HIGH);
32 sd_nvic_EnableIRQ(WDT_IRQn);
35 void watchdog_start(
void)
37 nrf_wdt_task_trigger(NRF_WDT_TASK_START);
40 void watchdog_periodic(
void)
42 nrf_wdt_reload_request_set(0);
43 if (watchdog_state.dt)
46 watchdog_state.work.at =
mwork_now() + watchdog_state.dt;
51 extern void watchdog_stop_should_never_be_called(
void);
52 void watchdog_stop(
void)
54 watchdog_stop_should_never_be_called();
57 void watchdog_reboot(
void)
66 void watchdog_keepalive(uint32_t duty)
68 watchdog_state.dt = MS_TO_TICKS(1000 * WATCHDOG_TIMEOUT_S * 3 / 4) * duty;
72 watchdog_state.work.at =
mwork_now() + watchdog_state.dt;
81 static void watchdog_work_cb(
struct mwork_t *work)
86 void WDT_IRQHandler(
void)
__attribute__((section(".text"),interrupt));
87 void WDT_IRQHandler(
void)
Header file for the EVE millisecond-scale work scheduling.
Header file for the EVE power management framework.
static mwork_time_t mwork_now()
#define SWINT_AUTO_LOCK()
__attribute__((always_inline)) static inline void swint_enable_indirect_adapter(swint_state_t *state)
#define MWORK_INIT_TYPED(x, callback)
void mwork_schedule(struct mwork_t *work)
void mwork_cancel(struct mwork_t *work)