diff options
Diffstat (limited to 'bootloader/main-pp.c')
-rw-r--r-- | bootloader/main-pp.c | 45 |
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; | |||
125 | char version[] = APPSVERSION; | 125 | char 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 */ |
133 | struct mi4header_t { | 134 | struct 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 | ||