1 /* Copyright (c) 2007 Eric B. Weddington
2    All rights reserved.
3 
4    Redistribution and use in source and binary forms, with or without
5    modification, are permitted provided that the following conditions are met:
6 
7    * Redistributions of source code must retain the above copyright
8      notice, this list of conditions and the following disclaimer.
9 
10    * Redistributions in binary form must reproduce the above copyright
11      notice, this list of conditions and the following disclaimer in
12      the documentation and/or other materials provided with the
13      distribution.
14 
15    * Neither the name of the copyright holders nor the names of
16      contributors may be used to endorse or promote products derived
17      from this software without specific prior written permission.
18 
19   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29   POSSIBILITY OF SUCH DAMAGE. */
30 
31 /* $Id: common.h 2284 2012-01-06 11:58:44Z dmix $ */
32 
33 
34 #ifndef _AVR_COMMON_H
35 #define _AVR_COMMON_H
36 
37 #include <avr/sfr_defs.h>
38 
39 /*
40 This purpose of this header is to define registers that have not been
41 previously defined in the individual device IO header files, and to define
42 other symbols that are common across AVR device families.
43 
44 This file is designed to be included in <avr/io.h> after the individual
45 device IO header files, and after <avr/sfr_defs.h>
46 
47 */
48 
49 /*------------ Registers Not Previously Defined ------------*/
50 
51 /*
52 These are registers that are not previously defined in the individual
53 IO header files, OR they are defined here because they are used in parts of
54 avr-libc even if a device is not selected but a general architecture has
55 been selected.
56 */
57 
58 
59 /*
60 Stack pointer register.
61 
62 AVR architecture 1 has no RAM, thus no stack pointer.
63 
64 All other architectures do have a stack pointer.  Some devices have only
65 less than 256 bytes of possible RAM locations (128 Bytes of SRAM
66 and no option for external RAM), thus SPH is officially "reserved"
67 for them.
68 */
69 #if __AVR_ARCH__ >= 100
70 #  ifndef SPL
71 #    define SPL _SFR_MEM8(0x3D)
72 #  endif
73 #  ifndef SPH
74 #    define SPH _SFR_MEM8(0x3E)
75 #  endif
76 #  ifndef SP
77 #    define SP _SFR_MEM16(0x3D)
78 #  endif
79 #elif __AVR_ARCH__ != 1
80 #  ifndef SPL
81 #    define SPL _SFR_IO8(0x3D)
82 #  endif
83 #  if XRAMEND < 0x100 && !defined(__COMPILING_AVR_LIBC__)
84 #    ifndef SP
85 #      define SP  _SFR_IO8(0x3D)
86 #    endif
87 #  else
88 #    ifndef SP
89 #      define SP  _SFR_IO16(0x3D)
90 #    endif
91 #    ifndef SPH
92 #      define SPH _SFR_IO8(0x3E)
93 #    endif
94 #  endif /* XRAMEND < 0x100 && !defined(__COMPILING_AVR_LIBC__) */
95 #endif /* __AVR_ARCH__ != 1 */
96 
97 
98 /* Status Register */
99 #ifndef SREG
100 #  if __AVR_ARCH__ >= 100
101 #    define SREG _SFR_MEM8(0x3F)
102 #  else
103 #    define SREG _SFR_IO8(0x3F)
104 #  endif
105 #endif
106 
107 
108 /* SREG bit definitions */
109 #ifndef SREG_C
110 #  define SREG_C  (0)
111 #endif
112 #ifndef SREG_Z
113 #  define SREG_Z  (1)
114 #endif
115 #ifndef SREG_N
116 #  define SREG_N  (2)
117 #endif
118 #ifndef SREG_V
119 #  define SREG_V  (3)
120 #endif
121 #ifndef SREG_S
122 #  define SREG_S  (4)
123 #endif
124 #ifndef SREG_H
125 #  define SREG_H  (5)
126 #endif
127 #ifndef SREG_T
128 #  define SREG_T  (6)
129 #endif
130 #ifndef SREG_I
131 #  define SREG_I  (7)
132 #endif
133 
134 
135 #if defined(__COMPILING_AVR_LIBC__)
136 
137 /* AVR 6 Architecture */
138 #  if __AVR_ARCH__ == 6
139 #    ifndef EIND
140 #      define EIND  _SFR_IO8(0X3C)
141 #    endif
142 /* XMEGA Architectures */
143 #  elif __AVR_ARCH__ >= 100
144 #    ifndef EIND
145 #      define EIND  _SFR_MEM8(0x3C)
146 #    endif
147 #  endif
148 
149 /*
150 Only few devices come without EEPROM.  In order to assemble the
151 EEPROM library components without defining a specific device, we
152 keep the EEPROM-related definitions here.
153 */
154 
155 /* EEPROM Control Register */
156 #  ifndef EECR
157 #    define EECR   _SFR_IO8(0x1C)
158 #  endif
159 
160 /* EEPROM Data Register */
161 #  ifndef EEDR
162 #    define EEDR   _SFR_IO8(0x1D)
163 #  endif
164 
165 /* EEPROM Address Register */
166 #  ifndef EEAR
167 #    define EEAR   _SFR_IO16(0x1E)
168 #  endif
169 #  ifndef EEARL
170 #    define EEARL  _SFR_IO8(0x1E)
171 #  endif
172 #  ifndef EEARH
173 #    define EEARH  _SFR_IO8(0x1F)
174 #  endif
175 
176 /* EEPROM Control Register bits */
177 #  ifndef EERE
178 #    define EERE   (0)
179 #  endif
180 #  ifndef EEWE
181 #    define EEWE   (1)
182 #  endif
183 #  ifndef EEMWE
184 #    define EEMWE  (2)
185 #  endif
186 #  ifndef EERIE
187 #    define EERIE  (3)
188 #  endif
189 
190 
191 /* RAM Page Z Select Register	*/
192 #ifndef RAMPZ
193 #  if     defined(__AVR_HAVE_RAMPZ__) && __AVR_HAVE_RAMPZ__
194 #    if     __AVR_ARCH__ >= 100
195 #      define RAMPZ	_SFR_MEM8(0x3B)
196 #    else
197 #      define RAMPZ	_SFR_IO8(0x3B)
198 #    endif
199 #  endif
200 #endif
201 
202 #endif /* __COMPILING_AVR_LIBC__ */
203 
204 
205 
206 /*------------ Common Symbols ------------*/
207 
208 /*
209 Generic definitions for registers that are common across multiple AVR devices
210 and families.
211 */
212 
213 /* Pointer registers definitions */
214 #if __AVR_ARCH__ != 1  /* avr1 does not have X and Y pointers */
215 #  define XL  r26
216 #  define XH  r27
217 #  define YL  r28
218 #  define YH  r29
219 #endif /* #if __AVR_ARCH__ != 1 */
220 #define ZL  r30
221 #define ZH  r31
222 
223 
224 /* Status Register */
225 #if defined(SREG)
226 #  define AVR_STATUS_REG   SREG
227 #  if __AVR_ARCH__ >= 100
228 #    define AVR_STATUS_ADDR  _SFR_MEM_ADDR(SREG)
229 #  else
230 #    define AVR_STATUS_ADDR  _SFR_IO_ADDR(SREG)
231 #  endif
232 #endif
233 
234 /* Stack Pointer (combined) Register */
235 #if defined(SP)
236 #  define AVR_STACK_POINTER_REG   SP
237 #  if __AVR_ARCH__ >= 100
238 #    define AVR_STACK_POINTER_ADDR  _SFR_MEM_ADDR(SP)
239 #  else
240 #    define AVR_STACK_POINTER_ADDR  _SFR_IO_ADDR(SP)
241 #  endif
242 #endif
243 
244 /* Stack Pointer High Register */
245 #if defined(SPH)
246 #  define _HAVE_AVR_STACK_POINTER_HI 1
247 #  define AVR_STACK_POINTER_HI_REG   SPH
248 #  if __AVR_ARCH__ >= 100
249 #    define AVR_STACK_POINTER_HI_ADDR  _SFR_MEM_ADDR(SPH)
250 #  else
251 #    define AVR_STACK_POINTER_HI_ADDR  _SFR_IO_ADDR(SPH)
252 #  endif
253 #endif
254 
255 /* Stack Pointer Low Register */
256 #if defined(SPL)
257 #  define AVR_STACK_POINTER_LO_REG   SPL
258 #  if __AVR_ARCH__ >= 100
259 #    define AVR_STACK_POINTER_LO_ADDR  _SFR_MEM_ADDR(SPL)
260 #  else
261 #    define AVR_STACK_POINTER_LO_ADDR  _SFR_IO_ADDR(SPL)
262 #  endif
263 #endif
264 
265 /* RAMPD Register */
266 #if defined(RAMPD)
267 #  define AVR_RAMPD_REG   RAMPD
268 #  if __AVR_ARCH__ >= 100
269 #    define AVR_RAMPD_ADDR  _SFR_MEM_ADDR(RAMPD)
270 #  else
271 #    define AVR_RAMPD_ADDR  _SFR_IO_ADDR(RAMPD)
272 #  endif
273 #endif
274 
275 /* RAMPX Register */
276 #if defined(RAMPX)
277 #  define AVR_RAMPX_REG   RAMPX
278 #  if __AVR_ARCH__ >= 100
279 #    define AVR_RAMPX_ADDR  _SFR_MEM_ADDR(RAMPX)
280 #  else
281 #    define AVR_RAMPX_ADDR  _SFR_IO_ADDR(RAMPX)
282 #  endif
283 #endif
284 
285 /* RAMPY Register */
286 #if defined(RAMPY)
287 #  define AVR_RAMPY_REG   RAMPY
288 #  if __AVR_ARCH__ >= 100
289 #    define AVR_RAMPY_ADDR  _SFR_MEM_ADDR(RAMPY)
290 #  else
291 #    define AVR_RAMPY_ADDR  _SFR_IO_ADDR(RAMPY)
292 #  endif
293 #endif
294 
295 /* RAMPZ Register */
296 #if defined(RAMPZ)
297 #  define AVR_RAMPZ_REG   RAMPZ
298 #  if __AVR_ARCH__ >= 100
299 #    define AVR_RAMPZ_ADDR  _SFR_MEM_ADDR(RAMPZ)
300 #  else
301 #    define AVR_RAMPZ_ADDR  _SFR_IO_ADDR(RAMPZ)
302 #  endif
303 #endif
304 
305 /* Extended Indirect Register */
306 #if defined(EIND)
307 #  define AVR_EXTENDED_INDIRECT_REG   EIND
308 #  if __AVR_ARCH__ >= 100
309 #    define AVR_EXTENDED_INDIRECT_ADDR  _SFR_MEM_ADDR(EIND)
310 #  else
311 #    define AVR_EXTENDED_INDIRECT_ADDR  _SFR_IO_ADDR(EIND)
312 #  endif
313 #endif
314 
315 /*------------ Workaround to old compilers (4.1.2 and earlier)  ------------*/
316 
317 #ifndef __AVR_HAVE_MOVW__
318 # if  defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
319 #  define __AVR_HAVE_MOVW__ 1
320 # endif
321 #endif
322 
323 #ifndef __AVR_HAVE_LPMX__
324 # if  defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
325 #  define __AVR_HAVE_LPMX__ 1
326 # endif
327 #endif
328 
329 #ifndef __AVR_HAVE_MUL__
330 # if  defined(__AVR_ENHANCED__) && __AVR_ENHANCED__
331 #  define __AVR_HAVE_MUL__ 1
332 # endif
333 #endif
334 
335 #endif /* _AVR_COMMON_H */
336