Merge from kseries.
[bertos.git] / mware / pgm.h
index 87b46b2822c49ba598766fb9163cef380d5e9b65..5f10d002ea5a6c153048467cd1746da88a79a20b 100755 (executable)
@@ -1,4 +1,4 @@
-/*!
+/**
  * \file
  * <!--
  * Copyright 2005 Develer S.r.l. (http://www.develer.com/)
@@ -23,6 +23,8 @@
 #define MWARE_PGM_H
 
 #include <cfg/cpu_detect.h>
+#include <cfg/compiler.h> /* For intXX_t */
+#include <cfg/cpu.h> /* For CPU_HARVARD */
 
 #if CPU_AVR
 
@@ -74,7 +76,8 @@
                })
 
 
-       #else
+       #else /* !__AVR_ENHANCED__ */
+
                #define pgm_read_char(addr) \
                ({ \
                        uint16_t __addr16 = (uint16_t)(addr); \
                        __result; \
                })
 
+       #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
 
+       #ifndef PROGMEM
        #define PROGMEM  __attribute__((__progmem__))
+       #endif
+       #ifndef PSTR
        #define PSTR(s) ({ static const char __c[] PROGMEM = (s); &__c[0]; })
+       #endif
+       #ifndef PFUNC
+       #define PFUNC(x)      x ## _P
+       #endif
 
 #elif CPU_HARVARD
        #error Missing CPU support
 #define PSTR            /* nothing */
 #endif
 
+#ifndef PFUNC
+#define PFUNC(x) x
+#endif
+
 #ifndef PROGMEM
-#define PROGMEM                /* nothing */
+#define PROGMEM         /* nothing */
 #endif
 
-/*!
+/**
  * \name Types for variables stored in program memory (harvard processors).
  * \{
  */
@@ -163,7 +183,7 @@ typedef PROGMEM int32_t pgm_int32_t;
 typedef PROGMEM uint32_t pgm_uint32_t;
 /*\}*/
 
-/*!
+/**
  * \name PGM support macros.
  *
  * These macros enable dual compilation of code for both program
@@ -196,11 +216,13 @@ typedef PROGMEM uint32_t pgm_uint32_t;
  */
 #ifdef _PROGMEM
        #define PGM_READ_CHAR(s) pgm_read_char(s)
-       #define PGM_FUNC(x)      x ## _P
+       #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_FUNC(x)      x
+       #define PGM_STR(x)       x
        #define PGM_ATTR         /* nothing */
 #endif
 /* \} */