*
* \brief Watchdog interface for AVR architecture.
*
+ * \note The avr-libc already provide an api to manage the watchdog on AVR architecture.
+ * In avr-libc are also available several constants used to set the timeout value
+ * (see documentation for more detail).
+ *
* \version $Id$
*
* \author Daniele Basile <asterix@develer.com>
#include <cfg/compiler.h> // INLINE
#include <avr/io.h>
-
-#if CPU_AVR_ATMEGA1281
- #define WDT_CRTL_REG WDTCSR
-#else
- #define WDT_CRTL_REG WDTCR
-#endif
+#include <avr/wdt.h>
/**
* Reset the watchdog timer.
+ *
+ * This functions is already defind in avr-libc.
*/
-INLINE void wdt_reset(void)
-{
- __asm__ __volatile__ ("wdr");
-}
-
-INLINE void wdt_enable(bool flag)
-{
- IRQ_DISABLE;
- if (flag)
- {
- WDT_CRTL_REG |= BV(WDE);
- }
- else
- {
- WDT_CRTL_REG |= BV(WDCE) | BV(WDE);
- WDT_CRTL_REG &= ~BV(WDE);
- }
- IRQ_ENABLE;
-}
+// void wdt_reset(void)
/**
- * Set watchdog timeout.
+ * Start the watchdog timer that fire at the select
+ * timeout.
+ *
+ * \param _timeout you can use the macro that are defineded in
+ * avr/wdt.h.
+ *
+ * (from avr libc documentation)
+ * WDTO_15MS
+ * WDTO_30MS
+ * WDTO_60MS
+ * WDTO_120MS
+ * WDTO_250MS
+ * WDTO_500MS
+ * WDTO_1S
+ * WDTO_2S
+ * WDTO_4S
+ * WDTO_8S
*/
-INLINE void wdt_setTimeout(uint32_t timeout)
+INLINE void wdt_start(uint32_t _timeout)
{
- IRQ_DISABLE;
- wdt_reset();
- WDT_CRTL_REG |= BV(WDCE) | BV(WDE);
- WDT_CRTL_REG = timeout;
- IRQ_ENABLE;
+ uint8_t timeout = _timeout;
+
+ wdt_enable(timeout);
}
/**
- * Init watchdog timer.
+ * Stop watchdog timer.
*/
-INLINE void wdt_init(void)
+INLINE void wdt_stop(void)
{
- WDT_CRTL_REG |= BV(WDCE) | BV(WDE);
+ wdt_disable();
}