Merged from external project:
[bertos.git] / bertos / cpu / avr / drv / timer_avr.c
index 4fd82f53e9b888b06a03ea58c38b840592fae312..f20c913554712286e515a092f043abc1f0a16b39 100644 (file)
  *
  * \version $Id$
  *
- * \author Bernardo Innocenti <bernie@develer.com>
+ * \author Bernie Innocenti <bernie@codewiz.org>
  * \author Francesco Sacchi <batt@develer.com>
  *
  * \brief Low-level timer module for AVR (implementation).
+ *
+ * This module is automatically included so no need to include 
+ * in test list.
+ * notest: avr
  */
 
 #include <drv/timer_avr.h>
        #define BIT_OCIE2A OCIE2
 #endif
 
+#if CPU_AVR_ATMEGA128 || CPU_AVR_ATMEGA64 || CPU_AVR_ATMEGA103
+    /* These ATMega have different prescaler options. */
+    #define TIMER0_PRESCALER_64 BV(CS02)
+    #define TIMER2_PRESCALER_64 (BV(CS21) | BV(CS20))
+#else
+    #define TIMER0_PRESCALER_64 (BV(CS01) | BV(CS00))
+    #define TIMER2_PRESCALER_64 BV(CS22)
+#endif
 
 /** HW dependent timer initialization  */
 #if (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE0)
 
        static void timer_hw_init(void)
        {
-               cpuflags_t flags;
+               cpu_flags_t flags;
                IRQ_SAVE_DISABLE(flags);
 
                /* Reset Timer flags */
                ASSR = 0x00;                  /* Internal system clock */
                TCCR0 = BV(WGM01)             /* Clear on Compare match */
                        #if TIMER_PRESCALER == 64
-                               | BV(CS02)
+                               | TIMER0_PRESCALER_64
                        #else
                                #error Unsupported value of TIMER_PRESCALER
                        #endif
 
        static void timer_hw_init(void)
        {
-               cpuflags_t flags;
+               cpu_flags_t flags;
                IRQ_SAVE_DISABLE(flags);
 
                /* Reset Timer overflow flag */
 #elif (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE2)
        static void timer_hw_init(void)
        {
-               cpuflags_t flags;
+               cpu_flags_t flags;
                IRQ_SAVE_DISABLE(flags);
 
                /* Reset Timer flags */
 
                REG_TCCR2A = BV(WGM21);
                #if TIMER_PRESCALER == 64
-               #if CPU_AVR_ATMEGA1281 || CPU_AVR_ATMEGA168
-                       // ATMega1281 & ATMega168 have undocumented differences in timer2 prescaler!
-                       REG_TCCR2B |= BV(CS22);
-               #else
-                       REG_TCCR2B |= BV(CS21) | BV(CS20);
-               #endif
+                       REG_TCCR2B |= TIMER2_PRESCALER_64;
                #else
                        #error Unsupported value of TIMER_PRESCALER
                #endif
 
        static void timer_hw_init(void)
        {
-               cpuflags_t flags;
+               cpu_flags_t flags;
                IRQ_SAVE_DISABLE(flags);
 
                /* Reset Timer overflow flag */