summaryrefslogtreecommitdiff
path: root/bootloader/main-pp.c
diff options
context:
space:
mode:
Diffstat (limited to 'bootloader/main-pp.c')
-rw-r--r--bootloader/main-pp.c56
1 files changed, 9 insertions, 47 deletions
diff --git a/bootloader/main-pp.c b/bootloader/main-pp.c
index b0add13fb4..0262384d91 100644
--- a/bootloader/main-pp.c
+++ b/bootloader/main-pp.c
@@ -344,32 +344,6 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size)
344} 344}
345 345
346#if defined(SANSA_E200) || defined(SANSA_C200) 346#if defined(SANSA_E200) || defined(SANSA_C200)
347#ifdef SANSA_E200
348struct OFDB_info {
349 char *version;
350 int version_length;
351 int sector;
352 int offset;
353} OFDatabaseOffsets[] = {
354 { "PP5022AF-05.51-S301-01.11-S301.01.11A-D", 39, 0x3c08, 0xe1 },
355 { "PP5022AF-05.51-S301-00.12-S301.00.12E-D", 39, 0x3c5c, 0x2 },
356 { "PP5022AF-05.51-S301-00.12-S301.00.12A-D", 39, 0x3c08, 0xe1 },
357 { "PP5022AF-05.51-S301-02.15-S301.02.15E-D", 39, 0x3c08, 0xe1 },
358 { "PP5022AF-05.51-S301-02.18-S301.02.18A-D", 39, 0x3c08, 0xe1 },
359 { "PP5022AF-05.51-S301-02.18-S301.02.18E-D", 39, 0x3c08, 0xe1 }
360};
361#else /* SANSA_C200 */
362/* TODO: need to determine these for the c200 */
363struct OFDB_info {
364 char *version;
365 int version_length;
366 int sector;
367 int offset;
368} OFDatabaseOffsets[] = {
369 { "PP5022AF-05.51-S301-01.11-S301.01.11A-D", 39, 0x3c08, 0xe1 },
370};
371#endif
372
373/* Load mi4 firmware from a hidden disk partition */ 347/* Load mi4 firmware from a hidden disk partition */
374int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, 348int load_mi4_part(unsigned char* buf, struct partinfo* pinfo,
375 unsigned int buffer_size, bool disable_rebuild) 349 unsigned int buffer_size, bool disable_rebuild)
@@ -424,31 +398,19 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo,
424 if(sum != mi4header.crc32) 398 if(sum != mi4header.crc32)
425 return EBAD_CHKSUM; 399 return EBAD_CHKSUM;
426 400
401#ifdef SANSA_E200
427 if (disable_rebuild) 402 if (disable_rebuild)
428 { 403 {
429 char block[512]; 404 char block[512];
430 int sector = 0, offset = 0; 405
431 unsigned int i; 406 printf("Disabling database rebuild");
432 /* check which known version we have */ 407
433 /* These are taken from the PPPS section, 0x00780240 */ 408 ata_read_sectors(IF_MV2(0,) pinfo->start + 0x3c08, 1, block);
434 ata_read_sectors(IF_MV2(0,) pinfo->start + 0x3C01, 1, block); 409 block[0xe1] = 0;
435 for (i=0; i<sizeof(OFDatabaseOffsets)/sizeof(*OFDatabaseOffsets); i++) 410 ata_write_sectors(IF_MV2(0,) pinfo->start + 0x3c08, 1, block);
436 {
437 if (!memcmp(&block[0x40], OFDatabaseOffsets[i].version,
438 OFDatabaseOffsets[i].version_length))
439 {
440 sector = pinfo->start + OFDatabaseOffsets[i].sector;
441 offset = OFDatabaseOffsets[i].offset;
442 break;
443 }
444 }
445 if (sector && offset)
446 {
447 ata_read_sectors(IF_MV2(0,) sector, 1, block);
448 block[offset] = 0;
449 ata_write_sectors(IF_MV2(0,) sector, 1, block);
450 }
451 } 411 }
412#endif
413
452 return EOK; 414 return EOK;
453} 415}
454#endif 416#endif