74414263123c9dbcdd838f6a460ea6b2e8d0ec24
[bertos.git] / bertos / cpu / avr / drv / timer_avr.h
1 /**
2  * \file
3  * <!--
4  * This file is part of BeRTOS.
5  *
6  * Bertos is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  * As a special exception, you may use this file as part of a free software
21  * library without restriction.  Specifically, if other files instantiate
22  * templates or use macros or inline functions from this file, or you compile
23  * this file and link it with other files to produce an executable, this
24  * file does not by itself cause the resulting executable to be covered by
25  * the GNU General Public License.  This exception does not however
26  * invalidate any other reasons why the executable file might be covered by
27  * the GNU General Public License.
28  *
29  * Copyright 2003, 2004, 2005 Develer S.r.l. (http://www.develer.com/)
30  * Copyright 2000 Bernardo Innocenti <bernie@develer.com>
31  *
32  * -->
33  *
34  * \version $Id$
35  *
36  * \author Bernardo Innocenti <bernie@develer.com>
37  * \author Francesco Sacchi <batt@develer.com>
38  *
39  * \brief Low-level timer module for AVR (interface).
40  */
41
42 /*#*
43  *#* $Log$
44  *#* Revision 1.32  2007/10/08 12:14:32  batt
45  *#* Fix some review issues.
46  *#*
47  *#* Revision 1.31  2007/10/07 12:30:55  batt
48  *#* Add default timer for AVR.
49  *#*
50  *#* Revision 1.30  2007/06/07 14:35:12  batt
51  *#* Merge from project_ks.
52  *#*
53  *#* Revision 1.29  2007/03/21 11:01:36  batt
54  *#* Add missing support for ATMega1281.
55  *#*
56  *#* Revision 1.28  2006/07/19 12:56:26  bernie
57  *#* Convert to new Doxygen style.
58  *#*
59  *#* Revision 1.27  2006/05/18 00:38:24  bernie
60  *#* Use hw_cpu.h instead of ubiquitous hw.h.
61  *#*
62  *#* Revision 1.26  2006/02/21 21:28:02  bernie
63  *#* New time handling based on TIMER_TICKS_PER_SEC to support slow timers with ticks longer than 1ms.
64  *#*
65  *#* Revision 1.25  2005/07/19 07:26:37  bernie
66  *#* Refactor to decouple timer ticks from milliseconds.
67  *#*
68  *#* Revision 1.24  2005/04/11 19:10:28  bernie
69  *#* Include top-level headers from cfg/ subdir.
70  *#*
71  *#* Revision 1.23  2005/03/01 23:24:51  bernie
72  *#* Tweaks for avr-libc 1.2.x.
73  *#*
74  *#* Revision 1.21  2004/12/13 12:07:06  bernie
75  *#* DISABLE_IRQSAVE/ENABLE_IRQRESTORE: Convert to IRQ_SAVE_DISABLE/IRQ_RESTORE.
76  *#*
77  *#* Revision 1.20  2004/11/16 20:59:46  bernie
78  *#* Include <avr/io.h> explicitly.
79  *#*
80  *#* Revision 1.19  2004/10/19 08:56:41  bernie
81  *#* TIMER_STROBE_ON, TIMER_STROBE_OFF, TIMER_STROBE_INIT: Move from timer_avr.h to timer.h, where they really belong.
82  *#*
83  *#* Revision 1.18  2004/09/20 03:31:03  bernie
84  *#* Fix racy racy code.
85  *#*/
86 #ifndef DRV_TIMER_AVR_H
87 #define DRV_TIMER_AVR_H
88
89 #include <appconfig.h>     /* CONFIG_TIMER */
90 #include <cfg/compiler.h>  /* uint8_t */
91 #include <cfg/macros.h>    /* DIV_ROUND */
92 #include <hw_cpu.h>        /* CLOCK_FREQ */
93
94 /**
95  * \name Values for CONFIG_TIMER.
96  *
97  * Select which hardware timer interrupt to use for system clock and softtimers.
98  * \note The timer 1 overflow mode set the timer as a 24 kHz PWM.
99  *
100  * \{
101  */
102 #define TIMER_ON_OUTPUT_COMPARE0  1
103 #define TIMER_ON_OVERFLOW1        2
104 #define TIMER_ON_OUTPUT_COMPARE2  3
105 #define TIMER_ON_OVERFLOW3        4
106
107 #define TIMER_DEFAULT TIMER_ON_OUTPUT_COMPARE0 ///< Default system timer
108 /* \} */
109
110 /*
111  * Hardware dependent timer initialization.
112  */
113 #if (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE0)
114
115         #define TIMER_PRESCALER      64
116         #define TIMER_HW_BITS        8
117         #define DEFINE_TIMER_ISR     SIGNAL(SIG_OUTPUT_COMPARE0)
118         #define TIMER_TICKS_PER_SEC  1000
119         #define TIMER_HW_CNT         OCR_DIVISOR
120
121         /// Type of time expressed in ticks of the hardware high-precision timer
122         typedef uint8_t hptime_t;
123
124 #elif (CONFIG_TIMER == TIMER_ON_OVERFLOW1)
125
126         #define TIMER_PRESCALER      1
127         #define TIMER_HW_BITS        8
128         /** This value is the maximum in overflow based timers. */
129         #define TIMER_HW_CNT         (1 << TIMER_HW_BITS)
130         #define DEFINE_TIMER_ISR     SIGNAL(SIG_OVERFLOW1)
131         #define TIMER_TICKS_PER_SEC  DIV_ROUND(TIMER_HW_HPTICKS_PER_SEC, TIMER_HW_CNT)
132
133         /// Type of time expressed in ticks of the hardware high precision timer
134         typedef uint16_t hptime_t;
135
136 #elif (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE2)
137
138         #define TIMER_PRESCALER      64
139         #define TIMER_HW_BITS        8
140         #if CPU_AVR_ATMEGA1281 || CPU_AVR_ATMEGA168
141                 #define DEFINE_TIMER_ISR     SIGNAL(SIG_OUTPUT_COMPARE2A)
142         #else
143                 #define DEFINE_TIMER_ISR     SIGNAL(SIG_OUTPUT_COMPARE2)
144         #endif
145         #define TIMER_TICKS_PER_SEC  1000
146         /** Value for OCR register in output-compare based timers. */
147         #define TIMER_HW_CNT         OCR_DIVISOR
148
149
150         /// Type of time expressed in ticks of the hardware high precision timer
151         typedef uint8_t hptime_t;
152
153 #elif (CONFIG_TIMER == TIMER_ON_OVERFLOW3)
154
155         #define TIMER_PRESCALER      1
156         #define TIMER_HW_BITS        8
157         /** This value is the maximum in overflow based timers. */
158         #define TIMER_HW_CNT         (1 << TIMER_HW_BITS)
159         #define DEFINE_TIMER_ISR     SIGNAL(SIG_OVERFLOW3)
160         #define TIMER_TICKS_PER_SEC  DIV_ROUND(TIMER_HW_HPTICKS_PER_SEC, TIMER_HW_CNT)
161
162         /// Type of time expressed in ticks of the hardware high precision timer
163         typedef uint16_t hptime_t;
164 #else
165
166         #error Unimplemented value for CONFIG_TIMER
167 #endif /* CONFIG_TIMER */
168
169
170 /** Frequency of the hardware high precision timer. */
171 #define TIMER_HW_HPTICKS_PER_SEC  DIV_ROUND(CLOCK_FREQ, TIMER_PRESCALER)
172
173 /**
174  * System timer: additional division after the prescaler
175  * 12288000 / 64 / 192 (0..191) = 1 ms
176  */
177 #define OCR_DIVISOR  (DIV_ROUND(DIV_ROUND(CLOCK_FREQ, TIMER_PRESCALER), TIMER_TICKS_PER_SEC) - 1)
178
179 /** Not needed, IRQ timer flag cleared automatically */
180 #define timer_hw_irq() do {} while (0)
181
182 /** Not needed, timer IRQ handler called only for timer source */
183 #define timer_hw_triggered() (true)
184
185
186 #endif /* DRV_TIMER_AVR_H */