1 diff -Naurp include/avr/pgmspace.h include/avr/pgmspace.h
2 --- include/avr/pgmspace.h 2011-12-29 14:21:50.000000000 +0530
3 +++ include/avr/pgmspace.h 2012-06-04 15:08:29.000000000 +0530
4 @@ -419,6 +419,19 @@ typedef uint64_t prog_uint64_t __attrib
8 +#define __LPM_tiny__(addr) \
10 + uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \
21 #define __LPM_enhanced__(addr) \
23 uint16_t __addr16 = (uint16_t)(addr); \
24 @@ -450,6 +463,20 @@ typedef uint64_t prog_uint64_t __attrib
28 +#define __LPM_word_tiny__(addr) \
30 + uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \
31 + uint16_t __result; \
34 + "ld %A0, z+" "\n\t" \
35 + "ld %B0, z" "\n\t" \
36 + : "=r" (__result), "=z" (__addr16) \
42 #define __LPM_word_enhanced__(addr) \
44 uint16_t __addr16 = (uint16_t)(addr); \
45 @@ -488,6 +515,22 @@ typedef uint64_t prog_uint64_t __attrib
49 +#define __LPM_dword_tiny__(addr) \
51 + uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \
52 + uint32_t __result; \
55 + "ld %A0, z+" "\n\t" \
56 + "ld %B0, z+" "\n\t" \
57 + "ld %C0, z+" "\n\t" \
58 + "ld %D0, z" "\n\t" \
59 + : "=r" (__result), "=z" (__addr16) \
65 #define __LPM_dword_enhanced__(addr) \
67 uint16_t __addr16 = (uint16_t)(addr); \
68 @@ -528,6 +571,22 @@ typedef uint64_t prog_uint64_t __attrib
72 +#define __LPM_float_tiny__(addr) \
74 + uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \
78 + "ld %A0, z+" "\n\t" \
79 + "ld %B0, z+" "\n\t" \
80 + "ld %C0, z+" "\n\t" \
81 + "ld %D0, z" "\n\t" \
82 + : "=r" (__result), "=z" (__addr16) \
88 #define __LPM_float_enhanced__(addr) \
90 uint16_t __addr16 = (uint16_t)(addr); \
91 @@ -549,6 +608,20 @@ typedef uint64_t prog_uint64_t __attrib
92 #define __LPM_word(addr) __LPM_word_enhanced__(addr)
93 #define __LPM_dword(addr) __LPM_dword_enhanced__(addr)
94 #define __LPM_float(addr) __LPM_float_enhanced__(addr)
96 +Macro to read data from program memory for avr tiny parts(tiny 4/5/9/10/20/40).
98 +- LPM instruction is not available in AVR_TINY instruction set.
99 +- Programs are executed starting from address 0x0000 in program memory.
100 +But it must be addressed starting from 0x4000 when accessed via data memory.
101 +Reference: TINY device (ATTiny 4,5,9,10,20 and 40) datasheets
104 +#elif defined (__AVR_TINY__)
105 +#define __LPM(addr) __LPM_tiny__(addr)
106 +#define __LPM_word(addr) __LPM_word_tiny__(addr)
107 +#define __LPM_dword(addr) __LPM_dword_tiny__(addr)
108 +#define __LPM_float(addr) __LPM_float_tiny__(addr)
110 #define __LPM(addr) __LPM_classic__(addr)
111 #define __LPM_word(addr) __LPM_word_classic__(addr)