diff options
author | Marcin Bukat <marcin.bukat@gmail.com> | 2012-03-04 15:34:29 +0100 |
---|---|---|
committer | Marcin Bukat <marcin.bukat@gmail.com> | 2013-06-27 13:50:11 +0200 |
commit | 0b29691324e5700f15ea653592bf29f8552d47d7 (patch) | |
tree | 00e4f77f28c813a493cd8af22170f486f6e82903 /firmware/rolo.c | |
parent | 46ea8bfe7c690c8db230fff3a582a69779f8e432 (diff) | |
download | rockbox-0b29691324e5700f15ea653592bf29f8552d47d7.tar.gz rockbox-0b29691324e5700f15ea653592bf29f8552d47d7.tar.bz2 rockbox-0b29691324e5700f15ea653592bf29f8552d47d7.zip |
Move load_firmware() to separate file
The idea is to share loading code between bootloaders and rolo().
Change-Id: I1656ed91946d7a05cb7c9fa7a16793c3c862a5cd
Reviewed-on: http://gerrit.rockbox.org/190
Reviewed-by: Marcin Bukat <marcin.bukat@gmail.com>
Diffstat (limited to 'firmware/rolo.c')
-rw-r--r-- | firmware/rolo.c | 138 |
1 files changed, 35 insertions, 103 deletions
diff --git a/firmware/rolo.c b/firmware/rolo.c index 567c880bd4..325e17e97f 100644 --- a/firmware/rolo.c +++ b/firmware/rolo.c @@ -37,16 +37,17 @@ #include "storage.h" #include "rolo.h" -#ifdef MI4_FORMAT +#include "loader_strerror.h" +#if defined(MI4_FORMAT) #include "crc32-mi4.h" -#undef FIRMWARE_OFFSET_FILE_CRC -#undef FIRMWARE_OFFSET_FILE_DATA -#define FIRMWARE_OFFSET_FILE_CRC 0xC -#define FIRMWARE_OFFSET_FILE_DATA 0x200 -#endif - -#ifdef RKW_FORMAT +#include "mi4-loader.h" +#define LOAD_FIRMWARE(a,b,c) load_mi4(a,b,c) +#elif defined(RKW_FORMAT) #include "rkw-loader.h" +#define LOAD_FIRMWARE(a,b,c) load_rkw(a,b,c) +#else +#include "rb-loader.h" +#define LOAD_FIRMWARE(a,b,c) load_firmware(a,b,c) #endif #if !defined(IRIVER_IFP7XX_SERIES) @@ -206,7 +207,7 @@ extern unsigned long loadaddress; * Filename must be a fully defined filename including the path and extension * ***************************************************************************/ -#ifdef RKW_FORMAT +#if defined(CPU_COLDFIRE) || defined(CPU_ARM) || defined(CPU_MIPS) int rolo_load(const char* filename) { unsigned char* ramstart = (void*)&loadaddress; @@ -232,15 +233,26 @@ int rolo_load(const char* filename) rolo_handle = core_alloc_maximum("rolo", &filebuf_size, NULL); filebuf = core_get_data(rolo_handle); - errno = load_rkw(filebuf, filename, filebuf_size); - if (errno < 0) + errno = LOAD_FIRMWARE(filebuf, filename, filebuf_size); + + if (errno <= 0) { - rolo_error(rkw_strerror(errno)); + rolo_error(loader_strerror(errno)); return -1; } else length = errno; +#if defined(CPU_PP) && NUM_CORES > 1 + lcd_puts(0, 2, "Waiting for coprocessor..."); + lcd_update(); + rolo_restart_cop(); + /* Wait for COP to be in safe code */ + while(cpu_reply != 1); + lcd_puts(0, 2, " "); + lcd_update(); +#endif + #ifdef HAVE_STORAGE_FLUSH lcd_puts(0, 1, "Flushing storage buffers"); lcd_update(); @@ -255,27 +267,29 @@ int rolo_load(const char* filename) #endif adc_close(); +#if CONFIG_CPU != IMX31L /* We're not finished yet */ +#ifdef CPU_ARM + /* Should do these together since some ARM version should never have + * FIQ disabled and not IRQ (imx31 errata). */ disable_interrupt(IRQ_FIQ_STATUS); +#else + /* Some targets have a higher disable level than HIGEST_IRQ_LEVEL */ + set_irq_level(DISABLE_INTERRUPTS); +#endif +#endif /* CONFIG_CPU == IMX31L */ rolo_restart(filebuf, ramstart, length); /* never reached */ return 0; } -#else +#else /* defined(CPU_SH) */ int rolo_load(const char* filename) { int fd; long length; -#if defined(CPU_COLDFIRE) || defined(CPU_ARM) || defined(CPU_MIPS) -#if !defined(MI4_FORMAT) - int i; -#endif - unsigned long checksum,file_checksum; -#else long file_length; unsigned short checksum,file_checksum; -#endif unsigned char* ramstart = (void*)&loadaddress; unsigned char* filebuf; size_t filebuf_size; @@ -306,87 +320,6 @@ int rolo_load(const char* filename) rolo_handle = core_alloc_maximum("rolo", &filebuf_size, NULL); filebuf = core_get_data(rolo_handle); -#if CONFIG_CPU != SH7034 - /* Read and save checksum */ - lseek(fd, FIRMWARE_OFFSET_FILE_CRC, SEEK_SET); - if (read(fd, &file_checksum, 4) != 4) { - rolo_error("Error Reading checksum"); - return -1; - } - -#if !defined(MI4_FORMAT) - /* Rockbox checksums are big-endian */ - file_checksum = betoh32(file_checksum); -#endif - -#if defined(CPU_PP) && NUM_CORES > 1 - lcd_puts(0, 2, "Waiting for coprocessor..."); - lcd_update(); - rolo_restart_cop(); - /* Wait for COP to be in safe code */ - while(cpu_reply != 1); - lcd_puts(0, 2, " "); - lcd_update(); -#endif - - lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET); - - /* this shouldn't happen, but well */ - if ((long)filebuf_size < length) - { - rolo_error("File too big"); - return -1; - } - - if (read(fd, filebuf, length) != length) { - rolo_error("Error Reading File"); - return -1; - } - -#ifdef MI4_FORMAT - /* Check CRC32 to see if we have a valid file */ - chksum_crc32gentab(); - checksum = chksum_crc32 (filebuf, length); -#else - checksum = MODEL_NUMBER; - - for(i = 0;i < length;i++) { - checksum += filebuf[i]; - } -#endif - - /* Verify checksum against file header */ - if (checksum != file_checksum) { - rolo_error("Checksum Error"); - return -1; - } - -#ifdef HAVE_STORAGE_FLUSH - lcd_puts(0, 1, "Flushing storage buffers"); - lcd_update(); - storage_flush(); -#endif - - lcd_puts(0, 1, "Executing"); - lcd_update(); -#ifdef HAVE_REMOTE_LCD - lcd_remote_puts(0, 1, "Executing"); - lcd_remote_update(); -#endif - adc_close(); - -#if CONFIG_CPU != IMX31L /* We're not finished yet */ -#ifdef CPU_ARM - /* Should do these together since some ARM version should never have - * FIQ disabled and not IRQ (imx31 errata). */ - disable_interrupt(IRQ_FIQ_STATUS); -#else - /* Some targets have a higher disable level than HIGEST_IRQ_LEVEL */ - set_irq_level(DISABLE_INTERRUPTS); -#endif -#endif /* CONFIG_CPU == IMX31L */ - -#else /* CONFIG_CPU == SH7034 */ /* Read file length from header and compare to real file length */ lseek(fd, FIRMWARE_OFFSET_FILE_LENGTH, SEEK_SET); if(read(fd, &file_length, 4) != 4) { @@ -451,13 +384,12 @@ int rolo_load(const char* filename) defined(ARCHOS_FMRECORDER) PAIOR = 0x0FA0; #endif -#endif rolo_restart(filebuf, ramstart, length); return 0; /* this is never reached */ (void)checksum; (void)file_checksum; } -#endif /* ifdef RKW_FORMAT */ +#endif /* */ #else /* !defined(IRIVER_IFP7XX_SERIES) */ int rolo_load(const char* filename) { |