diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2007-02-22 15:09:49 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2007-02-22 15:09:49 +0000 |
commit | 46597c953963eb8333e5122896fdcb4d0ec9f93f (patch) | |
tree | 434605a340de75938beb7cb996f57c333649f88e /bootloader/main.c | |
parent | 9744433752b59a5da45c8076c4be6d2980d8cbbb (diff) |
FS#6554 - Move bootloader code into a common file
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12453 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader/main.c')
-rw-r--r-- | bootloader/main.c | 150 |
1 files changed, 21 insertions, 129 deletions
diff --git a/bootloader/main.c b/bootloader/main.c index fd878ac5f6..c2e3cce302 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -43,20 +43,19 @@ #include "eeprom_settings.h" #include "pcf50606.h" +#include "common.h" #include <stdarg.h> +/* Maximum allowed firmware image size. 10MB is more than enough */ +#define MAX_LOADSIZE (10*1024*1024) + #define DRAM_START 0x31000000 #ifdef HAVE_EEPROM_SETTINGS static bool recovery_mode = false; #endif -int line = 0; -#ifdef HAVE_REMOTE_LCD -int remote_line = 0; -#endif - int usb_screen(void) { return 0; @@ -64,41 +63,6 @@ int usb_screen(void) char version[] = APPSVERSION; -char printfbuf[256]; - -void reset_screen(void) -{ - lcd_clear_display(); - line = 0; -#ifdef HAVE_REMOTE_LCD - lcd_remote_clear_display(); - remote_line = 0; -#endif -} - -void printf(const char *format, ...) -{ - int len; - unsigned char *ptr; - va_list ap; - va_start(ap, format); - - ptr = printfbuf; - len = vsnprintf(ptr, sizeof(printfbuf), format, ap); - va_end(ap); - - lcd_puts(0, line++, ptr); - lcd_update(); - if(line >= 16) - line = 0; -#ifdef HAVE_REMOTE_LCD - lcd_remote_puts(0, remote_line++, ptr); - lcd_remote_update(); - if(remote_line >= 8) - remote_line = 0; -#endif -} - /* Reset the cookie for the crt0 crash check */ inline void __reset_cookie(void) { @@ -116,68 +80,6 @@ void start_iriver_fw(void) asm(" jmp (%a0)"); } -int load_firmware(void) -{ - int fd; - int rc; - int len; - unsigned long chksum; - char model[5]; - unsigned long sum; - int i; - unsigned char *buf = (unsigned char *)DRAM_START; - - fd = open("/.rockbox/" BOOTFILE, O_RDONLY); - if(fd < 0) - { - fd = open("/" BOOTFILE, O_RDONLY); - if(fd < 0) - return -1; - } - - len = filesize(fd) - 8; - - printf("Length: %x", len); - - lseek(fd, FIRMWARE_OFFSET_FILE_CRC, SEEK_SET); - - rc = read(fd, &chksum, 4); - if(rc < 4) - return -2; - - printf("Checksum: %x", chksum); - - rc = read(fd, model, 4); - if(rc < 4) - return -3; - - model[4] = 0; - - printf("Model name: %s", model); - lcd_update(); - - lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET); - - rc = read(fd, buf, len); - if(rc < len) - return -4; - - close(fd); - - sum = MODEL_NUMBER; - - for(i = 0;i < len;i++) { - sum += buf[i]; - } - - printf("Sum: %x", sum); - - if(sum != chksum) - return -5; - - return 0; -} - void start_firmware(void) { asm(" move.w #0x2700,%sr"); @@ -353,6 +255,7 @@ void failsafe_menu(void) int defopt = -1; char buf[32]; int i; + extern int line; reset_screen(); printf("Bootloader %s", version); @@ -516,15 +419,21 @@ void main(void) } printf("Loading firmware"); - i = load_firmware(); - printf("Result: %d", i); - - if(i == 0) + i = load_firmware((unsigned char *)DRAM_START, BOOTFILE, MAX_LOADSIZE); + printf("Result: %s", strerror(i)); + + if (i < EOK) { + printf("Error!"); + printf("Can't load rockbox.ipod:"); + printf(strerror(rc)); + sleep(HZ*3); + power_off(); + } else { start_firmware(); - - power_off(); + } #else + extern int line; /* We want to read the buttons as early as possible, before the user releases the ON button */ @@ -721,15 +630,16 @@ void main(void) } printf("Loading firmware"); - i = load_firmware(); - printf("Result: %d", i); + i = load_firmware((unsigned char *)DRAM_START, BOOTFILE, MAX_LOADSIZE); + printf("Result: %d", strerror(i)); - if (i == 0) + if (i == EOK) start_firmware(); if (!detect_original_firmware()) { printf("No firmware found on disk"); + sleep(HZ*2); shutdown(); } else @@ -739,24 +649,6 @@ void main(void) /* These functions are present in the firmware library, but we reimplement them here because the originals do a lot more than we want */ - -void reset_poweroff_timer(void) -{ -} - void screen_dump(void) { } - -int dbg_ports(void) -{ - return 0; -} - -void mpeg_stop(void) -{ -} - -void sys_poweroff(void) -{ -} |