Use avr libc for wdt cpu specific. Comply the wdt interface function. Clean code.
[bertos.git] / bertos / cpu / avr / drv / wdt_avr.h
index 109390eb0c93108eeae83b918798153947ebf6c3..0edb5d160756982747f970d5b44db13ddce5d0fa 100644 (file)
  *
  * \brief Watchdog interface for AVR architecture.
  *
+ * \note The AVR LibC already provvide the api to manange
+ * the watchdog on AVR architecture. In LibC also define several
+ * macro 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 definded to avr libc,
+ * we use it.
  */
-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();
 }