Merge contributed patch to extend support of atxmega.
[bertos.git] / bertos / cpu / avr / drv / wdt_avr.h
index 109390eb0c93108eeae83b918798153947ebf6c3..816bb23664d935d91d55b98d7f1733d353e43505 100644 (file)
  *
  * \brief Watchdog interface for AVR architecture.
  *
- * \version $Id$
+ * \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).
+ *
  *
  * \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();
 }