summaryrefslogtreecommitdiffstats
path: root/cpukit/score/cpu/avr/avr/eeprom.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/score/cpu/avr/avr/eeprom.h')
-rw-r--r--cpukit/score/cpu/avr/avr/eeprom.h606
1 files changed, 606 insertions, 0 deletions
diff --git a/cpukit/score/cpu/avr/avr/eeprom.h b/cpukit/score/cpu/avr/avr/eeprom.h
new file mode 100644
index 0000000000..e590a04a51
--- /dev/null
+++ b/cpukit/score/cpu/avr/avr/eeprom.h
@@ -0,0 +1,606 @@
+/* Copyright (c) 2002, 2003, 2004, 2007 Marek Michalkiewicz
+ Copyright (c) 2005, 2006 Bjoern Haase
+ Copyright (c) 2008 Atmel Corporation
+ Copyright (c) 2008 Wouter van Gulik
+ Copyright (c) 2009 Dmitry Xmelkov
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name of the copyright holders nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE. */
+
+/* $Id$ */
+
+#ifndef _AVR_EEPROM_H_
+#define _AVR_EEPROM_H_ 1
+
+#include <avr/io.h>
+
+#if !E2END && !defined(__DOXYGEN__) && !defined(__COMPILING_AVR_LIBC__)
+# warning "Device does not have EEPROM available."
+#else
+
+#ifndef __DOXYGEN__
+
+#if defined (__AVR_AT94K__)
+# define _EEPROM_SUFFIX _at94k
+#elif defined (__AVR_AT43USB320__)
+# define _EEPROM_SUFFIX _43u320
+#elif defined (__AVR_AT43USB355__)
+# define _EEPROM_SUFFIX _43u355
+#elif defined (__AVR_AT76C711__)
+# define _EEPROM_SUFFIX _76c711
+#elif defined (__AVR_AT86RF401__)
+# define _EEPROM_SUFFIX _86r401
+#elif defined (__AVR_AT90PWM1__)
+# define _EEPROM_SUFFIX _90pwm1
+#elif defined (__AVR_AT90PWM2__)
+# define _EEPROM_SUFFIX _90pwm2
+#elif defined (__AVR_AT90PWM2B__)
+# define _EEPROM_SUFFIX _90pwm2b
+#elif defined (__AVR_AT90PWM3__)
+# define _EEPROM_SUFFIX _90pwm3
+#elif defined (__AVR_AT90PWM3B__)
+# define _EEPROM_SUFFIX _90pwm3b
+#elif defined (__AVR_AT90PWM216__)
+# define _EEPROM_SUFFIX _90pwm216
+#elif defined (__AVR_AT90PWM316__)
+# define _EEPROM_SUFFIX _90pwm316
+#elif defined (__AVR_AT90PWM81__)
+# define _EEPROM_SUFFIX _90pwm81
+#elif defined (__AVR_ATmega16M1__)
+# define _EEPROM_SUFFIX _m16m1
+#elif defined (__AVR_ATmega8U2__)
+# define _EEPROM_SUFFIX _m8u2
+#elif defined (__AVR_ATmega16U2__)
+# define _EEPROM_SUFFIX _m16u2
+#elif defined (__AVR_ATmega16U4__)
+# define _EEPROM_SUFFIX _m16u4
+#elif defined (__AVR_ATmega32C1__)
+# define _EEPROM_SUFFIX _m32c1
+#elif defined (__AVR_ATmega32M1__)
+# define _EEPROM_SUFFIX _m32m1
+#elif defined (__AVR_ATmega32U2__)
+# define _EEPROM_SUFFIX _m32u2
+#elif defined (__AVR_ATmega32U4__)
+# define _EEPROM_SUFFIX _m32u4
+#elif defined (__AVR_ATmega32U6__)
+# define _EEPROM_SUFFIX _m32u6
+#elif defined (__AVR_ATmega64C1__)
+# define _EEPROM_SUFFIX _m64c1
+#elif defined (__AVR_ATmega64M1__)
+# define _EEPROM_SUFFIX _m64m1
+#elif defined (__AVR_ATmega128__)
+# define _EEPROM_SUFFIX _m128
+#elif defined (__AVR_ATmega1280__)
+# define _EEPROM_SUFFIX _m1280
+#elif defined (__AVR_ATmega1281__)
+# define _EEPROM_SUFFIX _m1281
+#elif defined (__AVR_ATmega1284P__)
+# define _EEPROM_SUFFIX _m1284p
+#elif defined (__AVR_ATmega128RFA1__)
+# define _EEPROM_SUFFIX _m128rfa1
+#elif defined (__AVR_ATmega2560__)
+# define _EEPROM_SUFFIX _m2560
+#elif defined (__AVR_ATmega2561__)
+# define _EEPROM_SUFFIX _m2561
+#elif defined (__AVR_AT90CAN32__)
+# define _EEPROM_SUFFIX _can32
+#elif defined (__AVR_AT90CAN64__)
+# define _EEPROM_SUFFIX _can64
+#elif defined (__AVR_AT90CAN128__)
+# define _EEPROM_SUFFIX _can128
+#elif defined (__AVR_AT90USB82__)
+# define _EEPROM_SUFFIX _usb82
+#elif defined (__AVR_AT90USB162__)
+# define _EEPROM_SUFFIX _usb162
+#elif defined (__AVR_AT90USB646__)
+# define _EEPROM_SUFFIX _usb646
+#elif defined (__AVR_AT90USB647__)
+# define _EEPROM_SUFFIX _usb647
+#elif defined (__AVR_AT90USB1286__)
+# define _EEPROM_SUFFIX _usb1286
+#elif defined (__AVR_AT90USB1287__)
+# define _EEPROM_SUFFIX _usb1287
+#elif defined (__AVR_ATmega64__)
+# define _EEPROM_SUFFIX _m64
+#elif defined (__AVR_ATmega640__)
+# define _EEPROM_SUFFIX _m640
+#elif defined (__AVR_ATmega644__)
+# define _EEPROM_SUFFIX _m644
+#elif defined (__AVR_ATmega644A__)
+# define _EEPROM_SUFFIX _m644a
+#elif defined (__AVR_ATmega644P__)
+# define _EEPROM_SUFFIX _m644p
+#elif defined (__AVR_ATmega644PA__)
+# define _EEPROM_SUFFIX _m644pa
+#elif defined (__AVR_ATmega645__)
+# define _EEPROM_SUFFIX _m645
+#elif defined (__AVR_ATmega645A__)
+# define _EEPROM_SUFFIX _m645a
+#elif defined (__AVR_ATmega645P__)
+# define _EEPROM_SUFFIX _m645p
+#elif defined (__AVR_ATmega6450__)
+# define _EEPROM_SUFFIX _m6450
+#elif defined (__AVR_ATmega6450A__)
+# define _EEPROM_SUFFIX _m6450a
+#elif defined (__AVR_ATmega6450P__)
+# define _EEPROM_SUFFIX _m6450p
+#elif defined (__AVR_ATmega649__)
+# define _EEPROM_SUFFIX _m649
+#elif defined (__AVR_ATmega649A__)
+# define _EEPROM_SUFFIX _m649a
+#elif defined (__AVR_ATmega649P__)
+# define _EEPROM_SUFFIX _m649p
+#elif defined (__AVR_ATmega6490__)
+# define _EEPROM_SUFFIX _m6490
+#elif defined (__AVR_ATmega6490A__)
+# define _EEPROM_SUFFIX _m6490a
+#elif defined (__AVR_ATmega6490P__)
+# define _EEPROM_SUFFIX _m6490p
+#elif defined (__AVR_ATmega103__)
+# define _EEPROM_SUFFIX _m103
+#elif defined (__AVR_ATmega32__)
+# define _EEPROM_SUFFIX _m32
+#elif defined (__AVR_ATmega323__)
+# define _EEPROM_SUFFIX _m323
+#elif defined (__AVR_ATmega324A__)
+# define _EEPROM_SUFFIX _m324a
+#elif defined (__AVR_ATmega324P__)
+# define _EEPROM_SUFFIX _m324p
+#elif defined (__AVR_ATmega324PA__)
+# define _EEPROM_SUFFIX _m324pa
+#elif defined (__AVR_ATmega325__)
+# define _EEPROM_SUFFIX _m325
+#elif defined (__AVR_ATmega325P__)
+# define _EEPROM_SUFFIX _m325p
+#elif defined (__AVR_ATmega3250__)
+# define _EEPROM_SUFFIX _m3250
+#elif defined (__AVR_ATmega3250P__)
+# define _EEPROM_SUFFIX _m3250p
+#elif defined (__AVR_ATmega328__)
+# define _EEPROM_SUFFIX _m328
+#elif defined (__AVR_ATmega328P__)
+# define _EEPROM_SUFFIX _m328p
+#elif defined (__AVR_ATmega329__)
+# define _EEPROM_SUFFIX _m329
+#elif defined (__AVR_ATmega329P__)
+# define _EEPROM_SUFFIX _m329p
+#elif defined (__AVR_ATmega329PA__)
+# define _EEPROM_SUFFIX _m329pa
+#elif defined (__AVR_ATmega3290__)
+# define _EEPROM_SUFFIX _m3290
+#elif defined (__AVR_ATmega3290P__)
+# define _EEPROM_SUFFIX _m3290p
+#elif defined (__AVR_ATmega32HVB__)
+# define _EEPROM_SUFFIX _m32hvb
+#elif defined (__AVR_ATmega64HVE__)
+# define _EEPROM_SUFFIX _m64hve
+#elif defined (__AVR_ATmega406__)
+# define _EEPROM_SUFFIX _m406
+#elif defined (__AVR_ATmega16__)
+# define _EEPROM_SUFFIX _m16
+#elif defined (__AVR_ATmega16A__)
+# define _EEPROM_SUFFIX _m16a
+#elif defined (__AVR_ATmega161__)
+# define _EEPROM_SUFFIX _m161
+#elif defined (__AVR_ATmega162__)
+# define _EEPROM_SUFFIX _m162
+#elif defined (__AVR_ATmega163__)
+# define _EEPROM_SUFFIX _m163
+#elif defined (__AVR_ATmega164__)
+# define _EEPROM_SUFFIX _m164
+#elif defined (__AVR_ATmega164P__)
+# define _EEPROM_SUFFIX _m164p
+#elif defined (__AVR_ATmega165__)
+# define _EEPROM_SUFFIX _m165
+#elif defined (__AVR_ATmega165A__)
+# define _EEPROM_SUFFIX _m165a
+#elif defined (__AVR_ATmega165P__)
+# define _EEPROM_SUFFIX _m165p
+#elif defined (__AVR_ATmega168__)
+# define _EEPROM_SUFFIX _m168
+#elif defined (__AVR_ATmega168A__)
+# define _EEPROM_SUFFIX _m168a
+#elif defined (__AVR_ATmega168P__)
+# define _EEPROM_SUFFIX _m168p
+#elif defined (__AVR_ATmega169__)
+# define _EEPROM_SUFFIX _m169
+#elif defined (__AVR_ATmega169A__)
+# define _EEPROM_SUFFIX _m169a
+#elif defined (__AVR_ATmega169P__)
+# define _EEPROM_SUFFIX _m169p
+#elif defined (__AVR_ATmega169PA__)
+# define _EEPROM_SUFFIX _m169pa
+#elif defined (__AVR_ATmega8HVA__)
+# define _EEPROM_SUFFIX _m8hva
+#elif defined (__AVR_ATmega16HVA__)
+# define _EEPROM_SUFFIX _m16hva
+#elif defined (__AVR_ATmega16HVA2__)
+# define _EEPROM_SUFFIX _m16hva2
+#elif defined (__AVR_ATmega16HVB__)
+# define _EEPROM_SUFFIX _m16hvb
+#elif defined (__AVR_ATmega8__)
+# define _EEPROM_SUFFIX _m8
+#elif defined (__AVR_ATmega48__)
+# define _EEPROM_SUFFIX _m48
+#elif defined (__AVR_ATmega48A__)
+# define _EEPROM_SUFFIX _m48a
+#elif defined (__AVR_ATmega48P__)
+# define _EEPROM_SUFFIX _m48p
+#elif defined (__AVR_ATmega88__)
+# define _EEPROM_SUFFIX _m88
+#elif defined (__AVR_ATmega88A__)
+# define _EEPROM_SUFFIX _m88a
+#elif defined (__AVR_ATmega88P__)
+# define _EEPROM_SUFFIX _m88p
+#elif defined (__AVR_ATmega88PA__)
+# define _EEPROM_SUFFIX _m88pa
+#elif defined (__AVR_ATmega8515__)
+# define _EEPROM_SUFFIX _m8515
+#elif defined (__AVR_ATmega8535__)
+# define _EEPROM_SUFFIX _m8535
+#elif defined (__AVR_AT90S8535__)
+# define _EEPROM_SUFFIX _8535
+#elif defined (__AVR_AT90C8534__)
+# define _EEPROM_SUFFIX _8534
+#elif defined (__AVR_AT90S8515__)
+# define _EEPROM_SUFFIX _8515
+#elif defined (__AVR_AT90S4434__)
+# define _EEPROM_SUFFIX _4434
+#elif defined (__AVR_AT90S4433__)
+# define _EEPROM_SUFFIX _4433
+#elif defined (__AVR_AT90S4414__)
+# define _EEPROM_SUFFIX _4414
+#elif defined (__AVR_ATtiny22__)
+# define _EEPROM_SUFFIX _tn22
+#elif defined (__AVR_ATtiny26__)
+# define _EEPROM_SUFFIX _tn26
+#elif defined (__AVR_AT90S2343__)
+# define _EEPROM_SUFFIX _2343
+#elif defined (__AVR_AT90S2333__)
+# define _EEPROM_SUFFIX _2333
+#elif defined (__AVR_AT90S2323__)
+# define _EEPROM_SUFFIX _2323
+#elif defined (__AVR_AT90S2313__)
+# define _EEPROM_SUFFIX _2313
+#elif defined (__AVR_ATtiny2313__)
+# define _EEPROM_SUFFIX _tn2313
+#elif defined (__AVR_ATtiny2313A__)
+# define _EEPROM_SUFFIX _tn2313a
+#elif defined (__AVR_ATtiny4313__)
+# define _EEPROM_SUFFIX _tn4313
+#elif defined (__AVR_ATtiny13__)
+# define _EEPROM_SUFFIX _tn13
+#elif defined (__AVR_ATtiny13A__)
+# define _EEPROM_SUFFIX _tn13a
+#elif defined (__AVR_ATtiny25__)
+# define _EEPROM_SUFFIX _tn25
+#elif defined (__AVR_ATtiny45__)
+# define _EEPROM_SUFFIX _tn45
+#elif defined (__AVR_ATtiny85__)
+# define _EEPROM_SUFFIX _tn85
+#elif defined (__AVR_ATtiny24__)
+# define _EEPROM_SUFFIX _tn24
+#elif defined (__AVR_ATtiny24A__)
+# define _EEPROM_SUFFIX _tn24a
+#elif defined (__AVR_ATtiny44__)
+# define _EEPROM_SUFFIX _tn44
+#elif defined (__AVR_ATtiny44A__)
+# define _EEPROM_SUFFIX _tn44a
+#elif defined (__AVR_ATtiny84__)
+# define _EEPROM_SUFFIX _tn84
+#elif defined (__AVR_ATtiny261__)
+# define _EEPROM_SUFFIX _tn261
+#elif defined (__AVR_ATtiny261A__)
+# define _EEPROM_SUFFIX _tn261a
+#elif defined (__AVR_ATtiny461__)
+# define _EEPROM_SUFFIX _tn461
+#elif defined (__AVR_ATtiny461A__)
+# define _EEPROM_SUFFIX _tn461a
+#elif defined (__AVR_ATtiny861__)
+# define _EEPROM_SUFFIX _tn861
+#elif defined (__AVR_ATtiny861A__)
+# define _EEPROM_SUFFIX _tn861a
+#elif defined (__AVR_ATtiny43U__)
+# define _EEPROM_SUFFIX _tn43u
+#elif defined (__AVR_ATtiny48__)
+# define _EEPROM_SUFFIX _tn48
+#elif defined (__AVR_ATtiny88__)
+# define _EEPROM_SUFFIX _tn88
+#elif defined (__AVR_ATtiny87__)
+# define _EEPROM_SUFFIX _tn87
+#elif defined (__AVR_ATtiny167__)
+# define _EEPROM_SUFFIX _tn167
+#elif defined (__AVR_AT90SCR100__)
+# define _EEPROM_SUFFIX _90scr100
+#elif defined (__AVR_ATxmega16A4__)
+# define _EEPROM_SUFFIX _x16a4
+#elif defined (__AVR_ATxmega16D4__)
+# define _EEPROM_SUFFIX _x16d4
+#elif defined (__AVR_ATxmega32A4__)
+# define _EEPROM_SUFFIX _x32a4
+#elif defined (__AVR_ATxmega32D4__)
+# define _EEPROM_SUFFIX _x32d4
+#elif defined (__AVR_ATxmega64A1__)
+# define _EEPROM_SUFFIX _x64a1
+#elif defined (__AVR_ATxmega64A3__)
+# define _EEPROM_SUFFIX _x64a3
+#elif defined (__AVR_ATxmega64D3__)
+# define _EEPROM_SUFFIX _x64d3
+#elif defined (__AVR_ATxmega128A1__)
+# define _EEPROM_SUFFIX _x128a1
+#elif defined (__AVR_ATxmega128A3__)
+# define _EEPROM_SUFFIX _x128a3
+#elif defined (__AVR_ATxmega128D3__)
+# define _EEPROM_SUFFIX _x128d3
+#elif defined (__AVR_ATxmega192A3__)
+# define _EEPROM_SUFFIX _x192a3
+#elif defined (__AVR_ATxmega192D3__)
+# define _EEPROM_SUFFIX _x192d3
+#elif defined (__AVR_ATxmega256A3__)
+# define _EEPROM_SUFFIX _x256a3
+#elif defined (__AVR_ATxmega256A3B__)
+# define _EEPROM_SUFFIX _x256a3b
+#elif defined (__AVR_ATxmega256D3__)
+# define _EEPROM_SUFFIX _x256d3
+#elif defined (__AVR_ATA6289__)
+# define _EEPROM_SUFFIX _a6289
+/* avr1: the following only supported for assembler programs */
+#elif defined (__AVR_ATtiny28__)
+# define _EEPROM_SUFFIX _tn28
+#elif defined (__AVR_AT90S1200__)
+# define _EEPROM_SUFFIX _1200
+#elif defined (__AVR_ATtiny15__)
+# define _EEPROM_SUFFIX _tn15
+#elif defined (__AVR_ATtiny12__)
+# define _EEPROM_SUFFIX _tn12
+#elif defined (__AVR_ATtiny11__)
+# define _EEPROM_SUFFIX _tn11
+#else
+# define _EEPROM_SUFFIX _UNKNOWN
+#endif
+
+#define _EEPROM_CONCAT1(s1, s2) s1 ## s2
+#define _EEPROM_CONCAT2(s1, s2) _EEPROM_CONCAT1 (s1, s2)
+
+#define eeprom_read_byte _EEPROM_CONCAT2 (__eerd_byte, _EEPROM_SUFFIX)
+#define eeprom_read_word _EEPROM_CONCAT2 (__eerd_word, _EEPROM_SUFFIX)
+#define eeprom_read_dword _EEPROM_CONCAT2 (__eerd_dword, _EEPROM_SUFFIX)
+#define eeprom_read_float _EEPROM_CONCAT2 (__eerd_float, _EEPROM_SUFFIX)
+#define eeprom_read_block _EEPROM_CONCAT2 (__eerd_block, _EEPROM_SUFFIX)
+
+#define eeprom_write_byte _EEPROM_CONCAT2 (__eewr_byte, _EEPROM_SUFFIX)
+#define eeprom_write_word _EEPROM_CONCAT2 (__eewr_word, _EEPROM_SUFFIX)
+#define eeprom_write_dword _EEPROM_CONCAT2 (__eewr_dword, _EEPROM_SUFFIX)
+#define eeprom_write_float _EEPROM_CONCAT2 (__eewr_float, _EEPROM_SUFFIX)
+#define eeprom_write_block _EEPROM_CONCAT2 (__eewr_block, _EEPROM_SUFFIX)
+
+#define eeprom_update_byte _EEPROM_CONCAT2 (__eeupd_byte, _EEPROM_SUFFIX)
+#define eeprom_update_word _EEPROM_CONCAT2 (__eeupd_word, _EEPROM_SUFFIX)
+#define eeprom_update_dword _EEPROM_CONCAT2 (__eeupd_dword, _EEPROM_SUFFIX)
+#define eeprom_update_float _EEPROM_CONCAT2 (__eeupd_float, _EEPROM_SUFFIX)
+#define eeprom_update_block _EEPROM_CONCAT2 (__eeupd_block, _EEPROM_SUFFIX)
+
+#endif /* !__DOXYGEN__ */
+
+#ifndef __ASSEMBLER__
+
+#include <stddef.h> /* size_t */
+#include <stdint.h>
+
+/** \defgroup avr_eeprom <avr/eeprom.h>: EEPROM handling
+ \code #include <avr/eeprom.h> \endcode
+
+ This header file declares the interface to some simple library
+ routines suitable for handling the data EEPROM contained in the
+ AVR microcontrollers. The implementation uses a simple polled
+ mode interface. Applications that require interrupt-controlled
+ EEPROM access to ensure that no time will be wasted in spinloops
+ will have to deploy their own implementation.
+
+ \par Notes:
+
+ - In addition to the write functions there is a set of update ones.
+ This functions read each byte first and skip the burning if the
+ old value is the same with new. The scaning direction is from
+ high address to low, to obtain quick return in common cases.
+
+ - All of the read/write functions first make sure the EEPROM is
+ ready to be accessed. Since this may cause long delays if a
+ write operation is still pending, time-critical applications
+ should first poll the EEPROM e. g. using eeprom_is_ready() before
+ attempting any actual I/O. But this functions are not wait until
+ SELFPRGEN in SPMCSR becomes zero. Do this manually, if your
+ softwate contains the Flash burning.
+
+ - As these functions modify IO registers, they are known to be
+ non-reentrant. If any of these functions are used from both,
+ standard and interrupt context, the applications must ensure
+ proper protection (e.g. by disabling interrupts before accessing
+ them).
+
+ - All write functions force erase_and_write programming mode.
+
+ - For Xmega the EEPROM start address is 0, like other architectures.
+ The reading functions add the 0x2000 value to use EEPROM mapping into
+ data space.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef __ATTR_PURE__
+# ifdef __DOXYGEN__
+# define __ATTR_PURE__
+# else
+# define __ATTR_PURE__ __attribute__((__pure__))
+# endif
+#endif
+
+/** \def EEMEM
+ \ingroup avr_eeprom
+ Attribute expression causing a variable to be allocated within the
+ .eeprom section. */
+#define EEMEM __attribute__((section(".eeprom")))
+
+/** \def eeprom_is_ready
+ \ingroup avr_eeprom
+ \returns 1 if EEPROM is ready for a new read/write operation, 0 if not.
+ */
+#if defined (__DOXYGEN__)
+# define eeprom_is_ready()
+#elif defined (__AVR_XMEGA__) && __AVR_XMEGA__
+# define eeprom_is_ready() bit_is_clear (NVM_STATUS, NVM_NVMBUSY_bp)
+#elif defined (DEECR)
+# define eeprom_is_ready() bit_is_clear (DEECR, BSY)
+#elif defined (EEPE)
+# define eeprom_is_ready() bit_is_clear (EECR, EEPE)
+#else
+# define eeprom_is_ready() bit_is_clear (EECR, EEWE)
+#endif
+
+
+/** \def eeprom_busy_wait
+ \ingroup avr_eeprom
+ Loops until the eeprom is no longer busy.
+ \returns Nothing.
+ */
+#define eeprom_busy_wait() do {} while (!eeprom_is_ready())
+
+
+/** \ingroup avr_eeprom
+ Read one byte from EEPROM address \a __p.
+ */
+uint8_t eeprom_read_byte (const uint8_t *__p) __ATTR_PURE__;
+
+/** \ingroup avr_eeprom
+ Read one 16-bit word (little endian) from EEPROM address \a __p.
+ */
+uint16_t eeprom_read_word (const uint16_t *__p) __ATTR_PURE__;
+
+/** \ingroup avr_eeprom
+ Read one 32-bit double word (little endian) from EEPROM address \a __p.
+ */
+uint32_t eeprom_read_dword (const uint32_t *__p) __ATTR_PURE__;
+
+/** \ingroup avr_eeprom
+ Read one float value (little endian) from EEPROM address \a __p.
+ */
+float eeprom_read_float (const float *__p) __ATTR_PURE__;
+
+/** \ingroup avr_eeprom
+ Read a block of \a __n bytes from EEPROM address \a __src to SRAM
+ \a __dst.
+ */
+void eeprom_read_block (void *__dst, const void *__src, size_t __n);
+
+
+/** \ingroup avr_eeprom
+ Write a byte \a __value to EEPROM address \a __p.
+ */
+void eeprom_write_byte (uint8_t *__p, uint8_t __value);
+
+/** \ingroup avr_eeprom
+ Write a word \a __value to EEPROM address \a __p.
+ */
+void eeprom_write_word (uint16_t *__p, uint16_t __value);
+
+/** \ingroup avr_eeprom
+ Write a 32-bit double word \a __value to EEPROM address \a __p.
+ */
+void eeprom_write_dword (uint32_t *__p, uint32_t __value);
+
+/** \ingroup avr_eeprom
+ Write a float \a __value to EEPROM address \a __p.
+ */
+void eeprom_write_float (float *__p, float __value);
+
+/** \ingroup avr_eeprom
+ Write a block of \a __n bytes to EEPROM address \a __dst from \a __src.
+ \note The argument order is mismatch with common functions like strcpy().
+ */
+void eeprom_write_block (const void *__src, void *__dst, size_t __n);
+
+
+/** \ingroup avr_eeprom
+ Update a byte \a __value to EEPROM address \a __p.
+ */
+void eeprom_update_byte (uint8_t *__p, uint8_t __value);
+
+/** \ingroup avr_eeprom
+ Update a word \a __value to EEPROM address \a __p.
+ */
+void eeprom_update_word (uint16_t *__p, uint16_t __value);
+
+/** \ingroup avr_eeprom
+ Update a 32-bit double word \a __value to EEPROM address \a __p.
+ */
+void eeprom_update_dword (uint32_t *__p, uint32_t __value);
+
+/** \ingroup avr_eeprom
+ Update a float \a __value to EEPROM address \a __p.
+ */
+void eeprom_update_float (float *__p, float __value);
+
+/** \ingroup avr_eeprom
+ Update a block of \a __n bytes to EEPROM address \a __dst from \a __src.
+ \note The argument order is mismatch with common functions like strcpy().
+ */
+void eeprom_update_block (const void *__src, void *__dst, size_t __n);
+
+
+/** \name IAR C compatibility defines */
+/*@{*/
+
+/** \def _EEPUT
+ \ingroup avr_eeprom
+ Write a byte to EEPROM. Compatibility define for IAR C. */
+#define _EEPUT(addr, val) eeprom_write_byte ((uint8_t *)(addr), (uint8_t)(val))
+
+/** \def __EEPUT
+ \ingroup avr_eeprom
+ Write a byte to EEPROM. Compatibility define for IAR C. */
+#define __EEPUT(addr, val) eeprom_write_byte ((uint8_t *)(addr), (uint8_t)(val))
+
+/** \def _EEGET
+ \ingroup avr_eeprom
+ Read a byte from EEPROM. Compatibility define for IAR C. */
+#define _EEGET(var, addr) (var) = eeprom_read_byte ((const uint8_t *)(addr))
+
+/** \def __EEGET
+ \ingroup avr_eeprom
+ Read a byte from EEPROM. Compatibility define for IAR C. */
+#define __EEGET(var, addr) (var) = eeprom_read_byte ((const uint8_t *)(addr))
+
+/*@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !__ASSEMBLER__ */
+#endif /* E2END || defined(__DOXYGEN__) || defined(__COMPILING_AVR_LIBC__) */
+#endif /* !_AVR_EEPROM_H_ */