summaryrefslogtreecommitdiffstats
path: root/bootloader/main-pp.c
diff options
context:
space:
mode:
authorBarry Wardell <rockbox@barrywardell.net>2007-03-17 19:07:20 +0000
committerBarry Wardell <rockbox@barrywardell.net>2007-03-17 19:07:20 +0000
commite293bbb4514ce877a3d449ecbc7a216a790f627a (patch)
tree6e9cceda48038e13ac517d534225bbeaeb46cdca /bootloader/main-pp.c
parent3d39c4de289ba8f2d84fd38026273f9c4fa9a36a (diff)
downloadrockbox-e293bbb4514ce877a3d449ecbc7a216a790f627a.tar.gz
rockbox-e293bbb4514ce877a3d449ecbc7a216a790f627a.tar.bz2
rockbox-e293bbb4514ce877a3d449ecbc7a216a790f627a.zip
If loading rockbox.mi4 fails, then drop back to trying rockbox.h10/rockbox.e200 instead. This will allow the new bootloader to be used with older rockbox builds.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12824 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'bootloader/main-pp.c')
-rw-r--r--bootloader/main-pp.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/bootloader/main-pp.c b/bootloader/main-pp.c
index 1ab6ebdd6f..e598a29fa0 100644
--- a/bootloader/main-pp.c
+++ b/bootloader/main-pp.c
@@ -125,9 +125,10 @@ unsigned char *loadbuffer = (unsigned char *)DRAM_START;
char version[] = APPSVERSION;
/* Locations and sizes in hidden partition on Sansa */
-#define PPMI_OFFSET 1024
-#define PPMI_SIZE 1
-#define MI4_HEADER_SIZE 1
+#define PPMI_SECTOR_OFFSET 1024
+#define PPMI_SECTORS 1
+#define MI4_HEADER_SECTORS 1
+#define MI4_HEADER_SIZE 0x200
/* mi4 header structure */
struct mi4header_t {
@@ -170,10 +171,10 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size)
return EFILE_NOT_FOUND;
}
- read(fd, &mi4header, 0x200);
+ read(fd, &mi4header, MI4_HEADER_SIZE);
/* We don't support encrypted mi4 files yet */
- if( (mi4header.plaintext + 0x200) != mi4header.mi4size)
+ if( (mi4header.plaintext + MI4_HEADER_SIZE) != mi4header.mi4size)
return EINVALID_FORMAT;
/* MI4 file size */
@@ -192,13 +193,13 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size)
printf("Binary type: %4s", mi4header.type);
/* Load firmware */
- lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET);
- rc = read(fd, buf, mi4header.mi4size-0x200);
- if(rc < (int)mi4header.mi4size-0x200)
+ lseek(fd, MI4_HEADER_SIZE, SEEK_SET);
+ rc = read(fd, buf, mi4header.mi4size-MI4_HEADER_SIZE);
+ if(rc < (int)mi4header.mi4size-MI4_HEADER_SIZE)
return EREAD_IMAGE_FAILED;
/* Check CRC32 to see if we have a valid file */
- sum = chksum_crc32 (buf,mi4header.mi4size-0x200);
+ sum = chksum_crc32 (buf,mi4header.mi4size-MI4_HEADER_SIZE);
printf("Calculated CRC32: %x", sum);
@@ -217,7 +218,8 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, unsigned int buffe
unsigned long sum;
/* Read header to find out how long the mi4 file is. */
- ata_read_sectors(pinfo->start + PPMI_OFFSET, PPMI_SIZE, &ppmi_header);
+ ata_read_sectors(pinfo->start + PPMI_SECTOR_OFFSET,
+ PPMI_SECTORS, &ppmi_header);
/* The first four characters at 0x80000 (sector 1024) should be PPMI*/
if( memcmp(ppmi_header.magic, "PPMI", 4) )
@@ -226,11 +228,11 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, unsigned int buffe
printf("BL mi4 size: %x", ppmi_header.length);
/* Read mi4 header of the OF */
- ata_read_sectors(pinfo->start + PPMI_OFFSET + PPMI_SIZE
- + (ppmi_header.length/512), MI4_HEADER_SIZE, &mi4header);
+ ata_read_sectors(pinfo->start + PPMI_SECTOR_OFFSET + PPMI_SECTORS
+ + (ppmi_header.length/512), MI4_HEADER_SECTORS, &mi4header);
/* We don't support encrypted mi4 files yet */
- if( (mi4header.plaintext + 0x200) != mi4header.mi4size)
+ if( (mi4header.plaintext + MI4_HEADER_SIZE) != mi4header.mi4size)
return EINVALID_FORMAT;
/* MI4 file size */
@@ -249,12 +251,12 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, unsigned int buffe
printf("Binary type: %4s", mi4header.type);
/* Load firmware */
- ata_read_sectors(pinfo->start + PPMI_OFFSET + PPMI_SIZE
- + (ppmi_header.length/512) + MI4_HEADER_SIZE,
- (mi4header.length-0x200)/512, buf);
+ ata_read_sectors(pinfo->start + PPMI_SECTOR_OFFSET + PPMI_SECTORS
+ + (ppmi_header.length/512) + MI4_HEADER_SECTORS,
+ (mi4header.length-MI4_HEADER_SIZE)/512, buf);
/* Check CRC32 to see if we have a valid file */
- sum = chksum_crc32 (buf,mi4header.mi4size-0x200);
+ sum = chksum_crc32 (buf,mi4header.mi4size-MI4_HEADER_SIZE);
printf("Calculated CRC32: %x", sum);
@@ -383,7 +385,14 @@ void* main(void)
rc=load_mi4(loadbuffer, BOOTFILE, MAX_LOADSIZE);
if (rc < EOK) {
printf("Can't load %s:", BOOTFILE);
- error(EBOOTFILE, rc);
+ printf(strerror(rc));
+
+ /* Try loading rockbox from old rockbox.e200/rockbox.h10 format */
+ rc=load_firmware(loadbuffer, OLD_BOOTFILE, MAX_LOADSIZE);
+ if (rc < EOK) {
+ printf("Can't load %s:", OLD_BOOTFILE);
+ printf(strerror(rc));
+ }
}
}