"Bootbox" is a minimalistic rescue firmware for Archos models. Not working yet (Rolo problems). Created by configure script as bootloader.


git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6786 a1c6a512-1295-4272-9138-f99709370657
diff --git a/flash/bootbox/FILES b/flash/bootbox/FILES
new file mode 100644
index 0000000..22e7774
--- /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 0000000..26de92f
--- /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 0000000..e241137
--- /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 0000000..da9efcf
--- /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 e4b3867..464ea4c 100755
--- a/tools/configure
+++ b/tools/configure
@@ -564,13 +564,15 @@
 
   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"
       ;;