summaryrefslogtreecommitdiff
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.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;
125char version[] = APPSVERSION; 125char version[] = APPSVERSION;
126 126
127/* Locations and sizes in hidden partition on Sansa */ 127/* Locations and sizes in hidden partition on Sansa */
128#define PPMI_OFFSET 1024 128#define PPMI_SECTOR_OFFSET 1024
129#define PPMI_SIZE 1 129#define PPMI_SECTORS 1
130#define MI4_HEADER_SIZE 1 130#define MI4_HEADER_SECTORS 1
131#define MI4_HEADER_SIZE 0x200
131 132
132/* mi4 header structure */ 133/* mi4 header structure */
133struct mi4header_t { 134struct mi4header_t {
@@ -170,10 +171,10 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size)
170 return EFILE_NOT_FOUND; 171 return EFILE_NOT_FOUND;
171 } 172 }
172 173
173 read(fd, &mi4header, 0x200); 174 read(fd, &mi4header, MI4_HEADER_SIZE);
174 175
175 /* We don't support encrypted mi4 files yet */ 176 /* We don't support encrypted mi4 files yet */
176 if( (mi4header.plaintext + 0x200) != mi4header.mi4size) 177 if( (mi4header.plaintext + MI4_HEADER_SIZE) != mi4header.mi4size)
177 return EINVALID_FORMAT; 178 return EINVALID_FORMAT;
178 179
179 /* MI4 file size */ 180 /* MI4 file size */
@@ -192,13 +193,13 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size)
192 printf("Binary type: %4s", mi4header.type); 193 printf("Binary type: %4s", mi4header.type);
193 194
194 /* Load firmware */ 195 /* Load firmware */
195 lseek(fd, FIRMWARE_OFFSET_FILE_DATA, SEEK_SET); 196 lseek(fd, MI4_HEADER_SIZE, SEEK_SET);
196 rc = read(fd, buf, mi4header.mi4size-0x200); 197 rc = read(fd, buf, mi4header.mi4size-MI4_HEADER_SIZE);
197 if(rc < (int)mi4header.mi4size-0x200) 198 if(rc < (int)mi4header.mi4size-MI4_HEADER_SIZE)
198 return EREAD_IMAGE_FAILED; 199 return EREAD_IMAGE_FAILED;
199 200
200 /* Check CRC32 to see if we have a valid file */ 201 /* Check CRC32 to see if we have a valid file */
201 sum = chksum_crc32 (buf,mi4header.mi4size-0x200); 202 sum = chksum_crc32 (buf,mi4header.mi4size-MI4_HEADER_SIZE);
202 203
203 printf("Calculated CRC32: %x", sum); 204 printf("Calculated CRC32: %x", sum);
204 205
@@ -217,7 +218,8 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, unsigned int buffe
217 unsigned long sum; 218 unsigned long sum;
218 219
219 /* Read header to find out how long the mi4 file is. */ 220 /* Read header to find out how long the mi4 file is. */
220 ata_read_sectors(pinfo->start + PPMI_OFFSET, PPMI_SIZE, &ppmi_header); 221 ata_read_sectors(pinfo->start + PPMI_SECTOR_OFFSET,
222 PPMI_SECTORS, &ppmi_header);
221 223
222 /* The first four characters at 0x80000 (sector 1024) should be PPMI*/ 224 /* The first four characters at 0x80000 (sector 1024) should be PPMI*/
223 if( memcmp(ppmi_header.magic, "PPMI", 4) ) 225 if( memcmp(ppmi_header.magic, "PPMI", 4) )
@@ -226,11 +228,11 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, unsigned int buffe
226 printf("BL mi4 size: %x", ppmi_header.length); 228 printf("BL mi4 size: %x", ppmi_header.length);
227 229
228 /* Read mi4 header of the OF */ 230 /* Read mi4 header of the OF */
229 ata_read_sectors(pinfo->start + PPMI_OFFSET + PPMI_SIZE 231 ata_read_sectors(pinfo->start + PPMI_SECTOR_OFFSET + PPMI_SECTORS
230 + (ppmi_header.length/512), MI4_HEADER_SIZE, &mi4header); 232 + (ppmi_header.length/512), MI4_HEADER_SECTORS, &mi4header);
231 233
232 /* We don't support encrypted mi4 files yet */ 234 /* We don't support encrypted mi4 files yet */
233 if( (mi4header.plaintext + 0x200) != mi4header.mi4size) 235 if( (mi4header.plaintext + MI4_HEADER_SIZE) != mi4header.mi4size)
234 return EINVALID_FORMAT; 236 return EINVALID_FORMAT;
235 237
236 /* MI4 file size */ 238 /* MI4 file size */
@@ -249,12 +251,12 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, unsigned int buffe
249 printf("Binary type: %4s", mi4header.type); 251 printf("Binary type: %4s", mi4header.type);
250 252
251 /* Load firmware */ 253 /* Load firmware */
252 ata_read_sectors(pinfo->start + PPMI_OFFSET + PPMI_SIZE 254 ata_read_sectors(pinfo->start + PPMI_SECTOR_OFFSET + PPMI_SECTORS
253 + (ppmi_header.length/512) + MI4_HEADER_SIZE, 255 + (ppmi_header.length/512) + MI4_HEADER_SECTORS,
254 (mi4header.length-0x200)/512, buf); 256 (mi4header.length-MI4_HEADER_SIZE)/512, buf);
255 257
256 /* Check CRC32 to see if we have a valid file */ 258 /* Check CRC32 to see if we have a valid file */
257 sum = chksum_crc32 (buf,mi4header.mi4size-0x200); 259 sum = chksum_crc32 (buf,mi4header.mi4size-MI4_HEADER_SIZE);
258 260
259 printf("Calculated CRC32: %x", sum); 261 printf("Calculated CRC32: %x", sum);
260 262
@@ -383,7 +385,14 @@ void* main(void)
383 rc=load_mi4(loadbuffer, BOOTFILE, MAX_LOADSIZE); 385 rc=load_mi4(loadbuffer, BOOTFILE, MAX_LOADSIZE);
384 if (rc < EOK) { 386 if (rc < EOK) {
385 printf("Can't load %s:", BOOTFILE); 387 printf("Can't load %s:", BOOTFILE);
386 error(EBOOTFILE, rc); 388 printf(strerror(rc));
389
390 /* Try loading rockbox from old rockbox.e200/rockbox.h10 format */
391 rc=load_firmware(loadbuffer, OLD_BOOTFILE, MAX_LOADSIZE);
392 if (rc < EOK) {
393 printf("Can't load %s:", OLD_BOOTFILE);
394 printf(strerror(rc));
395 }
387 } 396 }
388 } 397 }
389 398