From a36b1d4083e5cf34df1b217516be28471e7d0dc7 Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Sun, 15 Jan 2006 18:20:18 +0000 Subject: [PATCH] New plugin loader. Solves the crashes introduced with the .bss changes while keeping the small binary size. The model & api version check is now part of the plugin loader. Codecs are not yet adapted, but the old method still works for them. Simulator plugins are not (yet) version-checked. API version numbering restarted, as this is an all-new system. Uses the target ID from configure, so don't change that too often. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8349 a1c6a512-1295-4272-9138-f99709370657 --- apps/Makefile | 2 +- apps/plugin.c | 137 +++++++++++------------ apps/plugin.h | 115 +++++++++---------- apps/plugins/Makefile | 2 +- apps/plugins/alpine_cdc.c | 6 +- apps/plugins/battery_test.c | 3 +- apps/plugins/bounce.c | 3 +- apps/plugins/calculator.c | 3 +- apps/plugins/calendar.c | 5 +- apps/plugins/chessclock.c | 4 +- apps/plugins/chip8.c | 6 +- apps/plugins/clock.c | 3 +- apps/plugins/credits.c | 3 +- apps/plugins/cube.c | 3 +- apps/plugins/databox/Makefile | 2 +- apps/plugins/databox/databox.c | 7 +- apps/plugins/demystify.c | 11 +- apps/plugins/dict.c | 3 +- apps/plugins/euroconverter.c | 7 +- apps/plugins/favorites.c | 7 +- apps/plugins/fire.c | 9 +- apps/plugins/firmware_flash.c | 9 +- apps/plugins/flipit.c | 3 +- apps/plugins/grayscale.c | 7 +- apps/plugins/helloworld.c | 9 +- apps/plugins/iriverify.c | 2 +- apps/plugins/jackpot.c | 7 +- apps/plugins/jewels.c | 5 +- apps/plugins/jpeg.c | 7 +- apps/plugins/logo.c | 3 +- apps/plugins/mandelbrot.c | 3 +- apps/plugins/metronome.c | 3 +- apps/plugins/midi2wav.c | 5 +- apps/plugins/minesweeper.c | 5 +- apps/plugins/mosaique.c | 3 +- apps/plugins/mp3_encoder.c | 4 +- apps/plugins/nim.c | 8 +- apps/plugins/oscillograph.c | 3 +- apps/plugins/oscilloscope.c | 3 +- apps/plugins/plasma.c | 9 +- apps/plugins/plugin.lds | 13 ++- apps/plugins/pong.c | 6 +- apps/plugins/rockblox.c | 6 +- apps/plugins/rockbox_flash.c | 6 +- apps/plugins/rockboy.c | 6 +- apps/plugins/rockboy/Makefile | 2 +- apps/plugins/rockboy/rockboy.c | 9 +- apps/plugins/search.c | 4 +- apps/plugins/searchengine/Makefile | 2 +- apps/plugins/searchengine/searchengine.c | 9 +- apps/plugins/sliding_puzzle.c | 3 +- apps/plugins/snake.c | 3 +- apps/plugins/snake2.c | 3 +- apps/plugins/snow.c | 3 +- apps/plugins/sokoban.c | 3 +- apps/plugins/solitaire.c | 3 +- apps/plugins/sort.c | 3 +- apps/plugins/splitedit.c | 2 + apps/plugins/star.c | 3 +- apps/plugins/starfield.c | 9 +- apps/plugins/stats.c | 3 +- apps/plugins/stopwatch.c | 3 +- apps/plugins/sudoku.c | 5 +- apps/plugins/vbrfix.c | 4 +- apps/plugins/video.c | 7 +- apps/plugins/viewer.c | 5 +- apps/plugins/vu_meter.c | 3 +- apps/plugins/wav2wv.c | 4 +- apps/plugins/wormlet.c | 3 +- tools/configure | 6 +- 70 files changed, 270 insertions(+), 310 deletions(-) diff --git a/apps/Makefile b/apps/Makefile index 278e1c7118..c6e5d2dbcc 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -34,7 +34,7 @@ ifdef APPEXTRA INCLUDES += $(patsubst %,-I%,$(subst :, ,$(APPEXTRA))) endif -CFLAGS = $(GCCOPTS) $(INCLUDES) $(TARGET) $(DEFINES) \ +CFLAGS = $(GCCOPTS) $(INCLUDES) $(TARGET) $(DEFINES) -DTARGET_ID=$(TARGET_ID) \ -DAPPSVERSION=\"$(VERSION)\" $(EXTRA_DEFINES) -DMEM=${MEMORYSIZE} OBJS := $(OBJDIR)/lang.o $(SRC:%.c=$(OBJDIR)/%.o) diff --git a/apps/plugin.c b/apps/plugin.c index 9a20827e26..0997b0a901 100644 --- a/apps/plugin.c +++ b/apps/plugin.c @@ -78,13 +78,8 @@ static bool plugin_loaded = false; static int plugin_size = 0; static void (*pfn_tsr_exit)(void) = NULL; /* TSR exit callback */ -static int plugin_test(int api_version, int model, int memsize); - static const struct plugin_api rockbox_api = { - PLUGIN_API_VERSION, - plugin_test, - /* lcd */ lcd_set_contrast, lcd_clear_display, @@ -135,6 +130,7 @@ static const struct plugin_api rockbox_api = { checkbox, font_get, font_getstringsize, + font_get_width, #endif backlight_on, backlight_off, @@ -243,9 +239,18 @@ static const struct plugin_api rockbox_api = { strcat, memcmp, strcasestr, + /* unicode stuff */ + utf8decode, + iso_decode, + utf16LEdecode, + utf16BEdecode, + utf8encode, + utf8length, /* sound */ sound_set, + sound_min, + sound_max, #ifndef SIMULATOR mp3_play_data, mp3_play_pause, @@ -307,6 +312,21 @@ static const struct plugin_api rockbox_api = { &rundb_fd, &rundb_initialized, + /* menu */ + menu_init, + menu_exit, + menu_show, + menu_run, + menu_cursor, + menu_description, + menu_delete, + menu_count, + menu_moveup, + menu_movedown, + menu_draw, + menu_insert, + menu_set_cursor, + /* misc */ srand, rand, @@ -337,39 +357,13 @@ static const struct plugin_api rockbox_api = { #endif #ifdef HAVE_LCD_BITMAP read_bmp_file, + screen_dump_set_hook, #endif show_logo, /* new stuff at the end, sort into place next time the API gets incompatible */ - menu_init, - menu_exit, - menu_show, - menu_run, - menu_cursor, - menu_description, - menu_delete, - menu_count, - menu_moveup, - menu_movedown, - menu_draw, - menu_insert, - menu_set_cursor, - -#ifdef HAVE_LCD_BITMAP - screen_dump_set_hook, - font_get_width, -#endif - utf8decode, - iso_decode, - utf16LEdecode, - utf16BEdecode, - utf8encode, - utf8length, - - sound_min, - sound_max, }; int plugin_load(const char* plugin, void* parameter) @@ -377,7 +371,8 @@ int plugin_load(const char* plugin, void* parameter) enum plugin_status (*plugin_start)(struct plugin_api* api, void* param); int rc; #ifndef SIMULATOR - char buf[64]; + struct plugin_header header; + ssize_t readsize; #endif int fd; @@ -408,28 +403,50 @@ int plugin_load(const char* plugin, void* parameter) #else fd = open(plugin, O_RDONLY); if (fd < 0) { - snprintf(buf, sizeof buf, str(LANG_PLUGIN_CANT_OPEN), plugin); - gui_syncsplash(HZ*2, true, buf); + gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_CANT_OPEN), plugin); return fd; } - - /* zero out plugin buffer to ensure a properly zeroed bss area */ - memset(pluginbuf, 0, PLUGIN_BUFFER_SIZE); - plugin_start = (void*)&pluginbuf; - plugin_size = read(fd, plugin_start, PLUGIN_BUFFER_SIZE); + readsize = read(fd, &header, sizeof(header)); + close(fd); + /* Close for now. Less code than doing it in all error checks. + * Would need to seek back anyway. */ + + if (readsize != sizeof(header)) { + gui_syncsplash(HZ*2, true, str(LANG_READ_FAILED), plugin); + return -1; + } + if (header.magic != PLUGIN_MAGIC + || header.target_id != TARGET_ID + || header.load_addr != pluginbuf + || header.end_addr > pluginbuf + PLUGIN_BUFFER_SIZE) { + gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_WRONG_MODEL)); + return -1; + } + if (header.api_version > PLUGIN_API_VERSION + || header.api_version < PLUGIN_MIN_API_VERSION) { + gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_WRONG_VERSION)); + return -1; + } + + /* zero out plugin buffer to ensure a properly zeroed bss area */ + memset(pluginbuf, 0, header.end_addr - pluginbuf); + + fd = open(plugin, O_RDONLY); + if (fd < 0) { + gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_CANT_OPEN), plugin); + return fd; + } + readsize = read(fd, pluginbuf, PLUGIN_BUFFER_SIZE); close(fd); - if (plugin_size < 0) { + + if (readsize < 0) { /* read error */ - snprintf(buf, sizeof buf, str(LANG_READ_FAILED), plugin); - gui_syncsplash(HZ*2, true, buf); - return -1; - } - if (plugin_size == 0) { - /* loaded a 0-byte plugin, implying it's not for this model */ - gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_WRONG_MODEL)); + gui_syncsplash(HZ*2, true, str(LANG_READ_FAILED), plugin); return -1; } + plugin_start = header.entry_point; + plugin_size = header.end_addr - header.load_addr; #endif plugin_loaded = true; @@ -458,14 +475,6 @@ int plugin_load(const char* plugin, void* parameter) case PLUGIN_USB_CONNECTED: return PLUGIN_USB_CONNECTED; - case PLUGIN_WRONG_API_VERSION: - gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_WRONG_VERSION)); - break; - - case PLUGIN_WRONG_MODEL: - gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_WRONG_MODEL)); - break; - default: gui_syncsplash(HZ*2, true, str(LANG_PLUGIN_ERROR)); break; @@ -521,19 +530,3 @@ void plugin_tsr(void (*exit_callback)(void)) { pfn_tsr_exit = exit_callback; /* remember the callback for later */ } - - -static int plugin_test(int api_version, int model, int memsize) -{ - if (api_version < PLUGIN_MIN_API_VERSION || - api_version > PLUGIN_API_VERSION) - return PLUGIN_WRONG_API_VERSION; - - if (model != MODEL) - return PLUGIN_WRONG_MODEL; - - if (memsize != MEM) - return PLUGIN_WRONG_MODEL; - - return PLUGIN_OK; -} diff --git a/apps/plugin.h b/apps/plugin.h index f935809949..bf8f34ab9e 100644 --- a/apps/plugin.h +++ b/apps/plugin.h @@ -90,44 +90,23 @@ #define PREFIX(_x_) _x_ #endif +#define PLUGIN_MAGIC 0x526F634B /* RocK */ + /* increase this every time the api struct changes */ -#define PLUGIN_API_VERSION 54 +#define PLUGIN_API_VERSION 1 /* update this to latest version if a change to the api struct breaks backwards compatibility (and please take the opportunity to sort in any new function which are "waiting" at the end of the function table) */ -#define PLUGIN_MIN_API_VERSION 51 +#define PLUGIN_MIN_API_VERSION 1 /* plugin return codes */ enum plugin_status { PLUGIN_OK = 0, PLUGIN_USB_CONNECTED, - - PLUGIN_WRONG_API_VERSION = -1, - PLUGIN_WRONG_MODEL = -2, - PLUGIN_ERROR = -3, + PLUGIN_ERROR = -1, }; -/* different (incompatible) plugin models */ -enum model { - PLAYER, - RECORDER -}; - -#ifdef HAVE_LCD_CHARCELLS -#define MODEL PLAYER -#else -#define MODEL RECORDER -#endif - -/* compatibility test macro */ -#define TEST_PLUGIN_API(_api_) \ -do { \ - int _rc_ = _api_->plugin_test(PLUGIN_API_VERSION, MODEL, MEM); \ - if (_rc_<0) \ - return _rc_; \ -} while(0) - /* NOTE: To support backwards compatibility, only add new functions at the end of the structure. Every time you add a new function, remember to increase PLUGIN_API_VERSION. If you make changes to the @@ -135,10 +114,6 @@ do { \ version */ struct plugin_api { - /* these two fields must always be first, to ensure - TEST_PLUGIN_API will always work */ - int version; - int (*plugin_test)(int api_version, int model, int memsize); /* lcd */ void (*lcd_set_contrast)(int x); @@ -198,6 +173,7 @@ struct plugin_api { struct font* (*font_get)(int font); int (*font_getstringsize)(const unsigned char *str, int *w, int *h, int fontnumber); + int (*font_get_width)(struct font* pf, unsigned short char_code); #endif void (*backlight_on)(void); void (*backlight_off)(void); @@ -314,9 +290,18 @@ struct plugin_api { char *(*strcat)(char *s1, const char *s2); int (*memcmp)(const void *s1, const void *s2, size_t n); char *(*strcasestr) (const char* phaystack, const char* pneedle); + /* unicode stuff */ + const unsigned char* (*utf8decode)(const unsigned char *utf8, unsigned short *ucs); + unsigned char* (*iso_decode)(const unsigned char *iso, unsigned char *utf8, int cp, int count); + unsigned char* (*utf16LEdecode)(const unsigned char *utf16, unsigned char *utf8, unsigned int count); + unsigned char* (*utf16BEdecode)(const unsigned char *utf16, unsigned char *utf8, unsigned int count); + unsigned char* (*utf8encode)(unsigned long ucs, unsigned char *utf8); + unsigned long (*utf8length)(const unsigned char *utf8); /* sound */ void (*sound_set)(int setting, int value); + int (*sound_min)(int setting); + int (*sound_max)(int setting); #ifndef SIMULATOR void (*mp3_play_data)(const unsigned char* start, int size, void (*get_more)(unsigned char** start, int* size)); void (*mp3_play_pause)(bool play); @@ -378,6 +363,23 @@ struct plugin_api { int *rundb_fd; int *rundb_initialized; + /* menu */ + int (*menu_init)(const struct menu_item* mitems, int count, + int (*callback)(int, int), + const char *button1, const char *button2, const char *button3); + void (*menu_exit)(int menu); + int (*menu_show)(int m); + bool (*menu_run)(int menu); + int (*menu_cursor)(int menu); + char* (*menu_description)(int menu, int position); + void (*menu_delete)(int menu, int position); + int (*menu_count)(int menu); + bool (*menu_moveup)(int menu); + bool (*menu_movedown)(int menu); + void (*menu_draw)(int menu); + void (*menu_insert)(int menu, int position, char *desc, bool (*function) (void)); + void (*menu_set_cursor)(int menu, int position); + /* misc */ void (*srand)(unsigned int seed); int (*rand)(void); @@ -416,43 +418,38 @@ struct plugin_api { #ifdef HAVE_LCD_BITMAP int (*read_bmp_file)(char* filename, int *get_width, int *get_height, char *bitmap, int maxsize); + void (*screen_dump_set_hook)(void (*hook)(int fh)); #endif int (*show_logo)(void); /* new stuff at the end, sort into place next time the API gets incompatible */ - int (*menu_init)(const struct menu_item* mitems, int count, - int (*callback)(int, int), - const char *button1, const char *button2, const char *button3); - void (*menu_exit)(int menu); - int (*menu_show)(int m); - bool (*menu_run)(int menu); - int (*menu_cursor)(int menu); - char* (*menu_description)(int menu, int position); - void (*menu_delete)(int menu, int position); - int (*menu_count)(int menu); - bool (*menu_moveup)(int menu); - bool (*menu_movedown)(int menu); - void (*menu_draw)(int menu); - void (*menu_insert)(int menu, int position, char *desc, bool (*function) (void)); - void (*menu_set_cursor)(int menu, int position); - -#ifdef HAVE_LCD_BITMAP - void (*screen_dump_set_hook)(void (*hook)(int fh)); - int (*font_get_width)(struct font* pf, unsigned short char_code); -#endif - const unsigned char* (*utf8decode)(const unsigned char *utf8, unsigned short *ucs); - unsigned char* (*iso_decode)(const unsigned char *iso, unsigned char *utf8, int cp, int count); - unsigned char* (*utf16LEdecode)(const unsigned char *utf16, unsigned char *utf8, unsigned int count); - unsigned char* (*utf16BEdecode)(const unsigned char *utf16, unsigned char *utf8, unsigned int count); - unsigned char* (*utf8encode)(unsigned long ucs, unsigned char *utf8); - unsigned long (*utf8length)(const unsigned char *utf8); - - int (*sound_min)(int setting); - int (*sound_max)(int setting); }; +#ifndef SIMULATOR +/* plugin header */ +struct plugin_header { + unsigned long magic; + unsigned short target_id; + unsigned short api_version; + unsigned char *load_addr; + unsigned char *end_addr; + enum plugin_status(*entry_point)(struct plugin_api*, void*); +}; +#ifdef PLUGIN +extern unsigned char plugin_start_addr[]; +extern unsigned char plugin_end_addr[]; +#define PLUGIN_HEADER \ + const struct plugin_header __header \ + __attribute__ ((section (".header")))= { \ + PLUGIN_MAGIC, TARGET_ID, PLUGIN_API_VERSION, \ + plugin_start_addr, plugin_end_addr, plugin_start }; +#endif +#else /* SIMULATOR */ +#define PLUGIN_HEADER +#endif + int plugin_load(const char* plugin, void* parameter); void* plugin_get_buffer(int *buffer_size); void* plugin_get_audio_buffer(int *buffer_size); diff --git a/apps/plugins/Makefile b/apps/plugins/Makefile index 45fa7a469d..2ed1a101bb 100644 --- a/apps/plugins/Makefile +++ b/apps/plugins/Makefile @@ -10,7 +10,7 @@ INCLUDES = -I$(FIRMDIR)/include -I$(FIRMDIR)/export -I$(FIRMDIR)/common \ -I$(FIRMDIR)/drivers -I$(APPSDIR) -Ilib -I$(BUILDDIR) CFLAGS = $(GCCOPTS) $(INCLUDES) $(TARGET) $(EXTRA_DEFINES) \ - -DMEM=${MEMORYSIZE} -DPLUGIN + -DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN ifdef APPEXTRA INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA))) diff --git a/apps/plugins/alpine_cdc.c b/apps/plugins/alpine_cdc.c index 874f72265e..91cfb0ecdc 100644 --- a/apps/plugins/alpine_cdc.c +++ b/apps/plugins/alpine_cdc.c @@ -34,6 +34,8 @@ /* Only build for (correct) target */ #if !defined(SIMULATOR) && CONFIG_CPU==SH7034 && !defined(HAVE_MMC) +PLUGIN_HEADER + #ifdef HAVE_LCD_CHARCELLS /* player model */ #define LINES 2 #define COLUMNS 11 @@ -1192,10 +1194,6 @@ int main(void* parameter) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); rb = api; /* copy to global api pointer */ /* now go ahead and have fun! */ diff --git a/apps/plugins/battery_test.c b/apps/plugins/battery_test.c index ac47b001f2..c076ad74e8 100644 --- a/apps/plugins/battery_test.c +++ b/apps/plugins/battery_test.c @@ -29,6 +29,8 @@ to watch. */ +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define BATTERY_TEST_QUIT BUTTON_OFF @@ -136,7 +138,6 @@ enum plugin_status loop(void) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/bounce.c b/apps/plugins/bounce.c index 2a2d520371..7b59841055 100644 --- a/apps/plugins/bounce.c +++ b/apps/plugins/bounce.c @@ -21,6 +21,8 @@ #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + #define SS_TITLE "Bouncer" #define SS_TITLE_FONT 2 @@ -443,7 +445,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) char *off = "[Off] to stop"; int len; - TEST_PLUGIN_API(api); (void)(parameter); rb = api; diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c index 51b9cfacc7..ba18cc1c55 100644 --- a/apps/plugins/calculator.c +++ b/apps/plugins/calculator.c @@ -76,6 +76,8 @@ F3: equal to "=" #ifdef HAVE_LCD_BITMAP #include "math.h" +PLUGIN_HEADER + #define REC_HEIGHT 10 /* blank height = 9 */ #define REC_WIDTH 22 /* blank width = 21 */ @@ -1324,7 +1326,6 @@ Main(); ----------------------------------------------------------------------- */ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/calendar.c b/apps/plugins/calendar.c index 5cb04b565c..464d810342 100644 --- a/apps/plugins/calendar.c +++ b/apps/plugins/calendar.c @@ -23,6 +23,8 @@ #include +PLUGIN_HEADER + static struct plugin_api* rb; static bool leap_year; @@ -664,9 +666,8 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) bool exit = false; int button; - TEST_PLUGIN_API(api); (void)(parameter); - + rb = api; calendar_init(&today, &shown); diff --git a/apps/plugins/chessclock.c b/apps/plugins/chessclock.c index 18ba68014f..73f53c9205 100644 --- a/apps/plugins/chessclock.c +++ b/apps/plugins/chessclock.c @@ -18,6 +18,8 @@ ****************************************************************************/ #include "plugin.h" +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define CHC_QUIT BUTTON_OFF @@ -136,8 +138,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) bool done; int nr; - TEST_PLUGIN_API(api); - (void)parameter; rb=api; diff --git a/apps/plugins/chip8.c b/apps/plugins/chip8.c index 56ce12a388..50e32ed90b 100644 --- a/apps/plugins/chip8.c +++ b/apps/plugins/chip8.c @@ -22,6 +22,8 @@ /* Only build for (correct) target */ #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + static struct plugin_api* rb; /* here is a global api struct pointer */ #define EXTERN static @@ -1276,10 +1278,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { char* filename; - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); rb = api; /* copy to global api pointer */ if (parameter == NULL) diff --git a/apps/plugins/clock.c b/apps/plugins/clock.c index 9c940dc7c3..167a64e6a9 100644 --- a/apps/plugins/clock.c +++ b/apps/plugins/clock.c @@ -80,6 +80,8 @@ Original release, featuring analog / digital modes and a few options. #if defined(HAVE_LCD_BITMAP) && defined(CONFIG_RTC) +PLUGIN_HEADER + #define CLOCK_VERSION "2.60" #define MODE_ANALOG 1 @@ -2875,7 +2877,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) struct tm* current_time; - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/credits.c b/apps/plugins/credits.c index 1b1aadbb46..5fdc215aa3 100644 --- a/apps/plugins/credits.c +++ b/apps/plugins/credits.c @@ -18,6 +18,8 @@ ****************************************************************************/ #include "plugin.h" +PLUGIN_HEADER + void roll_credits(void); const char* const credits[] = { #include "credits.raw" /* generated list of names from docs/CREDITS */ @@ -30,7 +32,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) int j = 0; int btn; - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/cube.c b/apps/plugins/cube.c index e71d8b6e4e..a70e3322e0 100644 --- a/apps/plugins/cube.c +++ b/apps/plugins/cube.c @@ -22,6 +22,8 @@ #include "playergfx.h" #include "xlcd.h" +PLUGIN_HEADER + /* Loops that the values are displayed */ #define DISP_TIME 30 @@ -446,7 +448,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) bool redraw = true; bool exit = false; - TEST_PLUGIN_API(api); (void)(parameter); rb = api; diff --git a/apps/plugins/databox/Makefile b/apps/plugins/databox/Makefile index 78387fd6f1..6a44333b3f 100644 --- a/apps/plugins/databox/Makefile +++ b/apps/plugins/databox/Makefile @@ -10,7 +10,7 @@ INCLUDES = -I$(APPSDIR) -I.. -I. -I$(FIRMDIR)/include -I$(FIRMDIR)/export \ -I$(FIRMDIR)/common -I$(FIRMDIR)/drivers -I$(OUTDIR) -I$(BUILDDIR) CFLAGS = $(GCCOPTS) -O3 $(INCLUDES) $(TARGET) $(EXTRA_DEFINES) \ - -DMEM=${MEMORYSIZE} -DPLUGIN + -DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN ifdef APPEXTRA INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA))) diff --git a/apps/plugins/databox/databox.c b/apps/plugins/databox/databox.c index ebed139020..2cc78a0b01 100644 --- a/apps/plugins/databox/databox.c +++ b/apps/plugins/databox/databox.c @@ -18,6 +18,8 @@ ****************************************************************************/ #include "databox.h" +PLUGIN_HEADER + /* variable button definitions */ #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ (CONFIG_KEYPAD == IRIVER_H300_PAD) @@ -233,11 +235,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int button,done=0,abort=0; char filename[100],buf[100]; - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - /* if you don't use the parameter, you can do like this to avoid the compiler warning about it */ (void)parameter; diff --git a/apps/plugins/demystify.c b/apps/plugins/demystify.c index 8cb3315bdf..f4e54becb8 100644 --- a/apps/plugins/demystify.c +++ b/apps/plugins/demystify.c @@ -23,6 +23,8 @@ #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + /* Key assignement */ #if (CONFIG_KEYPAD == IPOD_4G_PAD) #define DEMYSTIFY_QUIT BUTTON_MENU @@ -337,19 +339,12 @@ int plugin_main(void) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int ret; - /* - * this macro should be called as the first thing you do in the plugin. - * it test that the api version and model the plugin was compiled for - * matches the machine it is running on - */ - - TEST_PLUGIN_API(api); rb = api; /* copy to global api pointer */ (void)parameter; if (rb->global_settings->backlight_timeout > 0) rb->backlight_set_timeout(1);/* keep the light on */ - + ret = plugin_main(); return ret; diff --git a/apps/plugins/dict.c b/apps/plugins/dict.c index c432b564f4..7209240128 100644 --- a/apps/plugins/dict.c +++ b/apps/plugins/dict.c @@ -19,6 +19,8 @@ #include "plugin.h" +PLUGIN_HEADER + /* as in hello world :) */ static struct plugin_api* rb; /* screen info */ @@ -127,7 +129,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) int lines, len, outputted, next; /* plugin stuff */ - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/euroconverter.c b/apps/plugins/euroconverter.c index 3fb1e0e819..3cf36affea 100644 --- a/apps/plugins/euroconverter.c +++ b/apps/plugins/euroconverter.c @@ -43,6 +43,8 @@ To do: - The Irish currency needs 6 digits after the . to have sufficient precision on big number */ +PLUGIN_HEADER + /* Name and path of the config file*/ static const char cfg_filename[] = "euroconverter.cfg"; #define CFGFILE_VERSION 0 /* Current config file version */ @@ -405,11 +407,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) longlong_t e,h,old_e,old_h; int button; - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - /* if you don't use the parameter, you can do like this to avoid the compiler warning about it */ (void)parameter; diff --git a/apps/plugins/favorites.c b/apps/plugins/favorites.c index 68eab43298..d45f785d64 100644 --- a/apps/plugins/favorites.c +++ b/apps/plugins/favorites.c @@ -1,6 +1,8 @@ #include "plugin.h" #define FAVORITES_FILE "/favorites.m3u" +PLUGIN_HEADER + static struct plugin_api* rb; enum plugin_status plugin_start(struct plugin_api* api, void* parameter) @@ -9,11 +11,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) char track_path[MAX_PATH+1]; int fd, result, len; - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - rb = api; /* If we were passed a parameter, use that as the file name, diff --git a/apps/plugins/fire.c b/apps/plugins/fire.c index bf01e9bf51..727644fcd4 100644 --- a/apps/plugins/fire.c +++ b/apps/plugins/fire.c @@ -25,6 +25,8 @@ #ifdef HAVE_LCD_BITMAP /* and also not for the Player */ #include "gray.h" +PLUGIN_HEADER + /******************************* Globals ***********************************/ static struct plugin_api* rb; /* global api struct pointer */ @@ -278,13 +280,6 @@ int main(void) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int ret; - /* - * this macro should be called as the first thing you do in the plugin. - * it test that the api version and model the plugin was compiled for - * matches the machine it is running on - */ - - TEST_PLUGIN_API(api); rb = api; // copy to global api pointer (void)parameter; diff --git a/apps/plugins/firmware_flash.c b/apps/plugins/firmware_flash.c index 697884fd5d..fa77a33697 100644 --- a/apps/plugins/firmware_flash.c +++ b/apps/plugins/firmware_flash.c @@ -79,6 +79,8 @@ #ifdef PLATFORM_ID +PLUGIN_HEADER + #if CONFIG_KEYPAD == ONDIO_PAD /* limited keypad */ #define KEY1 BUTTON_LEFT #define KEY2 BUTTON_UP @@ -1048,7 +1050,7 @@ void DoUserDialog(char* filename) rb->snprintf(buf, sizeof(buf), "Verify failed! %d errors", rc); rb->lcd_puts_scroll(0, 0, buf); } - + rb->lcd_puts_scroll(0, 1, "Press any key to exit."); WaitForButton(); } @@ -1062,11 +1064,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int oldmode; - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - rb = api; /* copy to global api pointer */ /* now go ahead and have fun! */ diff --git a/apps/plugins/flipit.c b/apps/plugins/flipit.c index f921a2e95d..f1fba878e3 100644 --- a/apps/plugins/flipit.c +++ b/apps/plugins/flipit.c @@ -19,6 +19,8 @@ #include "plugin.h" #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define FLIPIT_UP BUTTON_UP @@ -294,7 +296,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int w, h, i; - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/grayscale.c b/apps/plugins/grayscale.c index 192dcc1738..9e921ae534 100644 --- a/apps/plugins/grayscale.c +++ b/apps/plugins/grayscale.c @@ -25,6 +25,8 @@ #if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) #include "gray.h" +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define GRAYSCALE_SHIFT BUTTON_ON @@ -302,11 +304,6 @@ int main(void) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - rb = api; // copy to global api pointer (void)parameter; diff --git a/apps/plugins/helloworld.c b/apps/plugins/helloworld.c index d0fecba169..e4220e4af3 100644 --- a/apps/plugins/helloworld.c +++ b/apps/plugins/helloworld.c @@ -20,6 +20,10 @@ /* welcome to the example rockbox plugin */ +/* This macros must always be included. Should be placed at the top by + convention, although the actual position doesn't matter */ +PLUGIN_HEADER + /* here is a global api struct pointer. while not strictly necessary, it's nice not to have to pass the api pointer in all function calls in the plugin */ @@ -28,11 +32,6 @@ static struct plugin_api* rb; /* this is the plugin entry point */ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - /* if you don't use the parameter, you can do like this to avoid the compiler warning about it */ (void)parameter; diff --git a/apps/plugins/iriverify.c b/apps/plugins/iriverify.c index 7b5c21832f..a0f8d50a5f 100644 --- a/apps/plugins/iriverify.c +++ b/apps/plugins/iriverify.c @@ -23,6 +23,7 @@ ****************************************************************************/ #include "plugin.h" +PLUGIN_HEADER static struct plugin_api* rb; @@ -133,7 +134,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { char *buf; int rc; - TEST_PLUGIN_API(api); filename = (char *)parameter; diff --git a/apps/plugins/jackpot.c b/apps/plugins/jackpot.c index d35e35a8c0..a2ebb81f5c 100644 --- a/apps/plugins/jackpot.c +++ b/apps/plugins/jackpot.c @@ -29,6 +29,8 @@ History: #ifdef HAVE_LCD_CHARCELLS +PLUGIN_HEADER + /* Jackpot game for the player */ static unsigned char pattern[]={ @@ -89,11 +91,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) bool exit=false; bool go; - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - /* if you don't use the parameter, you can do like this to avoid the compiler warning about it */ (void)parameter; diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c index af5a3743c7..a4ce1ae92a 100644 --- a/apps/plugins/jewels.c +++ b/apps/plugins/jewels.c @@ -20,11 +20,11 @@ ****************************************************************************/ #include "plugin.h" -#include "button.h" -#include "lcd.h" #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + /* save files */ #define SCORE_FILE PLUGIN_DIR "/bejeweled.score" #define SAVE_FILE PLUGIN_DIR "/bejeweled.save" @@ -2466,7 +2466,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { char str[19]; /* plugin init */ - TEST_PLUGIN_API(api); (void)parameter; rb = api; /* end of plugin init */ diff --git a/apps/plugins/jpeg.c b/apps/plugins/jpeg.c index fee24d1082..468f745fba 100644 --- a/apps/plugins/jpeg.c +++ b/apps/plugins/jpeg.c @@ -29,6 +29,8 @@ #if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) #include "gray.h" +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define JPEG_ZOOM_IN BUTTON_PLAY @@ -1959,11 +1961,6 @@ int main(char* filename) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - rb = api; /* copy to global api pointer */ return main((char*)parameter); diff --git a/apps/plugins/logo.c b/apps/plugins/logo.c index 9472de9110..01678596f0 100644 --- a/apps/plugins/logo.c +++ b/apps/plugins/logo.c @@ -19,6 +19,8 @@ #include "plugin.h" #include "playergfx.h" +PLUGIN_HEADER + #ifdef HAVE_LCD_BITMAP #define DISPLAY_WIDTH LCD_WIDTH #define DISPLAY_HEIGHT LCD_HEIGHT @@ -226,7 +228,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int old_cpos = -1; #endif - TEST_PLUGIN_API(api); (void)parameter; #ifdef HAVE_LCD_CHARCELLS diff --git a/apps/plugins/mandelbrot.c b/apps/plugins/mandelbrot.c index 1f80ff395f..1d2b48cb8b 100644 --- a/apps/plugins/mandelbrot.c +++ b/apps/plugins/mandelbrot.c @@ -24,6 +24,8 @@ #if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) #include "gray.h" +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define MANDELBROT_QUIT BUTTON_OFF @@ -371,7 +373,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) int grayscales; int redraw = REDRAW_FULL; - TEST_PLUGIN_API(api); rb = api; (void)parameter; diff --git a/apps/plugins/metronome.c b/apps/plugins/metronome.c index 1b2d28a4b7..2f897d72a2 100644 --- a/apps/plugins/metronome.c +++ b/apps/plugins/metronome.c @@ -20,6 +20,8 @@ #if !defined(SIMULATOR) +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define METRONOME_QUIT BUTTON_OFF @@ -907,7 +909,6 @@ void tap(void) enum plugin_status plugin_start(struct plugin_api* api, void* parameter){ int button; - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/midi2wav.c b/apps/plugins/midi2wav.c index e0f9e83fd2..d0d46612b6 100644 --- a/apps/plugins/midi2wav.c +++ b/apps/plugins/midi2wav.c @@ -41,6 +41,8 @@ //#include "../codecs/lib/xxx2wav.h" +PLUGIN_HEADER + int numberOfSamples IDATA_ATTR; long bpm; @@ -67,9 +69,6 @@ struct plugin_api * rb; enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - TEST_PLUGIN_API(api); - rb = api; - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/minesweeper.c b/apps/plugins/minesweeper.c index 624c807b92..5baaea6812 100644 --- a/apps/plugins/minesweeper.c +++ b/apps/plugins/minesweeper.c @@ -28,11 +28,11 @@ use F3 to see how many mines are left (supposing all your flags are correct) *****************************************************************************/ #include "plugin.h" -#include "button.h" -#include "lcd.h" #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + //what the minesweeper() function can return #define MINESWEEPER_USB 3 #define MINESWEEPER_QUIT 2 @@ -521,7 +521,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { bool exit = false; /* plugin init */ - TEST_PLUGIN_API(api); (void)parameter; rb = api; /* end of plugin init */ diff --git a/apps/plugins/mosaique.c b/apps/plugins/mosaique.c index 7a18bc2d42..bccc436cad 100644 --- a/apps/plugins/mosaique.c +++ b/apps/plugins/mosaique.c @@ -19,6 +19,8 @@ #include "plugin.h" #include "playergfx.h" +PLUGIN_HEADER + #ifdef HAVE_LCD_BITMAP #define LARGE ((LCD_WIDTH - 2) / 2) #define HAUT ((LCD_HEIGHT - 2) / 2) @@ -72,7 +74,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) int sx = 3; int sy = 3; struct plugin_api* rb = api; - TEST_PLUGIN_API(api); (void)parameter; #ifdef HAVE_LCD_CHARCELLS diff --git a/apps/plugins/mp3_encoder.c b/apps/plugins/mp3_encoder.c index 0171bc4d79..bd1a3040c2 100644 --- a/apps/plugins/mp3_encoder.c +++ b/apps/plugins/mp3_encoder.c @@ -38,6 +38,8 @@ enum e_byte_order { order_unknown, order_bigEndian, order_littleEndian }; #define memcpy rb->memcpy #define memset rb->memset +PLUGIN_HEADER + static struct plugin_api* rb; extern char iramcopy[]; extern char iramstart[]; @@ -1892,8 +1894,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) char *bitratename[] = { "64","80","96","112","128","160","192","224","256","320" }; int brate[] = { 64,80,96,112,128,160,192,224,256,320 }; - TEST_PLUGIN_API(api); - (void)parameter; rb = api; diff --git a/apps/plugins/nim.c b/apps/plugins/nim.c index 27f1210ea4..d937af168b 100644 --- a/apps/plugins/nim.c +++ b/apps/plugins/nim.c @@ -20,7 +20,7 @@ #ifdef HAVE_LCD_CHARCELLS -/* NIM game for the player +/* NIM game for the player Rules of nim game ----------------- @@ -46,6 +46,7 @@ V1.2 : 2003-07-30 take a match. Later you are obliged to take at least one.) */ +PLUGIN_HEADER /*Pattern for the game*/ static unsigned char smile[]={0x00, 0x11, 0x04, 0x04, 0x00, 0x11, 0x0E}; /* :-) */ @@ -140,11 +141,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) bool ok; bool go; - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - /* if you don't use the parameter, you can do like this to avoid the compiler warning about it */ (void)parameter; diff --git a/apps/plugins/oscillograph.c b/apps/plugins/oscillograph.c index 069ef44247..13858a1c3c 100644 --- a/apps/plugins/oscillograph.c +++ b/apps/plugins/oscillograph.c @@ -22,6 +22,8 @@ #ifndef SIMULATOR /* don't want this code in the simulator */ #if CONFIG_CODEC != SWCODEC /* only for MAS-targets */ +PLUGIN_HEADER + /* The different drawing modes */ #define DRAW_MODE_FILLED 0 #define DRAW_MODE_OUTLINE 1 @@ -93,7 +95,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) bool exit = false; - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/oscilloscope.c b/apps/plugins/oscilloscope.c index 916e55018c..b69d15daae 100644 --- a/apps/plugins/oscilloscope.c +++ b/apps/plugins/oscilloscope.c @@ -25,6 +25,8 @@ #ifdef HAVE_LCD_BITMAP /* and also not for the Player */ #if CONFIG_CODEC != SWCODEC /* only for MAS-targets */ +PLUGIN_HEADER + /* The different drawing modes */ #define DRAW_MODE_FILLED 0 #define DRAW_MODE_OUTLINE 1 @@ -201,7 +203,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) bool exit = false; bool paused = false; - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/plasma.c b/apps/plugins/plasma.c index 2623bdcffb..46cf4c7b50 100644 --- a/apps/plugins/plasma.c +++ b/apps/plugins/plasma.c @@ -28,6 +28,8 @@ #ifdef HAVE_LCD_BITMAP /* and also not for the Player */ #include "gray.h" +PLUGIN_HEADER + /******************************* Globals ***********************************/ static struct plugin_api* rb; /* global api struct pointer */ @@ -241,13 +243,6 @@ int main(void) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int ret; - /* - * this macro should be called as the first thing you do in the plugin. - * it test that the api version and model the plugin was compiled for - * matches the machine it is running on - */ - - TEST_PLUGIN_API(api); rb = api; // copy to global api pointer (void)parameter; diff --git a/apps/plugins/plugin.lds b/apps/plugins/plugin.lds index c8ac88fb62..0626623fbf 100644 --- a/apps/plugins/plugin.lds +++ b/apps/plugins/plugin.lds @@ -64,7 +64,13 @@ MEMORY SECTIONS { - .text : + .header : { + _plugin_start_addr = .; + plugin_start_addr = .; + KEEP(*(.header)) + } > PLUGIN_RAM + + .text : { KEEP(*(.entry)) *(.text*) @@ -80,7 +86,7 @@ SECTIONS . = ALIGN(0x4); } > PLUGIN_RAM - .data : + .data : { *(.data*) #if defined(ARCH_IRIVER) || defined(ARCH_IPOD) || (CONFIG_CPU==PNX0101) @@ -118,6 +124,9 @@ SECTIONS { *(.bss*) *(COMMON) + . = ALIGN(0x4); + _plugin_end_addr = .; + plugin_end_addr = .; } > PLUGIN_RAM /* Special trick to avoid a linker error when no other sections are diff --git a/apps/plugins/pong.c b/apps/plugins/pong.c index 41507c5ff4..4e9d99b8f0 100644 --- a/apps/plugins/pong.c +++ b/apps/plugins/pong.c @@ -20,6 +20,8 @@ #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + #define PAD_HEIGHT LCD_HEIGHT / 6 /* Recorder: 10 iRiver: 21 */ #define PAD_WIDTH LCD_WIDTH / 50 /* Recorder: 2 iRiver: 2 */ @@ -336,9 +338,7 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) /* if you don't use the parameter, you can do like this to avoid the compiler warning about it */ (void)parameter; - - TEST_PLUGIN_API(api); - + rb = api; /* use the "standard" rb pointer */ /* Clear screen */ diff --git a/apps/plugins/rockblox.c b/apps/plugins/rockblox.c index 786e590571..f30a21aff8 100644 --- a/apps/plugins/rockblox.c +++ b/apps/plugins/rockblox.c @@ -22,6 +22,8 @@ #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + #if (CONFIG_KEYPAD == IPOD_4G_PAD) #define ROCKBLOX_OFF BUTTON_MENU #define ROCKBLOX_UP BUTTON_SCROLL_BACK @@ -420,11 +422,9 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int ret; - TEST_PLUGIN_API(api); - (void)parameter; rb = api; - + /* Lets use the default font */ rb->lcd_setfont(FONT_SYSFIXED); diff --git a/apps/plugins/rockbox_flash.c b/apps/plugins/rockbox_flash.c index 4c552622e5..0b713405ed 100644 --- a/apps/plugins/rockbox_flash.c +++ b/apps/plugins/rockbox_flash.c @@ -23,6 +23,8 @@ #if !defined(SIMULATOR) && (CONFIG_CPU == SH7034) /* Only for SH targets */ +PLUGIN_HEADER + /* define DUMMY if you only want to "play" with the UI, does no harm */ /* #define DUMMY */ @@ -1010,10 +1012,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int oldmode; - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); rb = api; /* copy to global api pointer */ if (parameter == NULL) diff --git a/apps/plugins/rockboy.c b/apps/plugins/rockboy.c index 783e096214..d3504572cf 100644 --- a/apps/plugins/rockboy.c +++ b/apps/plugins/rockboy.c @@ -22,6 +22,8 @@ #if MEM <= 8 && !defined(SIMULATOR) +PLUGIN_HEADER + #define OVL_NAME "/.rockbox/viewers/rockboy.ovl" #define OVL_DISPLAYNAME "RockBoy" @@ -40,10 +42,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) enum plugin_status(*entry_point)(struct plugin_api*, void*); } header; - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); rb = api; fh = rb->open(OVL_NAME, O_RDONLY); diff --git a/apps/plugins/rockboy/Makefile b/apps/plugins/rockboy/Makefile index 3657e8d786..f0dbc55857 100644 --- a/apps/plugins/rockboy/Makefile +++ b/apps/plugins/rockboy/Makefile @@ -10,7 +10,7 @@ INCLUDES = -I$(APPSDIR) -I.. -I. -I$(FIRMDIR)/include -I$(FIRMDIR)/export \ -I$(FIRMDIR)/common -I$(FIRMDIR)/drivers -I$(OUTDIR) -I$(BUILDDIR) CFLAGS = $(GCCOPTS) -O3 $(INCLUDES) $(TARGET) $(EXTRA_DEFINES) \ - -DMEM=${MEMORYSIZE} -DPLUGIN + -DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN ifdef APPEXTRA INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA))) diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c index fc004e752d..a21e9e4368 100644 --- a/apps/plugins/rockboy/rockboy.c +++ b/apps/plugins/rockboy/rockboy.c @@ -36,6 +36,8 @@ const struct { 0x524f564c, /* ROVL */ ovl_start_addr, ovl_end_addr, plugin_start }; +#else +PLUGIN_HEADER #endif #ifdef USE_IRAM @@ -93,17 +95,12 @@ void setmallocpos(void *pointer) /* this is the plugin entry point */ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - /* if you are using a global api pointer, don't forget to copy it! otherwise you will get lovely "I04: IllInstr" errors... :-) */ rb = api; rb->lcd_setfont(0); - + if (!parameter) { rb->splash(HZ*3, true, "Play gameboy ROM file! (.gb/.gbc)"); return PLUGIN_OK; diff --git a/apps/plugins/search.c b/apps/plugins/search.c index 450b05c778..fb9d239dc7 100644 --- a/apps/plugins/search.c +++ b/apps/plugins/search.c @@ -20,6 +20,8 @@ #include "plugin.h" #include "ctype.h" +PLUGIN_HEADER + static struct plugin_api* rb; #define BUFFER_SIZE 16384 @@ -150,8 +152,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) char *filename = parameter; char *p; - TEST_PLUGIN_API(api); - rb = api; DEBUGF("%s - %s\n", parameter, &filename[rb->strlen(filename)-4]); diff --git a/apps/plugins/searchengine/Makefile b/apps/plugins/searchengine/Makefile index efa7d95d2d..baa0020cc2 100644 --- a/apps/plugins/searchengine/Makefile +++ b/apps/plugins/searchengine/Makefile @@ -10,7 +10,7 @@ INCLUDES = -I$(APPSDIR) -I.. -I. -I$(FIRMDIR)/include -I$(FIRMDIR)/export \ -I$(FIRMDIR)/common -I$(FIRMDIR)/drivers -I$(OUTDIR) -I$(BUILDDIR) CFLAGS = $(GCCOPTS) -O3 $(INCLUDES) $(TARGET) $(EXTRA_DEFINES) \ - -DMEM=${MEMORYSIZE} -DPLUGIN + -DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN ifdef APPEXTRA INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA))) diff --git a/apps/plugins/searchengine/searchengine.c b/apps/plugins/searchengine/searchengine.c index 8953ba7552..b585c25f13 100644 --- a/apps/plugins/searchengine/searchengine.c +++ b/apps/plugins/searchengine/searchengine.c @@ -21,6 +21,8 @@ #include "token.h" #include "dbinterface.h" +PLUGIN_HEADER + void *audio_bufferbase; void *audio_bufferpointer; unsigned int audio_buffer_free; @@ -58,15 +60,10 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { unsigned char *result,buf[500]; int parsefd,hits; - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - /* if you are using a global api pointer, don't forget to copy it! otherwise you will get lovely "I04: IllInstr" errors... :-) */ rb = api; - + audio_bufferbase=audio_bufferpointer=0; audio_buffer_free=0; diff --git a/apps/plugins/sliding_puzzle.c b/apps/plugins/sliding_puzzle.c index a153467a75..060ab1866a 100644 --- a/apps/plugins/sliding_puzzle.c +++ b/apps/plugins/sliding_puzzle.c @@ -19,6 +19,8 @@ #include "plugin.h" #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define PUZZLE_QUIT BUTTON_OFF @@ -333,7 +335,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int i, w, h; - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/snake.c b/apps/plugins/snake.c index bf5d8f9795..dc78f17820 100644 --- a/apps/plugins/snake.c +++ b/apps/plugins/snake.c @@ -33,6 +33,8 @@ dir is the current direction of the snake - 0=up, 1=right, 2=down, 3=left; #include "plugin.h" #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define SNAKE_QUIT BUTTON_OFF @@ -344,7 +346,6 @@ void game_init(void) { enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - TEST_PLUGIN_API(api); (void)(parameter); rb = api; diff --git a/apps/plugins/snake2.c b/apps/plugins/snake2.c index ea526b3871..4008209578 100644 --- a/apps/plugins/snake2.c +++ b/apps/plugins/snake2.c @@ -30,6 +30,8 @@ Head and Tail are stored #include "plugin.h" #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + #define WIDTH 28 #define HEIGHT 16 @@ -1425,7 +1427,6 @@ void game_init(void) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - TEST_PLUGIN_API(api); (void)(parameter); rb = api; diff --git a/apps/plugins/snow.c b/apps/plugins/snow.c index 7fd0c8a3d6..a1405a1863 100644 --- a/apps/plugins/snow.c +++ b/apps/plugins/snow.c @@ -19,6 +19,8 @@ #include "plugin.h" #include "playergfx.h" +PLUGIN_HEADER + #ifdef HAVE_LCD_BITMAP #define NUM_PARTICLES (LCD_WIDTH * LCD_HEIGHT / 72) #define SNOW_HEIGHT LCD_HEIGHT @@ -161,7 +163,6 @@ static void snow_init(void) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int button; - TEST_PLUGIN_API(api); (void)(parameter); rb = api; diff --git a/apps/plugins/sokoban.c b/apps/plugins/sokoban.c index 515997379d..994a1172c8 100644 --- a/apps/plugins/sokoban.c +++ b/apps/plugins/sokoban.c @@ -22,6 +22,8 @@ #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + #define SOKOBAN_TITLE "Sokoban" #define SOKOBAN_TITLE_FONT 2 @@ -896,7 +898,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) int w, h; int len; - TEST_PLUGIN_API(api); (void)(parameter); rb = api; diff --git a/apps/plugins/solitaire.c b/apps/plugins/solitaire.c index 81bd820fb2..9a60635f45 100644 --- a/apps/plugins/solitaire.c +++ b/apps/plugins/solitaire.c @@ -39,6 +39,8 @@ use F3 to put card on top of the remains' stack on one of the 4 final stacks #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + /* here is a global api struct pointer. while not strictly necessary, it's nice not to have to pass the api pointer in all function calls in the plugin */ @@ -1541,7 +1543,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) int result; /* plugin init */ - TEST_PLUGIN_API(api); (void)parameter; rb = api; /* end of plugin init */ diff --git a/apps/plugins/sort.c b/apps/plugins/sort.c index cf91dbb4dd..7ba510ec32 100644 --- a/apps/plugins/sort.c +++ b/apps/plugins/sort.c @@ -55,6 +55,8 @@ * TODO: Implement a merge sort for files larger than the buffer ****************************************************************************/ +PLUGIN_HEADER + static struct plugin_api* rb; int buf_size; @@ -178,7 +180,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { char *buf; int rc; - TEST_PLUGIN_API(api); filename = (char *)parameter; diff --git a/apps/plugins/splitedit.c b/apps/plugins/splitedit.c index 35562f99fc..d0fd4e161b 100644 --- a/apps/plugins/splitedit.c +++ b/apps/plugins/splitedit.c @@ -22,6 +22,8 @@ #ifndef SIMULATOR #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define SPLITEDIT_QUIT BUTTON_OFF diff --git a/apps/plugins/star.c b/apps/plugins/star.c index c6a2853231..03dac3482c 100644 --- a/apps/plugins/star.c +++ b/apps/plugins/star.c @@ -19,6 +19,8 @@ #include "plugin.h" #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + /* file which contains the levels */ #define STAR_LEVELS_FILE "/.rockbox/star/levels.txt" @@ -877,7 +879,6 @@ static int star_menu(void) */ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/starfield.c b/apps/plugins/starfield.c index 407e79f3c1..750c59fe41 100644 --- a/apps/plugins/starfield.c +++ b/apps/plugins/starfield.c @@ -19,6 +19,8 @@ #ifdef HAVE_LCD_BITMAP /* and also not for the Player */ +PLUGIN_HEADER + /******************************* Globals ***********************************/ static struct plugin_api* rb; /* global api struct pointer */ @@ -251,13 +253,6 @@ int plugin_main(void) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int ret; - /* - * this macro should be called as the first thing you do in the plugin. - * it test that the api version and model the plugin was compiled for - * matches the machine it is running on - */ - - TEST_PLUGIN_API(api); rb = api; // copy to global api pointer (void)parameter; diff --git a/apps/plugins/stats.c b/apps/plugins/stats.c index e1b8b6fc21..b54adb584b 100644 --- a/apps/plugins/stats.c +++ b/apps/plugins/stats.c @@ -18,6 +18,8 @@ ****************************************************************************/ #include "plugin.h" +PLUGIN_HEADER + static struct plugin_api* rb; static int files, dirs; static int lasttick; @@ -100,7 +102,6 @@ void traversedir(char* location, char* name) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int button; - TEST_PLUGIN_API(api); (void)parameter; diff --git a/apps/plugins/stopwatch.c b/apps/plugins/stopwatch.c index 4a1382ef65..3742a9a552 100644 --- a/apps/plugins/stopwatch.c +++ b/apps/plugins/stopwatch.c @@ -19,6 +19,8 @@ #include "plugin.h" +PLUGIN_HEADER + #ifdef HAVE_LCD_BITMAP #define LAP_LINES 6 #define TIMER_Y 1 @@ -121,7 +123,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) int done = false; bool update_lap = true; - TEST_PLUGIN_API(api); (void)parameter; rb = api; diff --git a/apps/plugins/sudoku.c b/apps/plugins/sudoku.c index 453a4447b1..94ff96d171 100644 --- a/apps/plugins/sudoku.c +++ b/apps/plugins/sudoku.c @@ -57,11 +57,11 @@ Example ".ss" file, and one with a saved state: */ #include "plugin.h" -#include "button.h" -#include "lcd.h" #ifdef HAVE_LCD_BITMAP +PLUGIN_HEADER + #define STATE_FILE PLUGIN_DIR "/sudoku.state" #define GAMES_FILE PLUGIN_DIR "/sudoku.levels" @@ -2429,7 +2429,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) struct sudoku_state_t state; /* plugin init */ - TEST_PLUGIN_API(api); rb = api; /* end of plugin init */ diff --git a/apps/plugins/vbrfix.c b/apps/plugins/vbrfix.c index ca6b9ca096..d05419f19c 100644 --- a/apps/plugins/vbrfix.c +++ b/apps/plugins/vbrfix.c @@ -18,6 +18,8 @@ ****************************************************************************/ #include "plugin.h" +PLUGIN_HEADER + static struct plugin_api* rb; static char *audiobuf; @@ -265,8 +267,6 @@ static bool vbr_fix(char *selected_file) enum plugin_status plugin_start(struct plugin_api* api, void *parameter) { - TEST_PLUGIN_API(api); - rb = api; if (!parameter) diff --git a/apps/plugins/video.c b/apps/plugins/video.c index 91d47a52d1..6ed7036015 100644 --- a/apps/plugins/video.c +++ b/apps/plugins/video.c @@ -32,6 +32,8 @@ #ifndef SIMULATOR // not for simulator by now #ifdef HAVE_LCD_BITMAP // and definitely not for the Player, haha +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define VIDEO_STOP_SEEK BUTTON_PLAY @@ -984,11 +986,6 @@ int main(char* filename) enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - /* this macro should be called as the first thing you do in the plugin. - it test that the api version and model the plugin was compiled for - matches the machine it is running on */ - TEST_PLUGIN_API(api); - rb = api; // copy to global api pointer if (parameter == NULL) diff --git a/apps/plugins/viewer.c b/apps/plugins/viewer.c index 823072e145..b98605af84 100644 --- a/apps/plugins/viewer.c +++ b/apps/plugins/viewer.c @@ -20,9 +20,7 @@ #include "plugin.h" #include -#if PLUGIN_API_VERSION < 3 -#error Scrollbar function requires PLUGIN_API_VERSION 3 at least -#endif +PLUGIN_HEADER #define SETTINGS_FILE "/.rockbox/viewers/viewer.dat" @@ -1022,7 +1020,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* file) int i; int ok; - TEST_PLUGIN_API(api); rb = api; if (!file) diff --git a/apps/plugins/vu_meter.c b/apps/plugins/vu_meter.c index 6a55a1af1a..b486c3c94e 100644 --- a/apps/plugins/vu_meter.c +++ b/apps/plugins/vu_meter.c @@ -19,6 +19,8 @@ #if defined(HAVE_LCD_BITMAP) && (CONFIG_CODEC != SWCODEC) +PLUGIN_HEADER + /* variable button definitions */ #if CONFIG_KEYPAD == RECORDER_PAD #define VUMETER_QUIT BUTTON_OFF @@ -427,7 +429,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { int button; int lastbutton = BUTTON_NONE; - TEST_PLUGIN_API(api); (void) parameter; rb = api; diff --git a/apps/plugins/wav2wv.c b/apps/plugins/wav2wv.c index 1f47eff3ed..20a458960f 100644 --- a/apps/plugins/wav2wv.c +++ b/apps/plugins/wav2wv.c @@ -20,6 +20,8 @@ #include +PLUGIN_HEADER + #define SAMPLES_PER_BLOCK 22050 static struct plugin_api* rb; @@ -287,8 +289,6 @@ static int wav2wv (char *filename) enum plugin_status plugin_start(struct plugin_api* api, void *parameter) { - TEST_PLUGIN_API(api); - rb = api; if (!parameter) diff --git a/apps/plugins/wormlet.c b/apps/plugins/wormlet.c index e0e33b6801..6016cda873 100644 --- a/apps/plugins/wormlet.c +++ b/apps/plugins/wormlet.c @@ -20,6 +20,8 @@ #if defined(HAVE_LCD_BITMAP) && (CONFIG_KEYPAD == RECORDER_PAD) +PLUGIN_HEADER + /* size of the field the worm lives in */ #define FIELD_RECT_X 1 #define FIELD_RECT_Y 1 @@ -1891,7 +1893,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) bool worm_dead = false; int button; - TEST_PLUGIN_API(api); (void)(parameter); rb = api; diff --git a/tools/configure b/tools/configure index f8fea6e76c..2cd855e0c5 100755 --- a/tools/configure +++ b/tools/configure @@ -427,7 +427,7 @@ appsdir='\$(ROOTDIR)/apps' echo "15 - iPod Video" echo "16 - iriver iFP-790" - getit=`input`; + target_id=`input`; # Set of tools built for all target platforms: toolset="rdf2binary convbdf" @@ -437,7 +437,7 @@ appsdir='\$(ROOTDIR)/apps' iriverbitmaptools="$toolset scramble descramble mkboot bmp2rb codepages" ipodbitmaptools="$toolset scramble ipod_fw bmp2rb codepages" - case $getit in + case $target_id in 1) archos="player" @@ -881,6 +881,7 @@ sed > Makefile \ -e "s,@ROOTDIR@,${rootdir},g" \ -e "s,@DEBUG@,${debug},g" \ -e "s,@MEMORY@,${memory},g" \ + -e "s,@TARGET_ID@,${target_id},g" \ -e "s,@TARGET@,${target},g" \ -e "s,@ARCHOS@,${archos},g" \ -e "s,@LANGUAGE@,${language},g" \ @@ -927,6 +928,7 @@ export DEBUG=@DEBUG@ export ARCHOS=@ARCHOS@ export ARCHOSROM=@ARCHOSROM@ export FLASHFILE=@FLASHFILE@ +export TARGET_ID=@TARGET_ID@ export TARGET=@TARGET@ export OBJDIR=@PWD@ export BUILDDIR=@PWD@