Move avr timer to avr cpu dir.
[bertos.git] / 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 <hw_cpu.h>        /* CLOCK_FREQ */
92
93 /**
94  * \name Values for CONFIG_TIMER.
95  *
96  * Select which hardware timer interrupt to use for system clock and softtimers.
97  * \note The timer 1 overflow mode set the timer as a 24 kHz PWM.
98  *
99  * \{
100  */
101 #define TIMER_ON_OUTPUT_COMPARE0  1
102 #define TIMER_ON_OVERFLOW1        2
103 #define TIMER_ON_OUTPUT_COMPARE2  3
104 #define TIMER_ON_OVERFLOW3        4
105
106 #define TIMER_DEFAULT TIMER_ON_OUTPUT_COMPARE0 ///< Default system timer
107 /* \} */
108
109 /*
110  * Hardware dependent timer initialization.
111  */
112 #if (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE0)
113
114         #define TIMER_PRESCALER      64
115         #define TIMER_HW_BITS        8
116         #define DEFINE_TIMER_ISR     SIGNAL(SIG_OUTPUT_COMPARE0)
117         #define TIMER_TICKS_PER_SEC  1000
118         #define TIMER_HW_CNT         OCR_DIVISOR
119
120         /// Type of time expressed in ticks of the hardware high-precision timer
121         typedef uint8_t hptime_t;
122
123 #elif (CONFIG_TIMER == TIMER_ON_OVERFLOW1)
124
125         #define TIMER_PRESCALER      1
126         #define TIMER_HW_BITS        8
127         /** This value is the maximum in overflow based timers. */
128         #define TIMER_HW_CNT         (1 << TIMER_HW_BITS)
129         #define DEFINE_TIMER_ISR     SIGNAL(SIG_OVERFLOW1)
130         #define TIMER_TICKS_PER_SEC  ((TIMER_HW_HPTICKS_PER_SEC + TIMER_HW_CNT / 2) / TIMER_HW_CNT)
131
132         /// Type of time expressed in ticks of the hardware high precision timer
133         typedef uint16_t hptime_t;
134
135 #elif (CONFIG_TIMER == TIMER_ON_OUTPUT_COMPARE2)
136
137         #define TIMER_PRESCALER      64
138         #define TIMER_HW_BITS        8
139         #if CPU_AVR_ATMEGA1281 || CPU_AVR_ATMEGA168
140                 #define DEFINE_TIMER_ISR     SIGNAL(SIG_OUTPUT_COMPARE2A)
141         #else
142                 #define DEFINE_TIMER_ISR     SIGNAL(SIG_OUTPUT_COMPARE2)
143         #endif
144         #define TIMER_TICKS_PER_SEC  1000
145         /** Value for OCR register in output-compare based timers. */
146         #define TIMER_HW_CNT         OCR_DIVISOR
147
148
149         /// Type of time expressed in ticks of the hardware high precision timer
150         typedef uint8_t hptime_t;
151
152 #elif (CONFIG_TIMER == TIMER_ON_OVERFLOW3)
153
154         #define TIMER_PRESCALER      1
155         #define TIMER_HW_BITS        8
156         /** This value is the maximum in overflow based timers. */
157         #define TIMER_HW_CNT         (1 << TIMER_HW_BITS)
158         #define DEFINE_TIMER_ISR     SIGNAL(SIG_OVERFLOW3)
159         #define TIMER_TICKS_PER_SEC  ((TIMER_HW_HPTICKS_PER_SEC + TIMER_HW_CNT / 2) / TIMER_HW_CNT)
160
161         /// Type of time expressed in ticks of the hardware high precision timer
162         typedef uint16_t hptime_t;
163 #else
164
165         #error Unimplemented value for CONFIG_TIMER
166 #endif /* CONFIG_TIMER */
167
168
169 /** Frequency of the hardware high precision timer. */
170 #define TIMER_HW_HPTICKS_PER_SEC  ((CLOCK_FREQ + TIMER_PRESCALER / 2) / TIMER_PRESCALER)
171
172 /**
173  * System timer: additional division after the prescaler
174  * 12288000 / 64 / 192 (0..191) = 1 ms
175  */
176 #define OCR_DIVISOR  (((CLOCK_FREQ + TIMER_PRESCALER / 2) / TIMER_PRESCALER + TIMER_TICKS_PER_SEC / 2) / TIMER_TICKS_PER_SEC - 1)
177
178 /** Not needed, IRQ timer flag cleared automatically */
179 #define timer_hw_irq() do {} while (0)
180
181 /** Not needed, timer IRQ handler called only for timer source */
182 #define timer_hw_triggered() (true)
183
184
185 #endif /* DRV_TIMER_AVR_H */