summaryrefslogtreecommitdiffstats
path: root/bootloader
diff options
context:
space:
mode:
authorDave Chapman <dave@dchapman.com>2009-10-11 01:37:12 +0000
committerDave Chapman <dave@dchapman.com>2009-10-11 01:37:12 +0000
commitb04a7a86e1d903a37091486764d0dfe09372d663 (patch)
tree35c74cc921eb641858269c30c2add4e436d97ec8 /bootloader
parenta27f2b8683204e337b142124979592ee1cd0d6f9 (diff)
downloadrockbox-b04a7a86e1d903a37091486764d0dfe09372d663.tar.gz
rockbox-b04a7a86e1d903a37091486764d0dfe09372d663.tar.bz2
rockbox-b04a7a86e1d903a37091486764d0dfe09372d663.zip
Make the Nano2G bootloader actually function as a bootloader. The resulting bootloader-ipodnano2g.ipod file needs to be encrypted on a target using the crypt_firmware plugin to create bootloader-ipodnano2g.ipodx, which can then be written to the firmware partition using the ipodpatcher patch at FS#10609. Dual-booting doesn't work yet - only Rockbox can be run.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@23084 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader')
-rw-r--r--bootloader/SOURCES7
-rw-r--r--bootloader/ipodnano2g.c137
2 files changed, 107 insertions, 37 deletions
diff --git a/bootloader/SOURCES b/bootloader/SOURCES
index f297f18fba..a512064ffd 100644
--- a/bootloader/SOURCES
+++ b/bootloader/SOURCES
@@ -1,6 +1,8 @@
common.c
-#if defined(IPOD_ARCH)
+#if defined(IPOD_NANO2G)
+ipodnano2g.c
+#elif defined(IPOD_ARCH)
ipod.c
#elif defined(GIGABEAT_F)
gigabeat.c
@@ -55,7 +57,4 @@ show_logo.c
#elif defined(LYRE_PROTO1)
lyre_proto1.c
show_logo.c
-#elif defined(IPOD_NANO2G)
-ipodnano2g.c
-show_logo.c
#endif
diff --git a/bootloader/ipodnano2g.c b/bootloader/ipodnano2g.c
index f6bfe148ac..f05829eb6d 100644
--- a/bootloader/ipodnano2g.c
+++ b/bootloader/ipodnano2g.c
@@ -45,56 +45,127 @@
#include "file.h"
#include "common.h"
-char version[] = APPSVERSION;
+/* Safety measure - maximum allowed firmware image size.
+ The largest known current (October 2009) firmware is about 6.2MB so
+ we set this to 8MB.
+*/
+#define MAX_LOADSIZE (8*1024*1024)
+
+/* The buffer to load the firmware into */
+unsigned char *loadbuffer = (unsigned char *)0x08000000;
-/* Show the Rockbox logo - in show_logo.c */
-extern int show_logo(void);
+/* Bootloader version */
+char version[] = APPSVERSION;
extern int line;
+void fatal_error(void)
+{
+ extern int line;
+ bool holdstatus=false;
+
+ /* System font is 6 pixels wide */
+ printf("Hold MENU+SELECT to");
+ printf("reboot then SELECT+PLAY");
+ printf("for disk mode");
+ lcd_update();
+
+ while (1) {
+ if (button_hold() != holdstatus) {
+ if (button_hold()) {
+ holdstatus=true;
+ lcd_puts(0, line, "Hold switch on!");
+ } else {
+ holdstatus=false;
+ lcd_puts(0, line, " ");
+ }
+ lcd_update();
+ }
+ }
+}
+
void main(void)
{
int i;
+ int btn;
+ int rc;
+ bool button_was_held;
+
+ /* Check the button hold status as soon as possible - to
+ give the user maximum chance to turn it on in order to
+ reset the settings in rockbox. */
+ button_was_held = button_hold();
system_init();
- i2c_init();
kernel_init();
+ i2c_init();
+
enable_irq();
+ backlight_init(); /* Turns on the backlight */
+
lcd_init();
+ font_init();
+
+ lcd_set_foreground(LCD_WHITE);
+ lcd_set_background(LCD_BLACK);
+ lcd_clear_display();
+
+// button_init();
+
+ btn=0; /* TODO */
- _backlight_init();
-
- lcd_puts_scroll(0,0,"+++ this is a very very long line to test scrolling. ---");
- verbose = 0;
- i = 0;
- while (!button_hold()) {
- line = 1;
-
- printf("i=%d",i++);
- printf("TBCNT: %08x",TBCNT);
- printf("GPIO 0: %08x",PDAT0);
- printf("GPIO 1: %08x",PDAT1);
- printf("GPIO 2: %08x",PDAT2);
- printf("GPIO 3: %08x",PDAT3);
- printf("GPIO 4: %08x",PDAT4);
- printf("GPIO 5: %08x",PDAT5);
- printf("GPIO 6: %08x",PDAT6);
- printf("GPIO 7: %08x",PDAT7);
- printf("GPIO 10: %08x",PDAT10);
- printf("GPIO 11: %08x",PDAT11);
- printf("GPIO 13: %08x",PDAT13);
- printf("GPIO 14: %08x",PDAT14);
-
- lcd_update();
+ /* Enable bootloader messages */
+ if (btn==BUTTON_RIGHT)
+ verbose = true;
+
+ lcd_setfont(FONT_SYSFIXED);
+
+ printf("Rockbox boot loader");
+ printf("Version: %s", version);
+
+ i = storage_init();
+
+ if (i != 0) {
+ printf("ATA error: %d", i);
+ fatal_error();
}
- disable_irq();
+ disk_init();
+ rc = disk_mount_all();
+ if (rc<=0)
+ {
+ printf("No partition found");
+ fatal_error();
+ }
+
+ if (button_was_held || (btn==BUTTON_MENU)) {
+ /* If either the hold switch was on, or the Menu button was held, then
+ try the Apple firmware */
- /* Branch back to iBugger entry point */
- asm volatile("ldr pc, =0x08640568");
+ printf("Loading original firmware...");
+
+ /* TODO */
+ fatal_error();
+ } else {
+ printf("Loading Rockbox...");
+ rc=load_firmware(loadbuffer, BOOTFILE, MAX_LOADSIZE);
+
+ if (rc != EOK) {
+ printf("Error!");
+ printf("Can't load " BOOTFILE ": ");
+ printf(strerror(rc));
+ fatal_error();
+ }
+
+ printf("Rockbox loaded.");
+ }
+
+ /* If we get here, we have a new firmware image at 0x08000000, run it */
+
+ disable_irq();
- /* We never reach here */
- while(1);
+ /* Branch to start of DRAM */
+ asm volatile("ldr pc, =0x08000000");
}