X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Fpgm.h;h=0369186a4014bcf8d274ba51224e09f446a93c4e;hb=bc30005bd88b5a7673c45d1dd09c9240fbb00db6;hp=d5db5dec1a7e7c909c1243cc9dfab1d1fa251063;hpb=734cd5300d75a1624fe328eb9917d0cb842e0e41;p=bertos.git diff --git a/bertos/cpu/pgm.h b/bertos/cpu/pgm.h index d5db5dec..0369186a 100644 --- a/bertos/cpu/pgm.h +++ b/bertos/cpu/pgm.h @@ -43,7 +43,6 @@ * \note This module contains code ripped out from avr-libc, * which is distributed under a 3-clause BSD license. * - * \version $Id:$ * \author Bernie Innocenti */ #ifndef MWARE_PGM_H @@ -57,7 +56,7 @@ #if CPU_AVR #ifdef __AVR_ENHANCED__ - #define pgm_read_char(addr) \ + #define pgm_read8(addr) \ ({ \ uint16_t __addr16 = (uint16_t)(addr); \ uint8_t __result; \ @@ -69,7 +68,7 @@ ); \ __result; \ }) - #define pgm_read_uint16_t(addr) \ + #define pgm_read16(addr) \ ({ \ uint16_t __addr16 = (uint16_t)(addr); \ uint16_t __result; \ @@ -86,7 +85,7 @@ #else /* !__AVR_ENHANCED__ */ - #define pgm_read_char(addr) \ + #define pgm_read8(addr) \ ({ \ uint16_t __addr16 = (uint16_t)(addr); \ uint8_t __result; \ @@ -100,7 +99,7 @@ ); \ __result; \ }) - #define pgm_read_uint16_t(addr) \ + #define pgm_read16(addr) \ ({ \ uint16_t __addr16 = (uint16_t)(addr); \ uint16_t __result; \ @@ -120,12 +119,7 @@ #endif /* !__AVR_ENHANCED__ */ - #if SIZEOF_INT == 2 - #define pgm_read_int(addr) ((int)pgm_read_uint16_t(addr)) - #else - #error Missing support for CPU word size != 16bit - #endif - + #define pgm_read32(addr) ((uint32_t)(pgm_read16(addr) | (((uint32_t)pgm_read16(((const uint8_t *)(addr)) + 2)) << 16))) #ifndef PROGMEM #define PROGMEM __attribute__((__progmem__)) #endif @@ -140,6 +134,25 @@ #error Missing CPU support #endif + +#if !CPU_HARVARD + #define pgm_read8(a) (*(const uint8_t *)(a)) + #define pgm_read16(a) (*(const uint16_t *)(a)) + #define pgm_read32(a) (*(const uint32_t *)(a)) +#endif + +#define pgm_read_char(a) pgm_read8(a) +#define pgm_read_uint16_t(addr) pgm_read16(addr) + + +#if SIZEOF_INT == 2 + #define pgm_read_int(addr) ((int)pgm_read16(addr)) +#elif SIZEOF_INT == 4 + #define pgm_read_int(addr) ((int)pgm_read32(addr)) +#else + #error Missing support for CPU word size! +#endif + #ifndef PSTR #define PSTR /* nothing */ #endif @@ -197,16 +210,23 @@ typedef PROGMEM uint32_t pgm_uint32_t; * \{ */ #ifdef _PROGMEM - #define PGM_READ_CHAR(s) pgm_read_char(s) + #define PGM_READ8(a) pgm_read8(a) + #define PGM_READ16(a) pgm_read16(a) + #define PGM_READ32(a) pgm_read32(a) #define PGM_FUNC(x) PFUNC(x) #define PGM_STR(x) PSTR(x) #define PGM_ATTR PROGMEM #else - #define PGM_READ_CHAR(s) (*(s)) + #define PGM_READ8(a) (*(const uint8_t *)(a)) + #define PGM_READ16(a) (*(const uint16_t *)(a)) + #define PGM_READ32(a) (*(const uint32_t *)(a)) #define PGM_FUNC(x) x #define PGM_STR(x) x #define PGM_ATTR /* nothing */ #endif + +#define PGM_READ_CHAR(addr) PGM_READ8(addr) + /* \} */