source: rtems/cpukit/score/cpu/avr/avr/eeprom.h @ b10825c

4.115
Last change on this file since b10825c was b10825c, checked in by Joel Sherrill <joel.sherrill@…>, on 01/10/13 at 19:29:41

cpukit: Add EOL on files missing EOL at EOF

  • Property mode set to 100644
File size: 20.4 KB
Line 
1/**
2 * @file
3 *
4 * @brief Data EEPROM Contained in the AVR Microcontrollers
5 *
6 * This header file declares the interface to some simple library
7 * routines suitable for handling the data EEPROM contained in the
8 * AVR microcontrollers.  The implementation uses a simple polled
9 * mode interface.  Applications that require interrupt-controlled
10 * EEPROM access to ensure that no time will be wasted in spinloops
11 * will have to deploy their own implementation.
12 *
13 *  \par Notes:
14 *
15 *  - In addition to the write functions there is a set of update ones.
16 *  This functions read each byte first and skip the burning if the
17 *  old value is the same with new.  The scaning direction is from
18 *  high address to low, to obtain quick return in common cases.
19 *
20 *  - All of the read/write functions first make sure the EEPROM is
21 *  ready to be accessed.  Since this may cause long delays if a
22 *  write operation is still pending, time-critical applications
23 *  should first poll the EEPROM e. g. using eeprom_is_ready() before
24 *  attempting any actual I/O.  But this functions are not wait until
25 *  SELFPRGEN in SPMCSR becomes zero.  Do this manually, if your
26 *  softwate contains the Flash burning.
27 *
28 *  - As these functions modify IO registers, they are known to be
29 *  non-reentrant.  If any of these functions are used from both,
30 *  standard and interrupt context, the applications must ensure
31 *  proper protection (e.g. by disabling interrupts before accessing
32 *  them).
33 *
34 *  - All write functions force erase_and_write programming mode.
35 *
36 *  - For Xmega the EEPROM start address is 0, like other architectures.
37 *  The reading functions add the 0x2000 value to use EEPROM mapping into
38 *  data space.
39 */
40
41/*
42 * Copyright (c) 2002, 2003, 2004, 2007 Marek Michalkiewicz
43 * Copyright (c) 2005, 2006 Bjoern Haase
44 * Copyright (c) 2008 Atmel Corporation
45 * Copyright (c) 2008 Wouter van Gulik
46 * Copyright (c) 2009 Dmitry Xmelkov
47 * All rights reserved.
48 *
49 *  Redistribution and use in source and binary forms, with or without
50 *  modification, are permitted provided that the following conditions are met:
51 *
52 *  * Redistributions of source code must retain the above copyright
53 *    notice, this list of conditions and the following disclaimer.
54 *
55 *  * Redistributions in binary form must reproduce the above copyright
56 *    notice, this list of conditions and the following disclaimer in
57 *    the documentation and/or other materials provided with the
58 *    distribution.
59 *
60 *  * Neither the name of the copyright holders nor the names of
61 *    contributors may be used to endorse or promote products derived
62 *    from this software without specific prior written permission.
63 *
64 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
65 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
66 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
67 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
68 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
69 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
70 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
71 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
72 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
73 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
74 * POSSIBILITY OF SUCH DAMAGE.
75 */
76
77
78#ifndef _AVR_EEPROM_H_
79#define _AVR_EEPROM_H_ 1
80
81#include <avr/io.h>
82
83#if !E2END && !defined(__DOXYGEN__) && !defined(__COMPILING_AVR_LIBC__)
84# warning "Device does not have EEPROM available."
85#else
86
87#ifndef __DOXYGEN__
88
89#if defined (__AVR_AT94K__)
90# define _EEPROM_SUFFIX _at94k
91#elif defined (__AVR_AT43USB320__)
92# define _EEPROM_SUFFIX _43u320
93#elif defined (__AVR_AT43USB355__)
94# define _EEPROM_SUFFIX _43u355
95#elif defined (__AVR_AT76C711__)
96# define _EEPROM_SUFFIX _76c711
97#elif defined (__AVR_AT86RF401__)
98# define _EEPROM_SUFFIX _86r401
99#elif defined (__AVR_AT90PWM1__)
100# define _EEPROM_SUFFIX _90pwm1
101#elif defined (__AVR_AT90PWM2__)
102# define _EEPROM_SUFFIX _90pwm2
103#elif defined (__AVR_AT90PWM2B__)
104# define _EEPROM_SUFFIX _90pwm2b
105#elif defined (__AVR_AT90PWM3__)
106# define _EEPROM_SUFFIX _90pwm3
107#elif defined (__AVR_AT90PWM3B__)
108# define _EEPROM_SUFFIX _90pwm3b
109#elif defined (__AVR_AT90PWM216__)
110# define _EEPROM_SUFFIX _90pwm216
111#elif defined (__AVR_AT90PWM316__)
112# define _EEPROM_SUFFIX _90pwm316
113#elif defined (__AVR_AT90PWM81__)
114# define _EEPROM_SUFFIX _90pwm81
115#elif defined (__AVR_ATmega16M1__)
116# define _EEPROM_SUFFIX  _m16m1
117#elif defined (__AVR_ATmega8U2__)
118# define _EEPROM_SUFFIX  _m8u2
119#elif defined (__AVR_ATmega16U2__)
120# define _EEPROM_SUFFIX  _m16u2
121#elif defined (__AVR_ATmega16U4__)
122# define _EEPROM_SUFFIX  _m16u4
123#elif defined (__AVR_ATmega32C1__)
124# define _EEPROM_SUFFIX  _m32c1
125#elif defined (__AVR_ATmega32M1__)
126# define _EEPROM_SUFFIX  _m32m1
127#elif defined (__AVR_ATmega32U2__)
128# define _EEPROM_SUFFIX  _m32u2
129#elif defined (__AVR_ATmega32U4__)
130# define _EEPROM_SUFFIX  _m32u4
131#elif defined (__AVR_ATmega32U6__)
132# define _EEPROM_SUFFIX  _m32u6
133#elif defined (__AVR_ATmega64C1__)
134# define _EEPROM_SUFFIX  _m64c1
135#elif defined (__AVR_ATmega64M1__)
136# define _EEPROM_SUFFIX  _m64m1
137#elif defined (__AVR_ATmega128__)
138# define _EEPROM_SUFFIX  _m128
139#elif defined (__AVR_ATmega1280__)
140# define _EEPROM_SUFFIX  _m1280
141#elif defined (__AVR_ATmega1281__)
142# define _EEPROM_SUFFIX  _m1281
143#elif defined (__AVR_ATmega1284P__)
144# define _EEPROM_SUFFIX  _m1284p
145#elif defined (__AVR_ATmega128RFA1__)
146# define _EEPROM_SUFFIX  _m128rfa1
147#elif defined (__AVR_ATmega2560__)
148# define _EEPROM_SUFFIX  _m2560
149#elif defined (__AVR_ATmega2561__)
150# define _EEPROM_SUFFIX  _m2561
151#elif defined (__AVR_AT90CAN32__)
152# define _EEPROM_SUFFIX _can32
153#elif defined (__AVR_AT90CAN64__)
154# define _EEPROM_SUFFIX _can64
155#elif defined (__AVR_AT90CAN128__)
156# define _EEPROM_SUFFIX _can128
157#elif defined (__AVR_AT90USB82__)
158# define _EEPROM_SUFFIX _usb82
159#elif defined (__AVR_AT90USB162__)
160# define _EEPROM_SUFFIX _usb162
161#elif defined (__AVR_AT90USB646__)
162# define _EEPROM_SUFFIX _usb646
163#elif defined (__AVR_AT90USB647__)
164# define _EEPROM_SUFFIX _usb647
165#elif defined (__AVR_AT90USB1286__)
166# define _EEPROM_SUFFIX _usb1286
167#elif defined (__AVR_AT90USB1287__)
168# define _EEPROM_SUFFIX _usb1287
169#elif defined (__AVR_ATmega64__)
170# define _EEPROM_SUFFIX  _m64
171#elif defined (__AVR_ATmega640__)
172# define _EEPROM_SUFFIX  _m640
173#elif defined (__AVR_ATmega644__)
174# define _EEPROM_SUFFIX  _m644
175#elif defined (__AVR_ATmega644A__)
176# define _EEPROM_SUFFIX  _m644a
177#elif defined (__AVR_ATmega644P__)
178# define _EEPROM_SUFFIX  _m644p
179#elif defined (__AVR_ATmega644PA__)
180# define _EEPROM_SUFFIX  _m644pa
181#elif defined (__AVR_ATmega645__)
182# define _EEPROM_SUFFIX  _m645
183#elif defined (__AVR_ATmega645A__)
184# define _EEPROM_SUFFIX  _m645a
185#elif defined (__AVR_ATmega645P__)
186# define _EEPROM_SUFFIX  _m645p
187#elif defined (__AVR_ATmega6450__)
188# define _EEPROM_SUFFIX  _m6450
189#elif defined (__AVR_ATmega6450A__)
190# define _EEPROM_SUFFIX  _m6450a
191#elif defined (__AVR_ATmega6450P__)
192# define _EEPROM_SUFFIX  _m6450p
193#elif defined (__AVR_ATmega649__)
194# define _EEPROM_SUFFIX  _m649
195#elif defined (__AVR_ATmega649A__)
196# define _EEPROM_SUFFIX  _m649a
197#elif defined (__AVR_ATmega649P__)
198# define _EEPROM_SUFFIX  _m649p
199#elif defined (__AVR_ATmega6490__)
200# define _EEPROM_SUFFIX  _m6490
201#elif defined (__AVR_ATmega6490A__)
202# define _EEPROM_SUFFIX  _m6490a
203#elif defined (__AVR_ATmega6490P__)
204# define _EEPROM_SUFFIX  _m6490p
205#elif defined (__AVR_ATmega103__)
206# define _EEPROM_SUFFIX  _m103
207#elif defined (__AVR_ATmega32__)
208# define _EEPROM_SUFFIX  _m32
209#elif defined (__AVR_ATmega323__)
210# define _EEPROM_SUFFIX  _m323
211#elif defined (__AVR_ATmega324A__)
212# define _EEPROM_SUFFIX  _m324a
213#elif defined (__AVR_ATmega324P__)
214# define _EEPROM_SUFFIX  _m324p
215#elif defined (__AVR_ATmega324PA__)
216# define _EEPROM_SUFFIX  _m324pa
217#elif defined (__AVR_ATmega325__)
218# define _EEPROM_SUFFIX  _m325
219#elif defined (__AVR_ATmega325P__)
220# define _EEPROM_SUFFIX  _m325p
221#elif defined (__AVR_ATmega3250__)
222# define _EEPROM_SUFFIX  _m3250
223#elif defined (__AVR_ATmega3250P__)
224# define _EEPROM_SUFFIX  _m3250p
225#elif defined (__AVR_ATmega328__)
226# define _EEPROM_SUFFIX  _m328
227#elif defined (__AVR_ATmega328P__)
228# define _EEPROM_SUFFIX  _m328p
229#elif defined (__AVR_ATmega329__)
230# define _EEPROM_SUFFIX  _m329
231#elif defined (__AVR_ATmega329P__)
232# define _EEPROM_SUFFIX  _m329p
233#elif defined (__AVR_ATmega329PA__)
234# define _EEPROM_SUFFIX  _m329pa
235#elif defined (__AVR_ATmega3290__)
236# define _EEPROM_SUFFIX  _m3290
237#elif defined (__AVR_ATmega3290P__)
238# define _EEPROM_SUFFIX  _m3290p
239#elif defined (__AVR_ATmega32HVB__)
240# define _EEPROM_SUFFIX  _m32hvb
241#elif defined (__AVR_ATmega64HVE__)
242# define _EEPROM_SUFFIX  _m64hve
243#elif defined (__AVR_ATmega406__)
244# define _EEPROM_SUFFIX  _m406
245#elif defined (__AVR_ATmega16__)
246# define _EEPROM_SUFFIX  _m16
247#elif defined (__AVR_ATmega16A__)
248# define _EEPROM_SUFFIX  _m16a
249#elif defined (__AVR_ATmega161__)
250# define _EEPROM_SUFFIX  _m161
251#elif defined (__AVR_ATmega162__)
252# define _EEPROM_SUFFIX  _m162
253#elif defined (__AVR_ATmega163__)
254# define _EEPROM_SUFFIX  _m163
255#elif defined (__AVR_ATmega164__)
256# define _EEPROM_SUFFIX  _m164
257#elif defined (__AVR_ATmega164P__)
258# define _EEPROM_SUFFIX  _m164p
259#elif defined (__AVR_ATmega165__)
260# define _EEPROM_SUFFIX  _m165
261#elif defined (__AVR_ATmega165A__)
262# define _EEPROM_SUFFIX  _m165a
263#elif defined (__AVR_ATmega165P__)
264# define _EEPROM_SUFFIX  _m165p
265#elif defined (__AVR_ATmega168__)
266# define _EEPROM_SUFFIX  _m168
267#elif defined (__AVR_ATmega168A__)
268# define _EEPROM_SUFFIX  _m168a
269#elif defined (__AVR_ATmega168P__)
270# define _EEPROM_SUFFIX  _m168p
271#elif defined (__AVR_ATmega169__)
272# define _EEPROM_SUFFIX  _m169
273#elif defined (__AVR_ATmega169A__)
274# define _EEPROM_SUFFIX  _m169a
275#elif defined (__AVR_ATmega169P__)
276# define _EEPROM_SUFFIX  _m169p
277#elif defined (__AVR_ATmega169PA__)
278# define _EEPROM_SUFFIX  _m169pa
279#elif defined (__AVR_ATmega8HVA__)
280# define _EEPROM_SUFFIX  _m8hva
281#elif defined (__AVR_ATmega16HVA__)
282# define _EEPROM_SUFFIX  _m16hva
283#elif defined (__AVR_ATmega16HVA2__)
284# define _EEPROM_SUFFIX  _m16hva2
285#elif defined (__AVR_ATmega16HVB__)
286# define _EEPROM_SUFFIX  _m16hvb
287#elif defined (__AVR_ATmega8__)
288# define _EEPROM_SUFFIX  _m8
289#elif defined (__AVR_ATmega48__)
290# define _EEPROM_SUFFIX  _m48
291#elif defined (__AVR_ATmega48A__)
292# define _EEPROM_SUFFIX  _m48a
293#elif defined (__AVR_ATmega48P__)
294# define _EEPROM_SUFFIX  _m48p
295#elif defined (__AVR_ATmega88__)
296# define _EEPROM_SUFFIX  _m88
297#elif defined (__AVR_ATmega88A__)
298# define _EEPROM_SUFFIX  _m88a
299#elif defined (__AVR_ATmega88P__)
300# define _EEPROM_SUFFIX  _m88p
301#elif defined (__AVR_ATmega88PA__)
302# define _EEPROM_SUFFIX  _m88pa
303#elif defined (__AVR_ATmega8515__)
304# define _EEPROM_SUFFIX  _m8515
305#elif defined (__AVR_ATmega8535__)
306# define _EEPROM_SUFFIX  _m8535
307#elif defined (__AVR_AT90S8535__)
308# define _EEPROM_SUFFIX  _8535
309#elif defined (__AVR_AT90C8534__)
310# define _EEPROM_SUFFIX  _8534
311#elif defined (__AVR_AT90S8515__)
312# define _EEPROM_SUFFIX  _8515
313#elif defined (__AVR_AT90S4434__)
314# define _EEPROM_SUFFIX  _4434
315#elif defined (__AVR_AT90S4433__)
316# define _EEPROM_SUFFIX  _4433
317#elif defined (__AVR_AT90S4414__)
318# define _EEPROM_SUFFIX  _4414
319#elif defined (__AVR_ATtiny22__)
320# define _EEPROM_SUFFIX _tn22
321#elif defined (__AVR_ATtiny26__)
322# define _EEPROM_SUFFIX _tn26
323#elif defined (__AVR_AT90S2343__)
324# define _EEPROM_SUFFIX  _2343
325#elif defined (__AVR_AT90S2333__)
326# define _EEPROM_SUFFIX  _2333
327#elif defined (__AVR_AT90S2323__)
328# define _EEPROM_SUFFIX  _2323
329#elif defined (__AVR_AT90S2313__)
330# define _EEPROM_SUFFIX  _2313
331#elif defined (__AVR_ATtiny2313__)
332# define _EEPROM_SUFFIX _tn2313
333#elif defined (__AVR_ATtiny2313A__)
334# define _EEPROM_SUFFIX _tn2313a
335#elif defined (__AVR_ATtiny4313__)
336# define _EEPROM_SUFFIX _tn4313
337#elif defined (__AVR_ATtiny13__)
338# define _EEPROM_SUFFIX _tn13
339#elif defined (__AVR_ATtiny13A__)
340# define _EEPROM_SUFFIX _tn13a
341#elif defined (__AVR_ATtiny25__)
342# define _EEPROM_SUFFIX _tn25
343#elif defined (__AVR_ATtiny45__)
344# define _EEPROM_SUFFIX _tn45
345#elif defined (__AVR_ATtiny85__)
346# define _EEPROM_SUFFIX _tn85
347#elif defined (__AVR_ATtiny24__)
348# define _EEPROM_SUFFIX _tn24
349#elif defined (__AVR_ATtiny24A__)
350# define _EEPROM_SUFFIX _tn24a
351#elif defined (__AVR_ATtiny44__)
352# define _EEPROM_SUFFIX _tn44
353#elif defined (__AVR_ATtiny44A__)
354# define _EEPROM_SUFFIX _tn44a
355#elif defined (__AVR_ATtiny84__)
356# define _EEPROM_SUFFIX _tn84
357#elif defined (__AVR_ATtiny261__)
358# define _EEPROM_SUFFIX _tn261
359#elif defined (__AVR_ATtiny261A__)
360# define _EEPROM_SUFFIX _tn261a
361#elif defined (__AVR_ATtiny461__)
362# define _EEPROM_SUFFIX _tn461
363#elif defined (__AVR_ATtiny461A__)
364# define _EEPROM_SUFFIX _tn461a
365#elif defined (__AVR_ATtiny861__)
366# define _EEPROM_SUFFIX _tn861
367#elif defined (__AVR_ATtiny861A__)
368# define _EEPROM_SUFFIX _tn861a
369#elif defined (__AVR_ATtiny43U__)
370# define _EEPROM_SUFFIX _tn43u
371#elif defined (__AVR_ATtiny48__)
372# define _EEPROM_SUFFIX _tn48
373#elif defined (__AVR_ATtiny88__)
374# define _EEPROM_SUFFIX _tn88
375#elif defined (__AVR_ATtiny87__)
376# define _EEPROM_SUFFIX _tn87
377#elif defined (__AVR_ATtiny167__)
378# define _EEPROM_SUFFIX _tn167
379#elif defined (__AVR_AT90SCR100__)
380# define _EEPROM_SUFFIX _90scr100
381#elif defined (__AVR_ATxmega16A4__)
382# define _EEPROM_SUFFIX   _x16a4
383#elif defined (__AVR_ATxmega16D4__)
384# define _EEPROM_SUFFIX   _x16d4
385#elif defined (__AVR_ATxmega32A4__)
386# define _EEPROM_SUFFIX   _x32a4
387#elif defined (__AVR_ATxmega32D4__)
388# define _EEPROM_SUFFIX   _x32d4
389#elif defined (__AVR_ATxmega64A1__)
390# define _EEPROM_SUFFIX   _x64a1
391#elif defined (__AVR_ATxmega64A3__)
392# define _EEPROM_SUFFIX   _x64a3
393#elif defined (__AVR_ATxmega64D3__)
394# define _EEPROM_SUFFIX   _x64d3
395#elif defined (__AVR_ATxmega128A1__)
396# define _EEPROM_SUFFIX   _x128a1
397#elif defined (__AVR_ATxmega128A3__)
398# define _EEPROM_SUFFIX   _x128a3
399#elif defined (__AVR_ATxmega128D3__)
400# define _EEPROM_SUFFIX   _x128d3
401#elif defined (__AVR_ATxmega192A3__)
402# define _EEPROM_SUFFIX   _x192a3
403#elif defined (__AVR_ATxmega192D3__)
404# define _EEPROM_SUFFIX   _x192d3
405#elif defined (__AVR_ATxmega256A3__)
406# define _EEPROM_SUFFIX   _x256a3
407#elif defined (__AVR_ATxmega256A3B__)
408# define _EEPROM_SUFFIX   _x256a3b
409#elif defined (__AVR_ATxmega256D3__)
410# define _EEPROM_SUFFIX   _x256d3
411#elif defined (__AVR_ATA6289__)
412# define _EEPROM_SUFFIX _a6289
413/* avr1: the following only supported for assembler programs */
414#elif defined (__AVR_ATtiny28__)
415# define _EEPROM_SUFFIX _tn28
416#elif defined (__AVR_AT90S1200__)
417# define _EEPROM_SUFFIX  _1200
418#elif defined (__AVR_ATtiny15__)
419# define _EEPROM_SUFFIX _tn15
420#elif defined (__AVR_ATtiny12__)
421# define _EEPROM_SUFFIX _tn12
422#elif defined (__AVR_ATtiny11__)
423# define _EEPROM_SUFFIX _tn11
424#else
425# define _EEPROM_SUFFIX         _UNKNOWN
426#endif
427
428#define _EEPROM_CONCAT1(s1, s2)     s1 ## s2
429#define _EEPROM_CONCAT2(s1, s2)     _EEPROM_CONCAT1 (s1, s2)
430
431#define eeprom_read_byte      _EEPROM_CONCAT2 (__eerd_byte, _EEPROM_SUFFIX)
432#define eeprom_read_word      _EEPROM_CONCAT2 (__eerd_word, _EEPROM_SUFFIX)
433#define eeprom_read_dword     _EEPROM_CONCAT2 (__eerd_dword, _EEPROM_SUFFIX)
434#define eeprom_read_float     _EEPROM_CONCAT2 (__eerd_float, _EEPROM_SUFFIX)
435#define eeprom_read_block     _EEPROM_CONCAT2 (__eerd_block, _EEPROM_SUFFIX)
436
437#define eeprom_write_byte     _EEPROM_CONCAT2 (__eewr_byte, _EEPROM_SUFFIX)
438#define eeprom_write_word     _EEPROM_CONCAT2 (__eewr_word, _EEPROM_SUFFIX)
439#define eeprom_write_dword    _EEPROM_CONCAT2 (__eewr_dword, _EEPROM_SUFFIX)
440#define eeprom_write_float    _EEPROM_CONCAT2 (__eewr_float, _EEPROM_SUFFIX)
441#define eeprom_write_block    _EEPROM_CONCAT2 (__eewr_block, _EEPROM_SUFFIX)
442
443#define eeprom_update_byte    _EEPROM_CONCAT2 (__eeupd_byte, _EEPROM_SUFFIX)
444#define eeprom_update_word    _EEPROM_CONCAT2 (__eeupd_word, _EEPROM_SUFFIX)
445#define eeprom_update_dword   _EEPROM_CONCAT2 (__eeupd_dword, _EEPROM_SUFFIX)
446#define eeprom_update_float   _EEPROM_CONCAT2 (__eeupd_float, _EEPROM_SUFFIX)
447#define eeprom_update_block   _EEPROM_CONCAT2 (__eeupd_block, _EEPROM_SUFFIX)
448
449#endif  /* !__DOXYGEN__ */
450
451#ifndef __ASSEMBLER__
452
453#include <stddef.h>     /* size_t */
454#include <stdint.h>
455
456/**
457 *  @defgroup avr_eeprom EEPROM handling
458 *
459 *  @ingroup avr
460 */
461/**@{*/
462
463#ifdef __cplusplus
464extern "C" {
465#endif
466
467#ifndef __ATTR_PURE__
468# ifdef  __DOXYGEN__
469#  define __ATTR_PURE__
470# else
471#  define __ATTR_PURE__  __attribute__((__pure__))
472# endif
473#endif
474
475/** \def EEMEM
476    \ingroup avr_eeprom
477    Attribute expression causing a variable to be allocated within the
478    .eeprom section.    */
479#define EEMEM __attribute__((section(".eeprom")))
480
481/** \def eeprom_is_ready
482    \ingroup avr_eeprom
483    \returns 1 if EEPROM is ready for a new read/write operation, 0 if not.
484 */
485#if     defined (__DOXYGEN__)
486# define eeprom_is_ready()
487#elif   defined (__AVR_XMEGA__) && __AVR_XMEGA__
488# define eeprom_is_ready()      bit_is_clear (NVM_STATUS, NVM_NVMBUSY_bp)
489#elif   defined (DEECR)
490# define eeprom_is_ready()      bit_is_clear (DEECR, BSY)
491#elif   defined (EEPE)
492# define eeprom_is_ready()      bit_is_clear (EECR, EEPE)
493#else
494# define eeprom_is_ready()      bit_is_clear (EECR, EEWE)
495#endif
496
497
498/** \def eeprom_busy_wait
499    \ingroup avr_eeprom
500    Loops until the eeprom is no longer busy.
501    \returns Nothing.
502 */
503#define eeprom_busy_wait() do {} while (!eeprom_is_ready())
504
505
506/** \ingroup avr_eeprom
507    Read one byte from EEPROM address \a __p.
508 */
509uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__;
510
511/** \ingroup avr_eeprom
512    Read one 16-bit word (little endian) from EEPROM address \a __p.
513 */
514uint16_t eeprom_read_word (const uint16_t *__p) __ATTR_PURE__;
515
516/** \ingroup avr_eeprom
517    Read one 32-bit double word (little endian) from EEPROM address \a __p.
518 */
519uint32_t eeprom_read_dword (const uint32_t *__p) __ATTR_PURE__;
520
521/** \ingroup avr_eeprom
522    Read one float value (little endian) from EEPROM address \a __p.
523 */
524float eeprom_read_float (const float *__p) __ATTR_PURE__;
525
526/** \ingroup avr_eeprom
527    Read a block of \a __n bytes from EEPROM address \a __src to SRAM
528    \a __dst.
529 */
530void eeprom_read_block (void *__dst, const void *__src, size_t __n);
531
532
533/** \ingroup avr_eeprom
534    Write a byte \a __value to EEPROM address \a __p.
535 */
536void eeprom_write_byte (uint8_t *__p, uint8_t __value);
537
538/** \ingroup avr_eeprom
539    Write a word \a __value to EEPROM address \a __p.
540 */
541void eeprom_write_word (uint16_t *__p, uint16_t __value);
542
543/** \ingroup avr_eeprom
544    Write a 32-bit double word \a __value to EEPROM address \a __p.
545 */
546void eeprom_write_dword (uint32_t *__p, uint32_t __value);
547
548/** \ingroup avr_eeprom
549    Write a float \a __value to EEPROM address \a __p.
550 */
551void eeprom_write_float (float *__p, float __value);
552
553/** \ingroup avr_eeprom
554    Write a block of \a __n bytes to EEPROM address \a __dst from \a __src.
555    \note The argument order is mismatch with common functions like strcpy().
556 */
557void eeprom_write_block (const void *__src, void *__dst, size_t __n);
558
559
560/** \ingroup avr_eeprom
561    Update a byte \a __value to EEPROM address \a __p.
562 */
563void eeprom_update_byte (uint8_t *__p, uint8_t __value);
564
565/** \ingroup avr_eeprom
566    Update a word \a __value to EEPROM address \a __p.
567 */
568void eeprom_update_word (uint16_t *__p, uint16_t __value);
569
570/** \ingroup avr_eeprom
571    Update a 32-bit double word \a __value to EEPROM address \a __p.
572 */
573void eeprom_update_dword (uint32_t *__p, uint32_t __value);
574
575/** \ingroup avr_eeprom
576    Update a float \a __value to EEPROM address \a __p.
577 */
578void eeprom_update_float (float *__p, float __value);
579
580/** \ingroup avr_eeprom
581    Update a block of \a __n bytes to EEPROM address \a __dst from \a __src.
582    \note The argument order is mismatch with common functions like strcpy().
583 */
584void eeprom_update_block (const void *__src, void *__dst, size_t __n);
585
586
587/** \name IAR C compatibility defines   */
588/*@{*/
589
590/** \def _EEPUT
591    \ingroup avr_eeprom
592    Write a byte to EEPROM. Compatibility define for IAR C.     */
593#define _EEPUT(addr, val) eeprom_write_byte ((uint8_t *)(addr), (uint8_t)(val))
594
595/** \def __EEPUT
596    \ingroup avr_eeprom
597    Write a byte to EEPROM. Compatibility define for IAR C.     */
598#define __EEPUT(addr, val) eeprom_write_byte ((uint8_t *)(addr), (uint8_t)(val))
599
600/** \def _EEGET
601    \ingroup avr_eeprom
602    Read a byte from EEPROM. Compatibility define for IAR C.    */
603#define _EEGET(var, addr) (var) = eeprom_read_byte ((const uint8_t *)(addr))
604
605/** \def __EEGET
606    \ingroup avr_eeprom
607    Read a byte from EEPROM. Compatibility define for IAR C.    */
608#define __EEGET(var, addr) (var) = eeprom_read_byte ((const uint8_t *)(addr))
609
610/*@}*/
611
612#ifdef __cplusplus
613}
614#endif
615
616#endif  /* !__ASSEMBLER__ */
617#endif  /* E2END || defined(__DOXYGEN__) || defined(__COMPILING_AVR_LIBC__) */
618
619/**@}*/
620#endif  /* !_AVR_EEPROM_H_ */
Note: See TracBrowser for help on using the repository browser.