diff options
Diffstat (limited to 'bootloader/main-pp.c')
-rw-r--r-- | bootloader/main-pp.c | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/bootloader/main-pp.c b/bootloader/main-pp.c index 0fa276708c..462a82e6b7 100644 --- a/bootloader/main-pp.c +++ b/bootloader/main-pp.c | |||
@@ -33,7 +33,7 @@ | |||
33 | #include "disk.h" | 33 | #include "disk.h" |
34 | #include "crc32-mi4.h" | 34 | #include "crc32-mi4.h" |
35 | #include <string.h> | 35 | #include <string.h> |
36 | #ifdef SANSA_E200 | 36 | #if defined(SANSA_E200) || defined(SANSA_C200) |
37 | #include "usb.h" | 37 | #include "usb.h" |
38 | #include "arcotg_udc.h" | 38 | #include "arcotg_udc.h" |
39 | #endif | 39 | #endif |
@@ -46,6 +46,9 @@ | |||
46 | #elif CONFIG_KEYPAD == SANSA_E200_PAD | 46 | #elif CONFIG_KEYPAD == SANSA_E200_PAD |
47 | #define BOOTLOADER_BOOT_OF BUTTON_LEFT | 47 | #define BOOTLOADER_BOOT_OF BUTTON_LEFT |
48 | 48 | ||
49 | #elif CONFIG_KEYPAD == SANSA_C200_PAD | ||
50 | #define BOOTLOADER_BOOT_OF BUTTON_LEFT | ||
51 | |||
49 | #endif | 52 | #endif |
50 | 53 | ||
51 | /* Maximum allowed firmware image size. 10MB is more than enough */ | 54 | /* Maximum allowed firmware image size. 10MB is more than enough */ |
@@ -58,7 +61,7 @@ unsigned char *loadbuffer = (unsigned char *)DRAM_START; | |||
58 | char version[] = APPSVERSION; | 61 | char version[] = APPSVERSION; |
59 | 62 | ||
60 | /* Locations and sizes in hidden partition on Sansa */ | 63 | /* Locations and sizes in hidden partition on Sansa */ |
61 | #ifdef SANSA_E200 | 64 | #if defined(SANSA_E200) || defined(SANSA_C200) |
62 | #define PPMI_SECTOR_OFFSET 1024 | 65 | #define PPMI_SECTOR_OFFSET 1024 |
63 | #define PPMI_SECTORS 1 | 66 | #define PPMI_SECTORS 1 |
64 | #define MI4_HEADER_SECTORS 1 | 67 | #define MI4_HEADER_SECTORS 1 |
@@ -335,6 +338,7 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size) | |||
335 | return EOK; | 338 | return EOK; |
336 | } | 339 | } |
337 | 340 | ||
341 | #if defined(SANSA_E200) || defined(SANSA_C200) | ||
338 | #ifdef SANSA_E200 | 342 | #ifdef SANSA_E200 |
339 | struct OFDB_info { | 343 | struct OFDB_info { |
340 | char *version; | 344 | char *version; |
@@ -346,6 +350,17 @@ struct OFDB_info { | |||
346 | { "PP5022AF-05.51-S301-00.12-S301.00.12E-D", 39, 0x3c5c, 0x2 }, | 350 | { "PP5022AF-05.51-S301-00.12-S301.00.12E-D", 39, 0x3c5c, 0x2 }, |
347 | { "PP5022AF-05.51-S301-00.12-S301.00.12A-D", 39, 0x3c08, 0xe1 }, | 351 | { "PP5022AF-05.51-S301-00.12-S301.00.12A-D", 39, 0x3c08, 0xe1 }, |
348 | }; | 352 | }; |
353 | #else /* SANSA_C200 */ | ||
354 | /* TODO: need to determine these for the c200 */ | ||
355 | struct OFDB_info { | ||
356 | char *version; | ||
357 | int version_length; | ||
358 | int sector; | ||
359 | int offset; | ||
360 | } OFDatabaseOffsets[] = { | ||
361 | { "PP5022AF-05.51-S301-01.11-S301.01.11A-D", 39, 0x3c08, 0xe1 }, | ||
362 | }; | ||
363 | #endif | ||
349 | 364 | ||
350 | /* Load mi4 firmware from a hidden disk partition */ | 365 | /* Load mi4 firmware from a hidden disk partition */ |
351 | int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, | 366 | int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, |
@@ -432,18 +447,17 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, | |||
432 | 447 | ||
433 | void* main(void) | 448 | void* main(void) |
434 | { | 449 | { |
435 | #ifndef SANSA_E200 | ||
436 | char buf[256]; | ||
437 | unsigned short* identify_info; | ||
438 | #endif | ||
439 | int i; | 450 | int i; |
440 | int btn; | 451 | int btn; |
441 | int rc; | 452 | int rc; |
442 | int num_partitions; | 453 | int num_partitions; |
443 | struct partinfo* pinfo; | 454 | struct partinfo* pinfo; |
444 | #ifdef SANSA_E200 | 455 | #if defined(SANSA_E200) || defined(SANSA_C200) |
445 | int usb_retry = 0; | 456 | int usb_retry = 0; |
446 | bool usb = false; | 457 | bool usb = false; |
458 | #else | ||
459 | char buf[256]; | ||
460 | unsigned short* identify_info; | ||
447 | #endif | 461 | #endif |
448 | 462 | ||
449 | chksum_crc32gentab (); | 463 | chksum_crc32gentab (); |
@@ -459,7 +473,7 @@ void* main(void) | |||
459 | lcd_clear_display(); | 473 | lcd_clear_display(); |
460 | 474 | ||
461 | btn = button_read_device(); | 475 | btn = button_read_device(); |
462 | #ifdef SANSA_E200 | 476 | #if defined(SANSA_E200) || defined(SANSA_C200) |
463 | usb_init(); | 477 | usb_init(); |
464 | while ((UDC_OTGSC&0x800) && usb_retry < 5 && !usb) | 478 | while ((UDC_OTGSC&0x800) && usb_retry < 5 && !usb) |
465 | { | 479 | { |
@@ -481,7 +495,7 @@ void* main(void) | |||
481 | printf(MODEL_NAME); | 495 | printf(MODEL_NAME); |
482 | 496 | ||
483 | i=ata_init(); | 497 | i=ata_init(); |
484 | #ifndef SANSA_E200 | 498 | #if !defined(SANSA_E200) && !defined(SANSA_C200) |
485 | if (i==0) { | 499 | if (i==0) { |
486 | identify_info=ata_get_identify(); | 500 | identify_info=ata_get_identify(); |
487 | /* Show model */ | 501 | /* Show model */ |
@@ -525,7 +539,7 @@ void* main(void) | |||
525 | */ | 539 | */ |
526 | printf("Loading original firmware..."); | 540 | printf("Loading original firmware..."); |
527 | 541 | ||
528 | #ifdef SANSA_E200 | 542 | #if defined(SANSA_E200) || defined(SANSA_C200) |
529 | /* First try a (hidden) firmware partition */ | 543 | /* First try a (hidden) firmware partition */ |
530 | printf("Trying firmware partition"); | 544 | printf("Trying firmware partition"); |
531 | pinfo = disk_partinfo(1); | 545 | pinfo = disk_partinfo(1); |
@@ -576,7 +590,7 @@ void* main(void) | |||
576 | { | 590 | { |
577 | printf("dumping sector %d", i); | 591 | printf("dumping sector %d", i); |
578 | } | 592 | } |
579 | ata_read_sectors(pinfo->start + i,1 , sector); | 593 | ata_read_sectors(0, pinfo->start + i, 1, sector); |
580 | write(fd,sector,512); | 594 | write(fd,sector,512); |
581 | } | 595 | } |
582 | close(fd); | 596 | close(fd); |
@@ -588,19 +602,21 @@ void* main(void) | |||
588 | printf("Can't load %s:", BOOTFILE); | 602 | printf("Can't load %s:", BOOTFILE); |
589 | printf(strerror(rc)); | 603 | printf(strerror(rc)); |
590 | 604 | ||
605 | #ifdef OLD_BOOTFILE | ||
591 | /* Try loading rockbox from old rockbox.e200/rockbox.h10 format */ | 606 | /* Try loading rockbox from old rockbox.e200/rockbox.h10 format */ |
592 | rc=load_firmware(loadbuffer, OLD_BOOTFILE, MAX_LOADSIZE); | 607 | rc=load_firmware(loadbuffer, OLD_BOOTFILE, MAX_LOADSIZE); |
593 | if (rc < EOK) { | 608 | if (rc < EOK) { |
594 | printf("Can't load %s:", OLD_BOOTFILE); | 609 | printf("Can't load %s:", OLD_BOOTFILE); |
595 | error(EBOOTFILE, rc); | 610 | error(EBOOTFILE, rc); |
596 | } | 611 | } |
612 | #endif | ||
597 | } | 613 | } |
598 | } | 614 | } |
599 | 615 | ||
600 | return (void*)loadbuffer; | 616 | return (void*)loadbuffer; |
601 | } | 617 | } |
602 | 618 | ||
603 | #ifndef SANSA_E200 | 619 | #if !defined(SANSA_E200) && !defined(SANSA_C200) |
604 | /* These functions are present in the firmware library, but we reimplement | 620 | /* These functions are present in the firmware library, but we reimplement |
605 | them here because the originals do a lot more than we want */ | 621 | them here because the originals do a lot more than we want */ |
606 | void usb_acknowledge(void) | 622 | void usb_acknowledge(void) |