X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcpu%2Fpgm.h;h=0369186a4014bcf8d274ba51224e09f446a93c4e;hb=78d223e73e58bdd267f59994a52c618b4eb277fa;hp=3fac0c72c584eb7ffc72005115e54f592fc560c2;hpb=6eb6ebb5ae5953a27977f0ef66a36344462b949a;p=bertos.git diff --git a/bertos/cpu/pgm.h b/bertos/cpu/pgm.h index 3fac0c72..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) + /* \} */