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