94 |
extern "C" { |
extern "C" { |
95 |
#endif |
#endif |
96 |
|
|
97 |
#if defined(DOXYGEN) |
#if defined(__DOXYGEN__) |
98 |
/* |
/* |
99 |
* Doxygen doesn't grok the appended attribute syntax of |
* Doxygen doesn't grok the appended attribute syntax of |
100 |
* GCC, and confuses the typedefs with function decls, so |
* GCC, and confuses the typedefs with function decls, so |
202 |
typedef uint32_t prog_uint32_t PROGMEM; |
typedef uint32_t prog_uint32_t PROGMEM; |
203 |
typedef int64_t prog_int64_t PROGMEM; |
typedef int64_t prog_int64_t PROGMEM; |
204 |
typedef uint64_t prog_uint64_t PROGMEM; |
typedef uint64_t prog_uint64_t PROGMEM; |
205 |
#endif /* defined(DOXYGEN) */ |
#endif /* defined(__DOXYGEN__) */ |
206 |
|
|
207 |
/* Although in C, we can get away with just using __c, it does not work in |
/* Although in C, we can get away with just using __c, it does not work in |
208 |
C++. We need to use &__c[0] to avoid the compiler puking. Dave Hylands |
C++. We need to use &__c[0] to avoid the compiler puking. Dave Hylands |
214 |
returned by &__c[0] is a prog_char *, which explains why it works |
returned by &__c[0] is a prog_char *, which explains why it works |
215 |
fine. */ |
fine. */ |
216 |
|
|
217 |
#if defined(DOXYGEN) |
#if defined(__DOXYGEN__) |
218 |
/* |
/* |
219 |
* The #define below is just a dummy that serves documentation |
* The #define below is just a dummy that serves documentation |
220 |
* purposes only. |
* purposes only. |
364 |
#define pgm_read_dword_near(address_short) \ |
#define pgm_read_dword_near(address_short) \ |
365 |
__LPM_dword((uint16_t)(address_short)) |
__LPM_dword((uint16_t)(address_short)) |
366 |
|
|
367 |
#if defined(RAMPZ) && !defined(__USING_MINT8) |
#if defined(RAMPZ) || defined(__DOXYGEN__) |
368 |
|
|
369 |
/* Only for devices with more than 64K of program memory. |
/* Only for devices with more than 64K of program memory. |
370 |
RAMPZ must be defined (see iom103.h, iom128.h). |
RAMPZ must be defined (see iom103.h, iom128.h). |
371 |
|
*/ |
|
These can not be defined if the user is compiling with the -mint8 option |
|
|
since (u)int32_t is not defined in that case. */ |
|
372 |
|
|
373 |
/* The classic functions are needed for ATmega103. */ |
/* The classic functions are needed for ATmega103. */ |
374 |
|
|
545 |
|
|
546 |
#define pgm_read_dword_far(address_long) __ELPM_dword((uint32_t)(address_long)) |
#define pgm_read_dword_far(address_long) __ELPM_dword((uint32_t)(address_long)) |
547 |
|
|
548 |
#endif /* RAMPZ and ! __USING_MINT8 */ |
#endif /* RAMPZ or __DOXYGEN__ */ |
549 |
|
|
550 |
/** \ingroup avr_pgmspace |
/** \ingroup avr_pgmspace |
551 |
\def pgm_read_byte(address_short) |
\def pgm_read_byte(address_short) |
607 |
extern char *strncat_P(char *, PGM_P, size_t); |
extern char *strncat_P(char *, PGM_P, size_t); |
608 |
extern char *strncpy_P(char *, PGM_P, size_t); |
extern char *strncpy_P(char *, PGM_P, size_t); |
609 |
|
|
|
#if 0 /* not implemented yet */ |
|
|
extern int printf_P(PGM_P, ...); |
|
|
extern int puts_P(PGM_P); |
|
|
extern int scanf_P(PGM_P, ...); |
|
|
extern int sprintf_P(char *, PGM_P, ...); |
|
|
extern int sscanf_P(const char *, PGM_P, ...); |
|
|
extern PGM_P strerror_P(int); |
|
|
#endif |
|
|
|
|
610 |
#ifdef __cplusplus |
#ifdef __cplusplus |
611 |
} |
} |
612 |
#endif |
#endif |