diff options
author | Greg White <gwhite@rockbox.org> | 2007-01-17 01:49:19 +0000 |
---|---|---|
committer | Greg White <gwhite@rockbox.org> | 2007-01-17 01:49:19 +0000 |
commit | 8b3c8791f9cec1df3ace5082d0ffba6c281963f6 (patch) | |
tree | 46614cb8d174ce52a18bb2e82b0c7524edef59c0 /bootloader/gigabeat.c | |
parent | 708431da88b7afb5b101443a628b7a8657454369 (diff) |
Created bootsplash image
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12035 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader/gigabeat.c')
-rw-r--r-- | bootloader/gigabeat.c | 310 |
1 files changed, 73 insertions, 237 deletions
diff --git a/bootloader/gigabeat.c b/bootloader/gigabeat.c index 38e8bbf63e..d82ee971d9 100644 --- a/bootloader/gigabeat.c +++ b/bootloader/gigabeat.c @@ -18,132 +18,17 @@ #include "power.h" #include "file.h" #include "button-target.h" +#include "bootsplash-gigabeat.h" -void map_memory(void); +extern void map_memory(void); int line = 0; char version[] = APPSVERSION; -/* This section allows you to toggle bits of any memory location */ -/* Touchpad to move around the bits. Select to toggle the red bit */ -typedef struct { - unsigned int address; - char *desc; -} memlocation_struct; - -/* Just add any address and descriptions here */ -/* Must finish with 0xFFFFFFFF */ -const memlocation_struct memlocations[] = { -/* Address Description */ -{ 0x56000000, "GPACON" }, -{ 0x56000004, "GPADAT" }, -{ 0x56000010, "GPBCON" }, -{ 0x56000014, "GPBDAT" }, -{ 0x56000020, "GPCCON" }, -{ 0x56000024, "GPCDAT" }, -{ 0x56000030, "GPDCON" }, -{ 0x56000034, "GPDDAT" }, -{ 0x56000040, "GPECON" }, -{ 0x56000044, "GPEDAT" }, -{ 0x56000050, "GPFCON" }, -{ 0x56000054, "GPFDAT" }, -{ 0x56000060, "GPGCON" }, -{ 0x56000064, "GPGDAT" }, -{ 0x56000070, "GPHCON" }, -{ 0x56000074, "GPHDAT" }, -{ 0xFFFFFFFF, 0 } -}; - -void memdump(void) +static void go_usb_mode(void) { - int i, j; - int current=0, bit=0; - char * bitval; - int data; - char tmp[40]; - - while(1) { - i = 0; - - while(memlocations[i].address != 0xFFFFFFFF) { - - data = *(volatile int *)memlocations[i].address; - - snprintf(tmp, sizeof(tmp), "%s %s 0x%08X", - (i==current) ? "*" : " ", - memlocations[i].desc, - data); - lcd_puts(0, i*2+5, tmp); - - /* print out in binary, current bit in red */ - for (j=31; j>=0; j--) { - if ((bit == j) && (current == i)) - lcd_set_foreground(LCD_RGBPACK(255,0,0)); - lcd_puts((31-j) + ((31-j) / 8), i*2+6, (data & (1 << j)) ? "1" : "0" ); - lcd_set_foreground(LCD_RGBPACK(0,0,0)); - } - - i++; - } - - data = *(volatile int *)memlocations[current].address; - bitval = (data & (1 << bit)) ? "1" : "0"; - snprintf(tmp, sizeof(tmp), "%s bit %ld = %s", memlocations[current].desc, bit, bitval); - lcd_puts(0, (i*2)+7, tmp); - - lcd_update(); - - /* touchpad controls */ - - /* Up */ - if (GPJDAT & 0x01) { - if (current > 0) - current--; - while(GPJDAT & 0x01); - } - - /* Down */ - if (GPJDAT & 0x40) { - if (current < (i-1)) - current++; - while(GPJDAT & 0x40); - } - - /* Left */ - if (GPJDAT & 0x80) { - if (bit < 31) - bit++; - while(GPJDAT & 0x80); - } - - /* Right */ - if (GPJDAT & 0x1000) { - if (bit > 0) - bit--; - while(GPJDAT & 0x1000); - } - - /* Centre - Toggle Bit */ - if (GPJDAT & 0x08) { - data = *(volatile int *)memlocations[current].address; - data = data ^ (1 << bit); - *(volatile int *)memlocations[current].address = data; - while(GPJDAT & 0x08); - } - - /* Bail out if the power button is pressed */ - if (GPGDAT & 1) { - break; - } - } -} - - -static void go_usb_mode(void) { - /* Drop into USB mode. This does not check for disconnection. */ - - + /* Drop into USB mode. This does not check for disconnection. */ int i; GPBDAT &= 0x7EF; @@ -152,7 +37,9 @@ static void go_usb_mode(void) { GPGDAT &= 0xE7FF; GPGDAT |= 1<<11; - for (i = 0; i < 10000000; i++) {continue;} + for(i = 0; i < 10000000; i++) { + continue; + } GPBCON &= 0x2FFCFF; GPBDAT |= 1<<5; @@ -168,11 +55,11 @@ int restore_fwimg01dat(void) { int orig_file = 0, dest_file = 0; int size = 0, size_read; - char buf[256]; + static char buf[4096]; char lcd_buf[64]; orig_file = open("/GBSYSTEM/FWIMG/FWIMG01.DAT.ORIG", O_RDONLY); - if (orig_file < 0) { + if(orig_file < 0) { /* Couldn't open source file */ lcd_puts(0, line++, "Couldn't open FWIMG01.DAT.ORIG for reading"); lcd_update(); @@ -183,7 +70,7 @@ int restore_fwimg01dat(void) lcd_update(); dest_file = open("/GBSYSTEM/FWIMG/FWIMG01.DAT", O_RDWR); - if (dest_file < 0) { + if(dest_file < 0) { /* Couldn't open destination file */ lcd_puts(0, line++, "Couldn't open FWIMG01.DAT.ORIG for writing"); lcd_update(); @@ -197,14 +84,14 @@ int restore_fwimg01dat(void) do { /* Copy in chunks */ size_read = read(orig_file, buf, sizeof(buf)); - if (size_read != write(dest_file, buf, size_read)) { + if(size_read != write(dest_file, buf, size_read)) { close(orig_file); close(dest_file); return(3); } size += size_read; - } while (size_read > 0); + } while(size_read > 0); close(orig_file); close(dest_file); @@ -223,15 +110,9 @@ int load_rockbox(const char* file_name, unsigned char* buf, int buffer_size) int rc; int len; char str[256]; - //unsigned long chksum; - //char model[5]; - //unsigned long sum; - //int i; - //char str[80]; fd = open("/.rockbox/" BOOTFILE, O_RDONLY); - if(fd < 0) - { + if(fd < 0) { fd = open("/" BOOTFILE, O_RDONLY); if(fd < 0) return -1; @@ -242,68 +123,33 @@ int load_rockbox(const char* file_name, unsigned char* buf, int buffer_size) len = filesize(fd); - if (len > buffer_size) { + if(len > buffer_size) { snprintf(str, sizeof(str), "len: %d buf: %d", len, buffer_size); lcd_puts(0, line++, str); lcd_update(); return -6; } - /*lseek(fd, FIRMWARE_OFFSET_FILE_CRC, SEEK_SET); - - rc = read(fd, &chksum, 4); - chksum=betoh32(chksum);*/ /* Rockbox checksums are big-endian */ - /*if(rc < 4) - return -2; - - rc = read(fd, model, 4); - if(rc < 4) - return -3; - - model[4] = 0; - - snprintf(str, 80, "Model: %s", model); - lcd_puts(0, line++, str); - snprintf(str, 80, "Checksum: %x", chksum); - lcd_puts(0, line++, str); - lcd_update(); - - lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET); -*/ - rc = read(fd, buf, len); if(rc < len) { snprintf(str, sizeof(str), "len: %d rc: %d", len, rc); - lcd_puts(0, line++, str); + lcd_puts(0, line++, str); lcd_update(); return -4; } close(fd); - /*sum = MODEL_NUMBER; - - for(i = 0;i < len;i++) { - sum += buf[i]; - } - - snprintf(str, 80, "Sum: %x", sum); - lcd_puts(0, line++, str); - lcd_update(); - - if(sum != chksum) - return -5;*/ - return len; } + void * main(void) { int i; char buf[256]; struct partinfo* pinfo; unsigned short* identify_info; - //int testfile; unsigned char* loadbuffer; int buffer_size; bool load_original = false; @@ -311,55 +157,50 @@ void * main(void) int(*kernel_entry)(void); lcd_init(); - lcd_setfont(FONT_SYSFIXED); -/* - lcd_puts(0, line++, "Rockbox boot loader"); - snprintf(buf, sizeof(buf), "Version: 20%s", version); - lcd_puts(0, line++, buf); - snprintf(buf, sizeof(buf), "Gigabeat version: 0x%08x", 1); - lcd_puts(0, line++, buf); -*/ - - 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(); - sleep(1*HZ); - - /* hold MENU to enter rescue mode */ - if (GPGDAT & 2) { + bool show_bootsplash = true; + + if(GPGDAT & 2) + show_bootsplash = false; + + if(!show_bootsplash) { + 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(); + sleep(2*HZ); + } else + memcpy(FRAME, bootsplash, LCD_WIDTH*LCD_HEIGHT*2); + if(GPGDAT & 2) { lcd_puts(0, line++, "Entering rescue mode.."); lcd_update(); go_usb_mode(); while(1); } - - sleep(1*HZ); - if(GPGDAT & 0x10) { load_original = true; lcd_puts(0, line++, "Loading original firmware..."); lcd_update(); - } + } i = ata_init(); i = disk_mount_all(); - - snprintf(buf, sizeof(buf), "disk_mount_all: %d", i); - lcd_puts(0, line++, buf); - + if(!show_bootsplash) { + snprintf(buf, sizeof(buf), "disk_mount_all: %d", i); + lcd_puts(0, line++, buf); + } /* hold VOL+ to enter rescue mode to copy old image */ /* needs to be after ata_init and disk_mount_all */ - if (GPGDAT & 4) { + if(GPGDAT & 4) { /* Try to restore the original kernel/bootloader if a copy is found */ lcd_puts(0, line++, "Restoring FWIMG01.DAT..."); lcd_update(); - if (!restore_fwimg01dat()) { + if(!restore_fwimg01dat()) { lcd_puts(0, line++, "Restoring FWIMG01.DAT successful."); } else { lcd_puts(0, line++, "Restoring FWIMG01.DAT failed."); @@ -370,45 +211,41 @@ void * main(void) while(1); } - /* Memory dump mode if Vol- pressed */ - if (GPGDAT & 8) { - memdump(); - } - - identify_info = ata_get_identify(); - - for (i=0; i < 20; i++) - ((unsigned short*)buf)[i]=htobe16(identify_info[i+27]); + if(!show_bootsplash) { + identify_info = ata_get_identify(); - buf[40]=0; + for(i=0; i < 20; i++) + ((unsigned short*)buf)[i]=htobe16(identify_info[i+27]); - /* kill trailing space */ - for (i=39; i && buf[i]==' '; i--) - buf[i] = 0; + buf[40]=0; - lcd_puts(0, line++, "Model"); - lcd_puts(0, line++, buf); + /* kill trailing space */ + for(i=39; i && buf[i]==' '; i--) + buf[i] = 0; - for (i=0; i < 4; i++) - ((unsigned short*)buf)[i]=htobe16(identify_info[i+23]); + lcd_puts(0, line++, "Model"); + lcd_puts(0, line++, buf); - buf[8]=0; + for(i=0; i < 4; i++) + ((unsigned short*)buf)[i]=htobe16(identify_info[i+23]); - lcd_puts(0, line++, "Firmware"); - lcd_puts(0, line++, buf); + buf[8]=0; - 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(); + lcd_puts(0, line++, "Firmware"); + lcd_puts(0, line++, 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(); + } /* 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) { + if(rc < 0) { lcd_puts(0, line++, "failed to load original firmware. Loading rockbox"); lcd_update(); sleep(2*HZ); @@ -420,7 +257,6 @@ void * main(void) lcd_update(); sleep(2*HZ); - (*((int*)0x7000000)) = 333; rc = *((int*)0x7000000+0x8000000); snprintf(buf, sizeof(buf), "Bank0 mem test: %d", rc); @@ -435,21 +271,23 @@ void * main(void) load_rockbox: map_memory(); - lcd_puts(0, line, "Loading Rockbox..."); - lcd_update(); - /* sleep(HZ*4); */ + if(!show_bootsplash) { + lcd_puts(0, line, "Loading Rockbox..."); + lcd_update(); + } - // TODO: read those values from somwhere loadbuffer = (unsigned char*) 0x100; buffer_size = (unsigned char*)0x400000 - loadbuffer; rc=load_rockbox("/rockbox.gigabeat", loadbuffer, buffer_size); - if (rc < 0) { + if(rc < 0) { snprintf(buf, sizeof(buf), "Rockbox error: %d",rc); lcd_puts(0, line++, buf); lcd_update(); } else { - lcd_puts(0, line++, "Rockbox loaded."); - lcd_update(); + if(!show_bootsplash) { + lcd_puts(0, line++, "Rockbox loaded."); + lcd_update(); + } kernel_entry = (void*) loadbuffer; rc = kernel_entry(); snprintf(buf, sizeof(buf), "Woops, should not return from firmware: %d", rc); @@ -457,13 +295,11 @@ load_rockbox: lcd_update(); goto usb; } - - usb: /* now wait in USB mode so the bootloader can be updated */ go_usb_mode(); while(1); - return((void *)0); + return((void *)0); } |