diff options
-rw-r--r-- | flash/bootbox/FILES | 4 | ||||
-rw-r--r-- | flash/bootbox/Makefile | 85 | ||||
-rw-r--r-- | flash/bootbox/SOURCES | 1 | ||||
-rw-r--r-- | flash/bootbox/main.c | 237 | ||||
-rwxr-xr-x | tools/configure | 14 |
5 files changed, 335 insertions, 6 deletions
diff --git a/flash/bootbox/FILES b/flash/bootbox/FILES new file mode 100644 index 0000000000..22e7774f20 --- /dev/null +++ b/flash/bootbox/FILES @@ -0,0 +1,4 @@ +Makefile +SOURCES +FILES +*.c diff --git a/flash/bootbox/Makefile b/flash/bootbox/Makefile new file mode 100644 index 0000000000..26de92fb57 --- /dev/null +++ b/flash/bootbox/Makefile @@ -0,0 +1,85 @@ +# __________ __ ___. +# Open \______ \ ____ ____ | | _\_ |__ _______ ___ +# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / +# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < +# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ +# \/ \/ \/ \/ \/ +# $Id$ +# + +INCLUDES= -I$(FIRMDIR)/include -I$(FIRMDIR)/export -I. -I$(OBJDIR) \ + -I$(BUILDDIR) + +DEPFILE = $(OBJDIR)/dep-bootbox +LDS := $(FIRMDIR)/app.lds + +ifdef DEBUG + DEFINES := -DDEBUG + CFLAGS += -g +endif + +SRC := $(shell cat SOURCES | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) $(DEFINES) -E -P -include "config.h" - ) +DIRS = . + +ifdef APPEXTRA + DIRS += $(APPEXTRA) + INCLUDES += -I$(APPEXTRA) +endif + +CFLAGS = $(GCCOPTS) $(INCLUDES) $(TARGET) $(DEFINES) \ + -DAPPSVERSION=\"$(VERSION)\" $(EXTRA_DEFINES) -DMEM=${MEMORYSIZE} + +OBJS := $(SRC:%.c=$(OBJDIR)/%.o) +SOURCES = $(SRC) +LINKFILE = $(OBJDIR)/linkage.lds +MAXINFILE = $(OBJDIR)/romstart.temp +MAXOUTFILE = $(OBJDIR)/romstart + +all: $(BUILDDIR)/$(BINARY) $(FLASHFILE) + +dep: $(DEPFILE) + +$(LINKFILE): $(LDS) + @echo "Build LDS file" + @cat $< | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) $(DEFINES) -E -P $(ROMBUILD) - >$@ + +$(MAXOUTFILE): + @echo '#include "config.h"' > $(MAXINFILE) + @echo "ROM_START" >> $(MAXINFILE) + @cat $(MAXINFILE) | $(CC) -DMEMORYSIZE=$(MEMORYSIZE) $(INCLUDES) $(TARGET) $(DEFINES) -E -P $(ROMBUILD) - > $(MAXOUTFILE) + @rm $(MAXINFILE) + +$(OBJDIR)/bootbox.elf : $(OBJS) $(LINKFILE) $(DEPFILE) + @echo "LD bootbox.elf" + $(CC) $(GCCOPTS) -Wl,--gc-sections -Os -nostdlib -o $@ $(OBJS) -L$(BUILDDIR) -L$(BUILDDIR)/firmware -lrockbox -lgcc -T$(LINKFILE) -Wl,-Map,$(OBJDIR)/bootbox.map + +$(OBJDIR)/bootbox.bin : $(OBJDIR)/bootbox.elf + @echo "OBJCOPY $<" + @$(OC) -O binary $< $@ + +$(OBJDIR)/bootbox.asm: $(OBJDIR)/bootbox.bin + $(TOOLSDIR)/sh2d -sh1 $< > $@ + +$(BUILDDIR)/$(BINARY) : $(OBJDIR)/bootbox.bin + @echo "Build bootbox file" + @$(MKFIRMWARE) $< $@ + +$(FLASHFILE): $(OBJDIR)/bootbox.bin + @a=`uclpack -h 2>/dev/null`; \ + if test -n "$$a"; then \ + echo "UCLPACK bootbox" ; \ + uclpack --best --2e $< $@ >/dev/null 2>&1; \ + else \ + echo "no uclpack command found, makes a fake bootbox.ucl"; \ + echo "fake" > $@; \ + fi + +include $(TOOLSDIR)/make.inc + +clean: + @echo "cleaning bootbox" + @-rm -f $(OBJS) $(BUILDDIR)/$(BINARY) $(OBJDIR)/bootbox.asm $(OBJDIR)/rockbox.ucl \ + $(OBJDIR)/bootbox.bin $(OBJDIR)/bootbox.elf $(OBJDIR)/*.map \ + $(LINKFILE) $(MAXOUTFILE) $(DEPFILE) + +-include $(DEPFILE) diff --git a/flash/bootbox/SOURCES b/flash/bootbox/SOURCES new file mode 100644 index 0000000000..e241137f99 --- /dev/null +++ b/flash/bootbox/SOURCES @@ -0,0 +1 @@ +main.c diff --git a/flash/bootbox/main.c b/flash/bootbox/main.c new file mode 100644 index 0000000000..da9efcf728 --- /dev/null +++ b/flash/bootbox/main.c @@ -0,0 +1,237 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2005 by Jörg Hohensohn aka [IDC]Dragon + * + * 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. + * + ****************************************************************************/ +#include "config.h" + +#include <stdlib.h> +#include <stdio.h> +#include "cpu.h" +#include "system.h" +#include "lcd.h" +#include "kernel.h" +#include "thread.h" +#include "ata.h" +#include "disk.h" +#include "font.h" +#include "adc.h" +#include "button.h" +#include "panic.h" +#include "power.h" +#include "file.h" +#include "rolo.h" +#include "usb.h" +#include "powermgmt.h" + +int line = 0; + +void usb_screen(void) +{ + lcd_clear_display(); + lcd_puts(0, 0, "USB mode"); +#ifdef HAVE_LCD_BITMAP + lcd_update(); +#endif + usb_acknowledge(SYS_USB_CONNECTED_ACK); + while(usb_wait_for_disconnect_w_tmo(&button_queue, HZ)) { + } +} + +int show_logo(void) +{ + lcd_clear_display(); + lcd_puts(0, 0, "Rockbox"); + lcd_puts(0, 1, "Rescue boot"); +#ifdef HAVE_LCD_BITMAP + lcd_update(); +#endif + return 0; +} + +#ifdef HAVE_CHARGING +int charging_screen(void) +{ + unsigned int button; + int rc = 0; +#ifdef BUTTON_OFF + const unsigned int offbutton = BUTTON_OFF; +#else + const unsigned int offbutton = BUTTON_STOP; +#endif + + ide_power_enable(false); /* power down the disk, else would be spinning */ + + lcd_clear_display(); + lcd_puts(0, 0, "charging..."); +#ifdef HAVE_LCD_BITMAP + lcd_update(); +#endif + + do + { + button = button_get_w_tmo(HZ/2); +#ifdef BUTTON_ON + if (button == (BUTTON_ON | BUTTON_REL)) +#else + if (button == (BUTTON_RIGHT | BUTTON_REL)) +#endif + rc = 3; + else if (button == offbutton) + rc = 2; + else + { + if (usb_detect()) + rc = 4; + else if (!charger_inserted()) + rc = 1; + } + } while (!rc); + + return rc; +} +#endif /* HAVE_CHARGING */ + + +void main(void) +{ + int rc; + + power_init(); + system_init(); + kernel_init(); + lcd_init(); + show_logo(); + set_irq_level(0); + adc_init(); + usb_init(); + button_init(); + powermgmt_init(); + +#if defined(HAVE_CHARGING) && (CONFIG_CPU == SH7034) + if (charger_inserted() +#ifdef ATA_POWER_PLAYERSTYLE + && !ide_powered() /* relies on probing result from bootloader */ +#endif + ) + { + rc = charging_screen(); /* display a "charging" screen */ + if (rc == 1 || rc == 2) /* charger removed or "Off/Stop" pressed */ + power_off(); + /* "On" pressed or USB connected: proceed */ + show_logo(); /* again, to provide better visual feedback */ + } +#endif + + rc = ata_init(); + if(rc) + { +#ifdef HAVE_LCD_BITMAP + char str[32]; + lcd_clear_display(); + snprintf(str, 31, "ATA error: %d", rc); + lcd_puts(0, 1, str); + lcd_update(); + while(!(button_get(true) & BUTTON_REL)); +#endif + panicf("ata: %d", rc); + } + + //disk_init(); + usb_start_monitoring(); + while (usb_detect()) + { /* enter USB mode early, before trying to mount */ + if (button_get_w_tmo(HZ/10) == SYS_USB_CONNECTED) +#ifdef HAVE_MMC + if (!mmc_touched() || (mmc_remove_request() == SYS_MMC_EXTRACTED)) +#endif + { + usb_screen(); + } + } + + rc = disk_mount_all(); + if (rc<=0) + { + lcd_clear_display(); + lcd_puts(0, 0, "No partition"); + lcd_puts(0, 1, "found."); +#ifdef HAVE_LCD_BITMAP + lcd_puts(0, 2, "Insert USB cable"); + lcd_puts(0, 3, "and fix it."); + lcd_update(); +#endif + while(button_get(true) != SYS_USB_CONNECTED) {}; + usb_screen(); + system_reboot(); + } + + { // rolo the firmware + int fd; + static const char filename[] = BOOTFILE; + fd = open(filename, O_RDONLY); + if(fd >= 0) /* no complaint if it doesn't exit */ + { + close(fd); + rolo_load((char*)filename); /* start if it does */ + } + + lcd_clear_display(); + lcd_puts(0, 0, "No firmware"); + lcd_puts(0, 1, filename); +#ifdef HAVE_LCD_BITMAP + lcd_update(); +#endif + while(!(button_get(true) & BUTTON_REL)); + system_reboot(); + } + + +} + +/* These functions are present in the firmware library, but we reimplement + them here because the originals do a lot more than we want */ + +void screen_dump(void) +{ +} + +int dbg_ports(void) +{ + return 0; +} + +void audio_stop(void) +{ +} + +int audio_status(void) +{ + return 0; +} + +void mp3_shutdown(void) +{ +} +/* +void i2c_init(void) +{ +} + +void backlight_on(void) +{ +} +*/ diff --git a/tools/configure b/tools/configure index e4b3867ba3..464ea4c220 100755 --- a/tools/configure +++ b/tools/configure @@ -564,13 +564,15 @@ fi case $option in [Bb]) - if [ "$archos" != "h100" ]; then - echo "only the iRiver_h100 platform can build a boot loader"; - exit + if [ "$archos" = "h100" ]; then + extradefines="-DBOOTLOADER" # for target makefile symbol EXTRA_DEFINES + appsdir='\$(ROOTDIR)/bootloader' + apps="bootloader" + else + extradefines="-DBOOTLOADER -ffunction-sections -fdata-sections" + appsdir='\$(ROOTDIR)/flash/bootbox' + apps="bootbox" fi - extradefines="-DBOOTLOADER" # for target makefile symbol EXTRA_DEFINES - appsdir='\$(ROOTDIR)/bootloader' - apps="bootloader" bootloader="1" echo "Bootloader build selected" ;; |