From 46597c953963eb8333e5122896fdcb4d0ec9f93f Mon Sep 17 00:00:00 2001 From: Linus Nielsen Feltzing Date: Thu, 22 Feb 2007 15:09:49 +0000 Subject: FS#6554 - Move bootloader code into a common file git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12453 a1c6a512-1295-4272-9138-f99709370657 --- bootloader/SOURCES | 4 +- bootloader/common.c | 2 +- bootloader/gigabeat.c | 148 ++++++++++++++----------------------------------- bootloader/main.c | 150 +++++++------------------------------------------- bootloader/tpj1022.c | 24 +------- 5 files changed, 68 insertions(+), 260 deletions(-) diff --git a/bootloader/SOURCES b/bootloader/SOURCES index 76cb6931ef..68002caf0b 100644 --- a/bootloader/SOURCES +++ b/bootloader/SOURCES @@ -1,10 +1,10 @@ -#if defined(IPOD_ARCH) common.c + +#if defined(IPOD_ARCH) ipod.c #elif defined(GIGABEAT_F) gigabeat.c #elif defined(IRIVER_H10) || defined(IRIVER_H10_5GB) || defined(SANSA_E200) -common.c main-pp.c #elif defined(ELIO_TPJ1022) tpj1022.c diff --git a/bootloader/common.c b/bootloader/common.c index 410fd42cd8..1d0ad360be 100644 --- a/bootloader/common.c +++ b/bootloader/common.c @@ -154,7 +154,7 @@ int load_firmware(unsigned char* buf, char* firmware, int buffer_size) if(sum != chksum) return EBAD_CHKSUM; - return len; + return EOK; } /* Load raw binary image. */ diff --git a/bootloader/gigabeat.c b/bootloader/gigabeat.c index a466f9498f..f9073028fb 100644 --- a/bootloader/gigabeat.c +++ b/bootloader/gigabeat.c @@ -18,11 +18,10 @@ #include "power.h" #include "file.h" #include "button-target.h" +#include "common.h" extern void map_memory(void); -int line = 0; - char version[] = APPSVERSION; static void go_usb_mode(void) @@ -55,30 +54,25 @@ int restore_fwimg01dat(void) int orig_file = 0, dest_file = 0; int size = 0, size_read; static char buf[4096]; - char lcd_buf[64]; - + orig_file = open("/GBSYSTEM/FWIMG/FWIMG01.DAT.ORIG", O_RDONLY); if(orig_file < 0) { /* Couldn't open source file */ - lcd_puts(0, line++, "Couldn't open FWIMG01.DAT.ORIG for reading"); - lcd_update(); + printf("Couldn't open FWIMG01.DAT.ORIG for reading"); return(1); } - lcd_puts(0, line++, "FWIMG01.DAT.ORIG opened for reading"); - lcd_update(); + printf("FWIMG01.DAT.ORIG opened for reading"); dest_file = open("/GBSYSTEM/FWIMG/FWIMG01.DAT", O_RDWR); if(dest_file < 0) { /* Couldn't open destination file */ - lcd_puts(0, line++, "Couldn't open FWIMG01.DAT.ORIG for writing"); - lcd_update(); + printf("Couldn't open FWIMG01.DAT.ORIG for writing"); close(orig_file); return(2); } - lcd_puts(0, line++, "FWIMG01.DAT opened for writing"); - lcd_update(); + printf("FWIMG01.DAT opened for writing"); do { /* Copy in chunks */ @@ -95,65 +89,22 @@ int restore_fwimg01dat(void) close(orig_file); close(dest_file); - snprintf(lcd_buf, sizeof(lcd_buf), "Finished copying %ld bytes from", size); - lcd_puts(0, line++, lcd_buf); - lcd_puts(0, line++, "FWIMG01.DAT.ORIG to FWIMG01.DAT"); + printf("Finished copying %ld bytes from", size); + printf("FWIMG01.DAT.ORIG to FWIMG01.DAT"); return(0); } - -int load_rockbox(const char* file_name, unsigned char* buf, int buffer_size) -{ - int fd; - int rc; - int len; - char str[256]; - - fd = open("/.rockbox/" BOOTFILE, O_RDONLY); - if(fd < 0) { - fd = open("/" BOOTFILE, O_RDONLY); - if(fd < 0) - return -1; - } - fd = open(file_name, O_RDONLY); - if(fd < 0) - return -2; - - len = filesize(fd); - - if(len > buffer_size) { - snprintf(str, sizeof(str), "len: %d buf: %d", len, buffer_size); - lcd_puts(0, line++, str); - lcd_update(); - return -6; - } - - rc = read(fd, buf, len); - if(rc < len) { - snprintf(str, sizeof(str), "len: %d rc: %d", len, rc); - lcd_puts(0, line++, str); - lcd_update(); - return -4; - } - - close(fd); - - return len; -} - char buf[256]; void display_instructions(void) { lcd_setfont(FONT_SYSFIXED); - lcd_puts(0, line++, "Hold MENU when booting for rescue mode."); - lcd_puts(0, line++, " \"VOL+\" button to restore original kernel"); - lcd_puts(0, line++, " \"A\" button to load original firmware"); - line++; - snprintf(buf, sizeof(buf), "FRAME %x TTB %x", FRAME, TTB_BASE); - lcd_puts(0, line++, buf); - lcd_update(); + printf("Hold MENU when booting for rescue mode."); + printf(" \"VOL+\" button to restore original kernel"); + printf(" \"A\" button to load original firmware"); + printf(""); + printf("FRAME %x TTB %x", FRAME, TTB_BASE); } void * main(void) @@ -179,23 +130,20 @@ void * main(void) } if(GPGDAT & 2) { lcd_init(); - lcd_puts(0, line++, "Entering rescue mode.."); - lcd_update(); + printf("Entering rescue mode.."); go_usb_mode(); while(1); } if(GPGDAT & 0x10) { lcd_init(); load_original = true; - lcd_puts(0, line++, "Loading original firmware..."); - lcd_update(); + printf("Loading original firmware..."); } i = ata_init(); i = disk_mount_all(); if(!show_bootsplash) { - snprintf(buf, sizeof(buf), "disk_mount_all: %d", i); - lcd_puts(0, line++, buf); + printf("disk_mount_all: %d", i); } if(show_bootsplash) { int fd = open("/bootsplash.raw", O_RDONLY); @@ -216,17 +164,15 @@ void * main(void) if(GPGDAT & 4) { /* Try to restore the original kernel/bootloader if a copy is found */ - lcd_puts(0, line++, "Restoring FWIMG01.DAT..."); - lcd_update(); + printf("Restoring FWIMG01.DAT..."); if(!restore_fwimg01dat()) { - lcd_puts(0, line++, "Restoring FWIMG01.DAT successful."); + printf("Restoring FWIMG01.DAT successful."); } else { - lcd_puts(0, line++, "Restoring FWIMG01.DAT failed."); + printf("Restoring FWIMG01.DAT failed."); } - lcd_puts(0, line++, "Now power cycle to boot original"); - lcd_update(); + printf("Now power cycle to boot original"); while(1); } @@ -242,76 +188,66 @@ void * main(void) for(i=39; i && buf[i]==' '; i--) buf[i] = 0; - lcd_puts(0, line++, "Model"); - lcd_puts(0, line++, buf); + printf("Model"); + printf(buf); for(i=0; i < 4; i++) ((unsigned short*)buf)[i]=htobe16(identify_info[i+23]); buf[8]=0; - lcd_puts(0, line++, "Firmware"); - lcd_puts(0, line++, buf); + printf("Firmware"); + printf(buf); pinfo = disk_partinfo(0); - snprintf(buf, sizeof(buf), "Partition 0: 0x%02x %ld MB", - pinfo->type, pinfo->size / 2048); - lcd_puts(0, line++, buf); - lcd_update(); + printf("Partition 0: 0x%02x %ld MB", pinfo->type, pinfo->size / 2048); } /* Load original firmware */ if(load_original) { loadbuffer = (unsigned char*)0x30008000; buffer_size =(unsigned char*)0x31000000 - loadbuffer; - rc = load_rockbox("/rockbox.gigabeat", loadbuffer, buffer_size); - if(rc < 0) { - lcd_puts(0, line++, "failed to load original firmware. Loading rockbox"); - lcd_update(); + rc = load_firmware("rockbox.gigabeat", loadbuffer, buffer_size); + if(rc < EOK) { + printf("Error!"); + printf("Failed to load original firmware:"); + printf(strerror(rc)); + printf("Loading rockbox"); sleep(2*HZ); goto load_rockbox; } - snprintf(buf, sizeof(buf), "Loaded: %d", rc); - lcd_puts(0, line++, buf); - lcd_update(); + printf("Loaded: %d", rc); sleep(2*HZ); (*((int*)0x7000000)) = 333; rc = *((int*)0x7000000+0x8000000); - snprintf(buf, sizeof(buf), "Bank0 mem test: %d", rc); - lcd_puts(0, line++, buf); - lcd_update(); + printf("Bank0 mem test: %d", rc); sleep(3*HZ); - lcd_puts(0, line++, "Woops, should not return from firmware!"); - lcd_update(); + printf("Woops, should not return from firmware!"); goto usb; } load_rockbox: map_memory(); if(!show_bootsplash) { - lcd_puts(0, line, "Loading Rockbox..."); - lcd_update(); + printf("Loading Rockbox..."); } loadbuffer = (unsigned char*) 0x100; buffer_size = (unsigned char*)0x400000 - loadbuffer; - rc=load_rockbox("/rockbox.gigabeat", loadbuffer, buffer_size); - if(rc < 0) { - snprintf(buf, sizeof(buf), "Rockbox error: %d",rc); - lcd_puts(0, line++, buf); - lcd_update(); + rc=load_firmware("rockbox.gigabeat", loadbuffer, buffer_size); + if(rc < EOK) { + printf("Error!"); + printf("Can't load rockbox.gigabeat:"); + printf(strerror(rc)); } else { if(!show_bootsplash) { - lcd_puts(0, line++, "Rockbox loaded."); - lcd_update(); + printf("Rockbox loaded."); } kernel_entry = (void*) loadbuffer; rc = kernel_entry(); - snprintf(buf, sizeof(buf), "Woops, should not return from firmware: %d", rc); - lcd_puts(0, line++, buf); - lcd_update(); + printf("Woops, should not return from firmware: %d", rc); goto usb; } usb: 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 +/* 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) -{ -} diff --git a/bootloader/tpj1022.c b/bootloader/tpj1022.c index 0088f73690..5d70adf5fe 100644 --- a/bootloader/tpj1022.c +++ b/bootloader/tpj1022.c @@ -37,11 +37,10 @@ #include "panic.h" #include "power.h" #include "file.h" +#include "common.h" char version[] = APPSVERSION; -int line=0; - void* main(void) { int i; @@ -54,8 +53,7 @@ void* main(void) lcd_init(); font_init(); - lcd_puts(0, line++ ,"Hello World!"); - lcd_update(); + printf("Hello World!"); #endif i=ata_init(); @@ -108,20 +106,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) -{ -} - -int dbg_ports(void) -{ - return 0; -} - -void mpeg_stop(void) -{ -} - void usb_acknowledge(void) { } @@ -129,7 +113,3 @@ void usb_acknowledge(void) void usb_wait_for_disconnect(void) { } - -void sys_poweroff(void) -{ -} -- cgit v1.2.3