diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2006-03-22 11:45:33 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2006-03-22 11:45:33 +0000 |
commit | ce6527b7d2a346e1cd6f1e8cc809608adf15982d (patch) | |
tree | 0a250f356d7c4481bc5dd849996f41c62ef2eaf0 /bootloader | |
parent | 8f186803a53a907431e428355dc355996c77f9e7 (diff) | |
download | rockbox-ce6527b7d2a346e1cd6f1e8cc809608adf15982d.tar.gz rockbox-ce6527b7d2a346e1cd6f1e8cc809608adf15982d.zip |
iAudio X5 bootloader, plus some cleanup
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9180 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader')
-rw-r--r-- | bootloader/main.c | 129 |
1 files changed, 101 insertions, 28 deletions
diff --git a/bootloader/main.c b/bootloader/main.c index 69993e4fe6..8d4c1e27aa 100644 --- a/bootloader/main.c +++ b/bootloader/main.c @@ -37,6 +37,10 @@ #include "file.h" #include "uda1380.h" +#include "pcf50606.h" + +#include <stdarg.h> + #define DRAM_START 0x31000000 int line = 0; @@ -48,6 +52,25 @@ int usb_screen(void) char version[] = APPSVERSION; +char printfbuf[256]; + +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; +} + void start_iriver_fw(void) { asm(" move.w #0x2700,%sr"); @@ -70,7 +93,6 @@ int load_firmware(void) unsigned long sum; int i; unsigned char *buf = (unsigned char *)DRAM_START; - char str[80]; fd = open("/.rockbox/" BOOTFILE, O_RDONLY); if(fd < 0) @@ -82,8 +104,7 @@ int load_firmware(void) len = filesize(fd) - 8; - snprintf(str, 80, "Length: %x", len); - lcd_puts(0, line++, str); + printf("Length: %x", len); lcd_update(); lseek(fd, FIRMWARE_OFFSET_FILE_CRC, SEEK_SET); @@ -92,8 +113,7 @@ int load_firmware(void) if(rc < 4) return -2; - snprintf(str, 80, "Checksum: %x", chksum); - lcd_puts(0, line++, str); + printf("Checksum: %x", chksum); lcd_update(); rc = read(fd, model, 4); @@ -102,8 +122,7 @@ int load_firmware(void) model[4] = 0; - snprintf(str, 80, "Model name: %s", model); - lcd_puts(0, line++, str); + printf("Model name: %s", model); lcd_update(); lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET); @@ -120,8 +139,7 @@ int load_firmware(void) sum += buf[i]; } - snprintf(str, 80, "Sum: %x", sum); - lcd_puts(0, line++, str); + printf("Sum: %x", sum); lcd_update(); if(sum != chksum) @@ -148,12 +166,71 @@ void main(void) { int i; int rc; - char buf[256]; bool rc_on_button = false; bool on_button = false; int data; int adc_battery, battery_voltage, batt_int, batt_frac; +#ifdef IAUDIO_X5 + (void)rc_on_button; + (void)on_button; + (void)data; + power_init(); + + system_init(); + kernel_init(); + + set_cpu_frequency(CPUFREQ_NORMAL); + + set_irq_level(0); + lcd_init(); + font_init(); + adc_init(); + button_init(); + + printf("Rockbox boot loader"); + printf("Version %s", version); + lcd_update(); + + adc_battery = adc_read(ADC_BATTERY); + + battery_voltage = (adc_battery * BATTERY_SCALE_FACTOR) / 10000; + batt_int = battery_voltage / 100; + batt_frac = battery_voltage % 100; + + printf("Batt: %d.%02dV", batt_int, batt_frac); + lcd_update(); + + rc = ata_init(); + if(rc) + { + printf("ATA error: %d", rc); + sleep(HZ*5); + power_off(); + } + + disk_init(); + + rc = disk_mount_all(); + if (rc<=0) + { + printf("No partition found"); + sleep(HZ*5); + power_off(); + } + + printf("Loading firmware"); + lcd_update(); + i = load_firmware(); + printf("Result: %d", i); + lcd_update(); + + if(i == 0) + start_firmware(); + + power_off(); + +#else /* We want to read the buttons as early as possible, before the user releases the ON button */ @@ -225,9 +302,8 @@ void main(void) lcd_setfont(FONT_SYSFIXED); - lcd_puts(0, line++, "Rockbox boot loader"); - snprintf(buf, sizeof(buf), "Version %s", version); - lcd_puts(0, line++, buf); + printf("Rockbox boot loader"); + printf("Version %s", version); lcd_update(); sleep(HZ/50); /* Allow the button driver to check the buttons */ @@ -235,7 +311,7 @@ void main(void) /* Holding REC while starting runs the original firmware */ if(((button_status() & BUTTON_REC) == BUTTON_REC) || ((button_status() & BUTTON_RC_REC) == BUTTON_RC_REC)) { - lcd_puts(0, 8, "Starting original firmware..."); + printf("Starting original firmware..."); lcd_update(); start_iriver_fw(); } @@ -244,7 +320,7 @@ void main(void) are starting with */ if(!usb_detect() && ((on_button && button_hold()) || (rc_on_button && remote_button_hold()))) { - lcd_puts(0, 8, "HOLD switch on, power off..."); + printf("HOLD switch on, power off..."); lcd_update(); sleep(HZ*2); @@ -270,13 +346,11 @@ void main(void) batt_int = battery_voltage / 100; batt_frac = battery_voltage % 100; - snprintf(buf, 32, "Batt: %d.%02dV", batt_int, batt_frac); - lcd_puts(0, line++, buf); + printf("Batt: %d.%02dV", batt_int, batt_frac); lcd_update(); if(battery_voltage <= 300) { - line++; - lcd_puts(0, line++, "WARNING! BATTERY LOW!!"); + printf("WARNING! BATTERY LOW!!"); lcd_update(); sleep(HZ*2); } @@ -284,12 +358,10 @@ void main(void) rc = ata_init(); if(rc) { - char str[32]; lcd_clear_display(); - snprintf(str, 31, "ATA error: %d", rc); - lcd_puts(0, line++, str); - lcd_puts(0, line++, "Insert USB cable and press"); - lcd_puts(0, line++, "a button"); + printf("ATA error: %d", rc); + printf("Insert USB cable and press"); + printf("a button"); lcd_update(); while(!(button_get(true) & BUTTON_REL)); } @@ -336,21 +408,22 @@ void main(void) if (rc<=0) { lcd_clear_display(); - lcd_puts(0, 0, "No partition found"); + printf("No partition found"); + lcd_update(); while(button_get(true) != SYS_USB_CONNECTED) {}; } - lcd_puts(0, line++, "Loading firmware"); + printf("Loading firmware"); lcd_update(); i = load_firmware(); - snprintf(buf, 256, "Result: %d", i); - lcd_puts(0, line++, buf); + printf("Result: %d", i); lcd_update(); if(i == 0) start_firmware(); start_iriver_fw(); +#endif /* IAUDIO_X5 */ } /* These functions are present in the firmware library, but we reimplement |