Fix some review issues.
[bertos.git] / drv / timer_avr.h
index 0ba8d52b0ce49db65cf5fae16fb0d009cad1833b..c4bff65dc6c041dc440225a872b3607ebff8408a 100755 (executable)
@@ -1,4 +1,4 @@
-/*!
+/**
  * \file
  * <!--
  * Copyright 2003, 2004, 2005 Develer S.r.l. (http://www.develer.com/)
 
 /*#*
  *#* $Log$
+ *#* Revision 1.32  2007/10/08 12:14:32  batt
+ *#* Fix some review issues.
+ *#*
+ *#* Revision 1.31  2007/10/07 12:30:55  batt
+ *#* Add default timer for AVR.
+ *#*
+ *#* Revision 1.30  2007/06/07 14:35:12  batt
+ *#* Merge from project_ks.
+ *#*
+ *#* Revision 1.29  2007/03/21 11:01:36  batt
+ *#* Add missing support for ATMega1281.
+ *#*
+ *#* Revision 1.28  2006/07/19 12:56:26  bernie
+ *#* Convert to new Doxygen style.
+ *#*
+ *#* Revision 1.27  2006/05/18 00:38:24  bernie
+ *#* Use hw_cpu.h instead of ubiquitous hw.h.
+ *#*
+ *#* Revision 1.26  2006/02/21 21:28:02  bernie
+ *#* New time handling based on TIMER_TICKS_PER_SEC to support slow timers with ticks longer than 1ms.
+ *#*
  *#* Revision 1.25  2005/07/19 07:26:37  bernie
  *#* Refactor to decouple timer ticks from milliseconds.
  *#*
 #ifndef DRV_TIMER_AVR_H
 #define DRV_TIMER_AVR_H
 
-#include <appconfig.h>  /* CONFIG_TIMER */
-#include <hw.h>
+#include <appconfig.h>     /* CONFIG_TIMER */
+#include <cfg/compiler.h>  /* uint8_t */
+#include <hw_cpu.h>        /* CLOCK_FREQ */
 
-/*!
- * Values for CONFIG_TIMER.
+/**
+ * \name Values for CONFIG_TIMER.
  *
  * Select which hardware timer interrupt to use for system clock and softtimers.
  * \note The timer 1 overflow mode set the timer as a 24 kHz PWM.
+ *
+ * \{
  */
 #define TIMER_ON_OUTPUT_COMPARE0  1
 #define TIMER_ON_OVERFLOW1        2
 #define TIMER_ON_OUTPUT_COMPARE2  3
 #define TIMER_ON_OVERFLOW3        4
 
-/*! HW dependent timer initialization  */
+#define TIMER_DEFAULT TIMER_ON_OUTPUT_COMPARE0 ///< Default system timer
+/* \} */
+
+/*
+ * Hardware dependent timer initialization.
+ */
 #if (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE0)
 
        #define TIMER_PRESCALER      64
        #define TIMER_HW_BITS        8
        #define DEFINE_TIMER_ISR     SIGNAL(SIG_OUTPUT_COMPARE0)
-       #define TIMER_TICKS_PER_MSEC 1
+       #define TIMER_TICKS_PER_SEC  1000
        #define TIMER_HW_CNT         OCR_DIVISOR
 
-       //! Type of time expressed in ticks of the hardware high-precision timer
+       /// Type of time expressed in ticks of the hardware high-precision timer
        typedef uint8_t hptime_t;
 
 #elif (CONFIG_TIMER == TIMER_ON_OVERFLOW1)
 
        #define TIMER_PRESCALER      1
        #define TIMER_HW_BITS        8
-       /*! This value is the maximum in overflow based timers. */
+       /** This value is the maximum in overflow based timers. */
        #define TIMER_HW_CNT         (1 << TIMER_HW_BITS)
        #define DEFINE_TIMER_ISR     SIGNAL(SIG_OVERFLOW1)
-       #define TIMER_TICKS_PER_MSEC (((TIMER_HW_HPTICKS_PER_SEC + TIMER_HW_CNT / 2) / TIMER_HW_CNT + 500) / 1000)
+       #define TIMER_TICKS_PER_SEC  ((TIMER_HW_HPTICKS_PER_SEC + TIMER_HW_CNT / 2) / TIMER_HW_CNT)
 
-       //! Type of time expressed in ticks of the hardware high precision timer
+       /// Type of time expressed in ticks of the hardware high precision timer
        typedef uint16_t hptime_t;
 
 #elif (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE2)
 
        #define TIMER_PRESCALER      64
        #define TIMER_HW_BITS        8
-       #define DEFINE_TIMER_ISR     SIGNAL(SIG_OUTPUT_COMPARE2)
-       #define TIMER_TICKS_PER_MSEC 1
-       /*! Value for OCR register in output-compare based timers. */
+       #if CPU_AVR_ATMEGA1281 || CPU_AVR_ATMEGA168
+               #define DEFINE_TIMER_ISR     SIGNAL(SIG_OUTPUT_COMPARE2A)
+       #else
+               #define DEFINE_TIMER_ISR     SIGNAL(SIG_OUTPUT_COMPARE2)
+       #endif
+       #define TIMER_TICKS_PER_SEC  1000
+       /** Value for OCR register in output-compare based timers. */
        #define TIMER_HW_CNT         OCR_DIVISOR
 
 
-       //! Type of time expressed in ticks of the hardware high precision timer
+       /// Type of time expressed in ticks of the hardware high precision timer
        typedef uint8_t hptime_t;
 
 #elif (CONFIG_TIMER == TIMER_ON_OVERFLOW3)
 
        #define TIMER_PRESCALER      1
        #define TIMER_HW_BITS        8
-       /*! This value is the maximum in overflow based timers. */
+       /** This value is the maximum in overflow based timers. */
        #define TIMER_HW_CNT         (1 << TIMER_HW_BITS)
        #define DEFINE_TIMER_ISR     SIGNAL(SIG_OVERFLOW3)
-       #define TIMER_TICKS_PER_MSEC (((TIMER_HW_HPTICKS_PER_SEC + TIMER_HW_CNT / 2) / TIMER_HW_CNT + 500) / 1000)
+       #define TIMER_TICKS_PER_SEC  ((TIMER_HW_HPTICKS_PER_SEC + TIMER_HW_CNT / 2) / TIMER_HW_CNT)
 
-       //! Type of time expressed in ticks of the hardware high precision timer
+       /// Type of time expressed in ticks of the hardware high precision timer
        typedef uint16_t hptime_t;
 #else
 
 #endif /* CONFIG_TIMER */
 
 
-/*! Frequency of the hardware high precision timer */
+/** Frequency of the hardware high precision timer. */
 #define TIMER_HW_HPTICKS_PER_SEC  ((CLOCK_FREQ + TIMER_PRESCALER / 2) / TIMER_PRESCALER)
 
-/*!
+/**
  * System timer: additional division after the prescaler
  * 12288000 / 64 / 192 (0..191) = 1 ms
  */
-#define OCR_DIVISOR  (((CLOCK_FREQ + TIMER_PRESCALER / 2) / TIMER_PRESCALER + TICKS_PER_SEC / 2) / TICKS_PER_SEC - 1) /* 191 */
+#define OCR_DIVISOR  (((CLOCK_FREQ + TIMER_PRESCALER / 2) / TIMER_PRESCALER + TIMER_TICKS_PER_SEC / 2) / TIMER_TICKS_PER_SEC - 1)
 
-/*! Not needed, IRQ timer flag cleared automatically */
+/** Not needed, IRQ timer flag cleared automatically */
 #define timer_hw_irq() do {} while (0)
 
+/** Not needed, timer IRQ handler called only for timer source */
+#define timer_hw_triggered() (true)
+
 
 #endif /* DRV_TIMER_AVR_H */