]> git.pld-linux.org Git - packages/crossavr-libc.git/blame - 303-avr-libc-avrtc536.patch
- synchronized patches with official AVR toolchain 3.4.1.830
[packages/crossavr-libc.git] / 303-avr-libc-avrtc536.patch
CommitLineData
9fe267c2
PZ
1diff -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)
This page took 0.044372 seconds and 4 git commands to generate.