|
|
|
/* watchdog.c */
|
|
|
|
|
|
|
|
#include "watchdog.h"
|
|
|
|
#include "panic.h"
|
|
|
|
#include "timer.h"
|
|
|
|
|
|
|
|
/* There are two watchdogs to worry about. The hardware one, and watchdogs
|
|
|
|
to make sure that critical parts of the software are running.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This is about 10 times round the main loop. If we haven't had a kick by
|
|
|
|
* now, something's gone horribly wrong.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define WATCHDOG_TIMEOUT (100 * TIMER0_MS)
|
|
|
|
|
|
|
|
static unsigned int watchdog_last_seen[WATCHDOG_MODULES];
|
|
|
|
|
|
|
|
void watchdog_kick(unsigned int module)
|
|
|
|
{
|
|
|
|
if (module >= WATCHDOG_MODULES)
|
|
|
|
return;
|
|
|
|
watchdog_last_seen[module] = timer_read();
|
|
|
|
}
|
|
|
|
|
|
|
|
void watchdog_check(void)
|
|
|
|
{
|
|
|
|
unsigned int time = timer_read();
|
|
|
|
int i;
|
|
|
|
|
|
|
|
/* XXX not yet */
|
|
|
|
return;
|
|
|
|
for (i = 0; i < WATCHDOG_MODULES; i++) {
|
|
|
|
if ((signed int)(watchdog_last_seen[i] + WATCHDOG_TIMEOUT
|
|
|
|
- time) < 0) {
|
|
|
|
panic(PANIC_WATCHDOG_TIMEOUT + i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void init_watchdog(void)
|
|
|
|
{
|
|
|
|
unsigned int time = timer_read();
|
|
|
|
int i;
|
|
|
|
|
|
|
|
for (i = 0; i < WATCHDOG_MODULES; i++) {
|
|
|
|
watchdog_last_seen[i] = time;
|
|
|
|
}
|
|
|
|
}
|