I am writing something that can parse the genre code from a MP3 file and fetch a string. ( more info http://www.digitaldeliftp.com/Re... )
I want the code to be compatible with AVR, ARM, and x86 (I would make it work on Xmega but I don't really own Xmega).
I am wondering... does my code look like it will work for extra large AVR devices, even ones that need far pointers instead of near pointers? I don't really own a big enough AVR to test it on.
#if defined(__AVR__) #include <avr/pgmspace.h> #if FLASHEND <= 0xFFFF #define mgstr_t uint16_t #else #define mgstr_t uint32_t #endif #else // ARM or x86 #define PROGMEM #define mgstr_t char* #endif static const char genrestr_blues[] PROGMEM = "Blues"; static const char genrestr_classic_rock[] PROGMEM = "Classic_Rock"; static const char genrestr_country[] PROGMEM = "Country"; static const char genrestr_dance[] PROGMEM = "Dance"; static const char genrestr_disco[] PROGMEM = "Disco"; static const char genrestr_funk[] PROGMEM = "Funk"; static const char genrestr_grunge[] PROGMEM = "Grunge"; const mgstr_t music_genres_tbl[] PROGMEM = { (mgstr_t)genrestr_blues, (mgstr_t)genrestr_classic_rock, (mgstr_t)genrestr_country, (mgstr_t)genrestr_dance, (mgstr_t)genrestr_disco, (mgstr_t)genrestr_funk, (mgstr_t)genrestr_grunge, };
#ifdef __AVR__ #if FLASHEND > 0x10000 strcpy_PF((char*)tmp, (uint_farptr_t)pgm_read_dword_far(&(music_genres_tbl[genre_code]))); #else strcpy_P((char*)tmp, (const char*)pgm_read_word(&(music_genres_tbl[genre_code]))); #endif #else // ARM or x86 strcpy((char*)tmp, (const char*)(music_genres_tbl[genre_code])); #endif
Thanks