]>
Commit | Line | Data |
---|---|---|
9fe267c2 PZ |
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 | |
5 | __result; \ | |
6 | })) | |
7 | ||
8 | +#define __LPM_tiny__(addr) \ | |
9 | +(__extension__({ \ | |
10 | + uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ | |
11 | + uint8_t __result; \ | |
12 | + __asm__ \ | |
13 | + ( \ | |
14 | + "ld %0, z" "\n\t" \ | |
15 | + : "=r" (__result) \ | |
16 | + : "z" (__addr16) \ | |
17 | + ); \ | |
18 | + __result; \ | |
19 | +})) | |
20 | + | |
21 | #define __LPM_enhanced__(addr) \ | |
22 | (__extension__({ \ | |
23 | uint16_t __addr16 = (uint16_t)(addr); \ | |
24 | @@ -450,6 +463,20 @@ typedef uint64_t prog_uint64_t __attrib | |
25 | __result; \ | |
26 | })) | |
27 | ||
28 | +#define __LPM_word_tiny__(addr) \ | |
29 | +(__extension__({ \ | |
30 | + uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ | |
31 | + uint16_t __result; \ | |
32 | + __asm__ \ | |
33 | + ( \ | |
34 | + "ld %A0, z+" "\n\t" \ | |
35 | + "ld %B0, z" "\n\t" \ | |
36 | + : "=r" (__result), "=z" (__addr16) \ | |
37 | + : "1" (__addr16) \ | |
38 | + ); \ | |
39 | + __result; \ | |
40 | +})) | |
41 | + | |
42 | #define __LPM_word_enhanced__(addr) \ | |
43 | (__extension__({ \ | |
44 | uint16_t __addr16 = (uint16_t)(addr); \ | |
45 | @@ -488,6 +515,22 @@ typedef uint64_t prog_uint64_t __attrib | |
46 | __result; \ | |
47 | })) | |
48 | ||
49 | +#define __LPM_dword_tiny__(addr) \ | |
50 | +(__extension__({ \ | |
51 | + uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ | |
52 | + uint32_t __result; \ | |
53 | + __asm__ \ | |
54 | + ( \ | |
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) \ | |
60 | + : "1" (__addr16) \ | |
61 | + ); \ | |
62 | + __result; \ | |
63 | +})) | |
64 | + | |
65 | #define __LPM_dword_enhanced__(addr) \ | |
66 | (__extension__({ \ | |
67 | uint16_t __addr16 = (uint16_t)(addr); \ | |
68 | @@ -528,6 +571,22 @@ typedef uint64_t prog_uint64_t __attrib | |
69 | __result; \ | |
70 | })) | |
71 | ||
72 | +#define __LPM_float_tiny__(addr) \ | |
73 | +(__extension__({ \ | |
74 | + uint16_t __addr16 = (uint16_t)(addr) + __AVR_TINY_PM_BASE_ADDRESS__; \ | |
75 | + float __result; \ | |
76 | + __asm__ \ | |
77 | + ( \ | |
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) \ | |
83 | + : "1" (__addr16) \ | |
84 | + ); \ | |
85 | + __result; \ | |
86 | +})) | |
87 | + | |
88 | #define __LPM_float_enhanced__(addr) \ | |
89 | (__extension__({ \ | |
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) | |
95 | +/* | |
96 | +Macro to read data from program memory for avr tiny parts(tiny 4/5/9/10/20/40). | |
97 | +why: | |
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 | |
102 | +Bug: avrtc-536 | |
103 | +*/ | |
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) | |
109 | #else | |
110 | #define __LPM(addr) __LPM_classic__(addr) | |
111 | #define __LPM_word(addr) __LPM_word_classic__(addr) |