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);
+}