From eeec278d21ae258da9108bbbccf04d977c3d3bfa Mon Sep 17 00:00:00 2001 From: Jens Arnold Date: Thu, 23 Feb 2006 20:46:33 +0000 Subject: Made the overlay loader code part of the plugin library. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8813 a1c6a512-1295-4272-9138-f99709370657 --- apps/plugins/lib/Makefile | 4 +- apps/plugins/lib/SOURCES | 9 ++-- apps/plugins/lib/overlay.c | 106 +++++++++++++++++++++++++++++++++++++++++++++ apps/plugins/lib/overlay.h | 34 +++++++++++++++ apps/plugins/rockboy.c | 71 ++---------------------------- 5 files changed, 152 insertions(+), 72 deletions(-) create mode 100755 apps/plugins/lib/overlay.c create mode 100755 apps/plugins/lib/overlay.h (limited to 'apps/plugins') diff --git a/apps/plugins/lib/Makefile b/apps/plugins/lib/Makefile index 9b4b0b6286..ca9c3f3576 100644 --- a/apps/plugins/lib/Makefile +++ b/apps/plugins/lib/Makefile @@ -17,8 +17,8 @@ ifdef APPEXTRA INCLUDES += $(patsubst %,-I$(APPSDIR)/%,$(subst :, ,$(APPEXTRA))) endif -CFLAGS = $(GCCOPTS) \ -$(INCLUDES) $(TARGET) $(EXTRA_DEFINES) -DMEM=${MEMORYSIZE} -DPLUGIN +CFLAGS = $(GCCOPTS) $(INCLUDES) $(TARGET) $(EXTRA_DEFINES) \ + -DTARGET_ID=$(TARGET_ID) -DMEM=${MEMORYSIZE} -DPLUGIN # Sectioned compilation for target ifndef SIMVER diff --git a/apps/plugins/lib/SOURCES b/apps/plugins/lib/SOURCES index d9eb00ca4d..291bc21a1d 100644 --- a/apps/plugins/lib/SOURCES +++ b/apps/plugins/lib/SOURCES @@ -1,5 +1,4 @@ configfile.c -highscore.c #if defined(HAVE_LCD_BITMAP) && (LCD_DEPTH < 4) && !defined(SIMULATOR) && \ (CONFIG_LCD != LCD_IPOD2BPP) gray_core.c @@ -7,8 +6,9 @@ gray_draw.c gray_parm.c gray_scroll.c #endif -#ifdef HAVE_LCD_BITMAP -xlcd.c +highscore.c +#ifndef SIMULATOR +overlay.c #endif #ifdef HAVE_LCD_CHARCELLS playergfx.c @@ -16,3 +16,6 @@ playergfx.c #ifdef RB_PROFILE profile_plugin.c #endif +#ifdef HAVE_LCD_BITMAP +xlcd.c +#endif diff --git a/apps/plugins/lib/overlay.c b/apps/plugins/lib/overlay.c new file mode 100755 index 0000000000..31c2b00f91 --- /dev/null +++ b/apps/plugins/lib/overlay.c @@ -0,0 +1,106 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Overlay loader + * + * Copyright (C) 2006 Jens Arnold + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef SIMULATOR +#include "plugin.h" + +/* load and run a plugin linked as an overlay. + + arguments: + rb = pointer to plugin api, also passed on to the overlay + parameter = plugin parameter, passed on to the overlay + filename = overlay file name, absolute path as usual + name = overlay display name + + result: + return value from the overlay + + As long as a large plugin to be overlayed doesn't use the audiobuffer + itself, no adjustments in the plugin source code are necessary to make + it work as an overlay, it only needs an adapted linker script. + + If the overlayed plugin *does* use the audiobuffer itself, it needs + to make sure not to overwrite itself. + + The linker script for the overlay should use a base address towards the + end of the audiobuffer, just low enough to make the overlay fit. */ + +enum plugin_status run_overlay(struct plugin_api* rb, void* parameter, + unsigned char *filename, unsigned char *name) +{ + int fd, readsize; + int audiobuf_size; + unsigned char *audiobuf; + static struct plugin_header header; + + fd = rb->open(filename, O_RDONLY); + if (fd < 0) + { + rb->splash(2*HZ, true, "Can't open %s", filename); + return PLUGIN_ERROR; + } + readsize = rb->read(fd, &header, sizeof(header)); + rb->close(fd); + /* Close for now. Less code than doing it in all error checks. + * Would need to seek back anyway. */ + + if (readsize != sizeof(header)) + { + rb->splash(2*HZ, true, "Reading %s overlay failed.", name); + return PLUGIN_ERROR; + } + if (header.magic != PLUGIN_MAGIC || header.target_id != TARGET_ID) + { + rb->splash(2*HZ, true, "%s overlay: Incompatible model.", name); + return PLUGIN_ERROR; + } + if (header.api_version != PLUGIN_API_VERSION) + { + rb->splash(2*HZ, true, "%s overlay: Incompatible version.", name); + return PLUGIN_ERROR; + } + + audiobuf = rb->plugin_get_audio_buffer(&audiobuf_size); + if (header.load_addr < audiobuf || + header.end_addr > audiobuf + audiobuf_size) + { + rb->splash(2*HZ, true, "%s overlay doesn't fit into memory.", name); + return PLUGIN_ERROR; + } + rb->memset(header.load_addr, 0, header.end_addr - header.load_addr); + + fd = rb->open(filename, O_RDONLY); + if (fd < 0) + { + rb->splash(2*HZ, true, "Can't open %s", filename); + return PLUGIN_ERROR; + } + readsize = rb->read(fd, header.load_addr, header.end_addr - header.load_addr); + rb->close(fd); + + if (readsize < 0) + { + rb->splash(2*HZ, true, "Reading %s overlay failed.", name); + return PLUGIN_ERROR; + } + return header.entry_point(rb, parameter); +} +#endif diff --git a/apps/plugins/lib/overlay.h b/apps/plugins/lib/overlay.h new file mode 100755 index 0000000000..bbf7549274 --- /dev/null +++ b/apps/plugins/lib/overlay.h @@ -0,0 +1,34 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Overlay loader + * + * Copyright (C) 2006 Jens Arnold + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ + +#ifndef __OVERLAY_H__ +#define __OVERLAY_H__ + +#ifndef SIMULATOR +#include "plugin.h" + +/* load and run a plugin linked as an overlay. */ +enum plugin_status run_overlay(struct plugin_api* api, void* parameter, + unsigned char *filename, unsigned char *name); + +#endif /* !SIMULATOR */ +#endif /* __OVERLAY_H__ */ + diff --git a/apps/plugins/rockboy.c b/apps/plugins/rockboy.c index f571894717..9ff176cd25 100644 --- a/apps/plugins/rockboy.c +++ b/apps/plugins/rockboy.c @@ -9,7 +9,7 @@ * * Copyright (C) 2005 Jens Arnold * - * Overlay loader for rockboy on Archos + * Overlay loader stub plugin for rockboy on Archos * * All files in this archive are subject to the GNU General Public License. * See the file COPYING in the source tree root for full license agreement. @@ -22,76 +22,13 @@ #if MEM <= 8 && !defined(SIMULATOR) -PLUGIN_HEADER - -#define OVL_NAME "/.rockbox/viewers/rockboy.ovl" -#define OVL_DISPLAYNAME "RockBoy" +#include "overlay.h" -struct plugin_api* rb; -unsigned char *audiobuf; -int audiobuf_size; +PLUGIN_HEADER /* this is the plugin entry point */ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) { - int fd, readsize; - struct plugin_header header; - - rb = api; - - fd = rb->open(OVL_NAME, O_RDONLY); - if (fd < 0) - { - rb->splash(2*HZ, true, "Can't open " OVL_NAME); - return PLUGIN_ERROR; - } - readsize = rb->read(fd, &header, sizeof(header)); - rb->close(fd); - /* Close for now. Less code than doing it in all error checks. - * Would need to seek back anyway. */ - - if (readsize != sizeof(header)) - { - rb->splash(2*HZ, true, "Reading" OVL_DISPLAYNAME " overlay failed."); - return PLUGIN_ERROR; - } - if (header.magic != PLUGIN_MAGIC || header.target_id != TARGET_ID) - { - rb->splash(2*HZ, true, OVL_DISPLAYNAME - " overlay: Incompatible model."); - return PLUGIN_ERROR; - } - if (header.api_version != PLUGIN_API_VERSION) - { - rb->splash(2*HZ, true, OVL_DISPLAYNAME - " overlay: Incompatible version."); - return PLUGIN_ERROR; - } - - audiobuf = rb->plugin_get_audio_buffer(&audiobuf_size); - if (header.load_addr < audiobuf || - header.end_addr > audiobuf + audiobuf_size) - { - rb->splash(2*HZ, true, OVL_DISPLAYNAME - " overlay doesn't fit into memory."); - return PLUGIN_ERROR; - } - rb->memset(header.load_addr, 0, header.end_addr - header.load_addr); - - fd = rb->open(OVL_NAME, O_RDONLY); - if (fd < 0) - { - rb->splash(2*HZ, true, "Can't open " OVL_NAME); - return PLUGIN_ERROR; - } - readsize = rb->read(fd, header.load_addr, header.end_addr - header.load_addr); - rb->close(fd); - - if (readsize < 0) - { - rb->splash(2*HZ, true, "Reading" OVL_DISPLAYNAME " overlay failed."); - return PLUGIN_ERROR; - } - return header.entry_point(api, parameter); + return run_overlay(api, parameter, "/.rockbox/viewers/rockboy.ovl", "RockBoy"); } #endif -- cgit