diff --git a/epicardium/main.c b/epicardium/main.c index fba57b110cd3ea8c322e4061622ec89b27949d08..9f0e725bbeba49d3531f7de474cce98525fa0c8e 100644 --- a/epicardium/main.c +++ b/epicardium/main.c @@ -104,6 +104,9 @@ int main(void) abort(); } + /* Watchdog petting */ + watchdog_clearer_init(); + LOG_DEBUG("startup", "Starting FreeRTOS ..."); vTaskStartScheduler(); diff --git a/epicardium/modules/hardware.c b/epicardium/modules/hardware.c index 01d76545607e64c0ea08cf48f1ebb578445e3d7b..f7cca08de3030dd8aaf2fd4f112f7bd7aa7d5487 100644 --- a/epicardium/modules/hardware.c +++ b/epicardium/modules/hardware.c @@ -20,6 +20,7 @@ #include "rtc.h" #include "spi.h" #include "trng.h" +#include "wdt.h" /* * Early init is called at the very beginning and is meant for modules which @@ -28,6 +29,23 @@ */ int hardware_early_init(void) { + /* + * Watchdog timer + */ + sys_cfg_wdt_t wdt_cfg = NULL; + WDT_Init(MXC_WDT0, wdt_cfg); + + if (WDT_GetResetFlag(MXC_WDT0)) { + WDT_ClearResetFlag(MXC_WDT0); + LOG_INFO("watchdog", "Reset due to watchdog timeout"); + } + + WDT_Enable(MXC_WDT0, 1); + WDT_SetResetPeriod( + MXC_WDT0, + WDT_PERIOD_2_27); /* Clocked by PCLK at 50MHz, reset at 2^27 ticks = 2.7 seconds */ + WDT_EnableReset(MXC_WDT0, 1); + /* * I2C bus for onboard peripherals (ie. PMIC, BMA400, BHI160, BME680, * ...) diff --git a/epicardium/modules/meson.build b/epicardium/modules/meson.build index dc2318359ecafaae8b78566b4ec87ecf891af44b..73975adceee81bb83894ecdd15784112ce1f3221 100644 --- a/epicardium/modules/meson.build +++ b/epicardium/modules/meson.build @@ -18,4 +18,5 @@ module_sources = files( 'stream.c', 'trng.c', 'vibra.c', + 'watchdog.c', ) diff --git a/epicardium/modules/modules.h b/epicardium/modules/modules.h index a6e2dd90bbb7105165b5444393628cedac914769..8760e691567f4e89e989cfe48d43d4c0d05cb77b 100644 --- a/epicardium/modules/modules.h +++ b/epicardium/modules/modules.h @@ -35,6 +35,9 @@ int personal_state_enabled(); /* ---------- PMIC --------------------------------------------------------- */ void vPmicTask(void *pvParameters); +/* ---------- Watchdog ----------------------------------------------------- */ +void watchdog_clearer_init(); + /* Critical battery voltage */ #define BATTERY_CRITICAL 3.40f diff --git a/epicardium/modules/watchdog.c b/epicardium/modules/watchdog.c new file mode 100644 index 0000000000000000000000000000000000000000..a538035d685673ff1e3976037211c1e8e766bb3c --- /dev/null +++ b/epicardium/modules/watchdog.c @@ -0,0 +1,28 @@ +#include "modules/log.h" +#include "modules/modules.h" + +#include "timers.h" +#include "mxc_sys.h" +#include "wdt.h" + +static TimerHandle_t clearer_timer; +static StaticTimer_t clearer_timer_buffer; +#define CLEAR_PERIOD pdMS_TO_TICKS(2000) + +static void watchdog_clearer_callback() +{ + WDT_ResetTimer(MXC_WDT0); +} + +void watchdog_clearer_init() +{ + clearer_timer = xTimerCreateStatic( + "watchdog_clearer_timer", + CLEAR_PERIOD, + pdTRUE, + NULL, + watchdog_clearer_callback, + &clearer_timer_buffer + ); + xTimerStart(clearer_timer, 0); +}