-/*!
+/**
* \file
* <!--
- * Copyright 2005 Develer S.r.l. (http://www.develer.com/)
- * This file is part of DevLib - See README.devlib for information.
+ * This file is part of BeRTOS.
+ *
+ * Bertos is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * As a special exception, you may use this file as part of a free software
+ * library without restriction. Specifically, if other files instantiate
+ * templates or use macros or inline functions from this file, or you compile
+ * this file and link it with other files to produce an executable, this
+ * file does not by itself cause the resulting executable to be covered by
+ * the GNU General Public License. This exception does not however
+ * invalidate any other reasons why the executable file might be covered by
+ * the GNU General Public License.
+ *
+ * Copyright 2005 ,2006, 2007 Develer S.r.l. (http://www.develer.com/)
+ *
* -->
*
* \brief Support for reading program memory on Harvard architectures.
#ifndef MWARE_PGM_H
#define MWARE_PGM_H
-#include <cfg/cpu_detect.h>
#include <cfg/compiler.h> /* For intXX_t */
+#include <cpu/detect.h>
+#include <cpu/attr.h> /* For CPU_HARVARD */
+#include <cpu/types.h> /* For SIZEOF_INT */
#if CPU_AVR
); \
__result; \
})
- #if 0 // 128/103
- #define pgm_read_uint16_t(addr) \
- ({ \
- uint32_t __addr32 = (uint32_t)(addr); \
- uint16_t __result; \
- __asm__ \
- ( \
- "out %2, %C1" "\n\t" \
- "movw r30, %1" "\n\t" \
- "elpm %A0, Z+" "\n\t" \
- "elpm %B0, Z" "\n\t" \
- : "=r" (__result) \
- : "r" (__addr32), \
- "I" (_SFR_IO_ADDR(RAMPZ)) \
- : "r30", "r31" \
- ); \
- __result; \
- })
- #endif
-
#define pgm_read_uint16_t(addr) \
({ \
uint16_t __addr16 = (uint16_t)(addr); \
})
- #else
+ #else /* !__AVR_ENHANCED__ */
+
#define pgm_read_char(addr) \
({ \
uint16_t __addr16 = (uint16_t)(addr); \
); \
__result; \
})
- #if 0 // 128/103
- #define pgm_read_uint16_t(addr) \
- ({ \
- uint32_t __addr32 = (uint32_t)(addr); \
- uint16_t __result; \
- __asm__ \
- ( \
- "out %2, %C1" "\n\t" \
- "mov r31, %B1" "\n\t" \
- "mov r30, %A1" "\n\t" \
- "elpm" "\n\t" \
- "mov %A0, r0" "\n\t" \
- "in r0, %2" "\n\t" \
- "adiw r30, 1" "\n\t" \
- "adc r0, __zero_reg__" "\n\t" \
- "out %2, r0" "\n\t" \
- "elpm" "\n\t" \
- "mov %B0, r0" "\n\t" \
- : "=r" (__result) \
- : "r" (__addr32), \
- "I" (_SFR_IO_ADDR(RAMPZ)) \
- : "r0", "r30", "r31" \
- ); \
- __result; \
- })
- #endif
#define pgm_read_uint16_t(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
#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).
* \{
*/
typedef PROGMEM uint32_t pgm_uint32_t;
/*\}*/
-/*!
+/**
* \name PGM support macros.
*
* These macros enable dual compilation of code for both program
*/
#ifdef _PROGMEM
#define PGM_READ_CHAR(s) pgm_read_char(s)
- #define PGM_FUNC(x) x ## _P
- #define PGM_STR(x) PSTR(x)
+ #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_STR(x) x
#define PGM_ATTR /* nothing */
#endif
/* \} */