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 0fa2767..462a82e 100644 --- a/bootloader/main-pp.c +++ b/bootloader/main-pp.c @@ -33,7 +33,7 @@ #include "disk.h" #include "crc32-mi4.h" #include <string.h> -#ifdef SANSA_E200 +#if defined(SANSA_E200) || defined(SANSA_C200) #include "usb.h" #include "arcotg_udc.h" #endif @@ -46,6 +46,9 @@ #elif CONFIG_KEYPAD == SANSA_E200_PAD #define BOOTLOADER_BOOT_OF BUTTON_LEFT +#elif CONFIG_KEYPAD == SANSA_C200_PAD +#define BOOTLOADER_BOOT_OF BUTTON_LEFT + #endif /* Maximum allowed firmware image size. 10MB is more than enough */ @@ -58,7 +61,7 @@ unsigned char *loadbuffer = (unsigned char *)DRAM_START; char version[] = APPSVERSION; /* Locations and sizes in hidden partition on Sansa */ -#ifdef SANSA_E200 +#if defined(SANSA_E200) || defined(SANSA_C200) #define PPMI_SECTOR_OFFSET 1024 #define PPMI_SECTORS 1 #define MI4_HEADER_SECTORS 1 @@ -335,6 +338,7 @@ int load_mi4(unsigned char* buf, char* firmware, unsigned int buffer_size) return EOK; } +#if defined(SANSA_E200) || defined(SANSA_C200) #ifdef SANSA_E200 struct OFDB_info { char *version; @@ -346,6 +350,17 @@ struct OFDB_info { { "PP5022AF-05.51-S301-00.12-S301.00.12E-D", 39, 0x3c5c, 0x2 }, { "PP5022AF-05.51-S301-00.12-S301.00.12A-D", 39, 0x3c08, 0xe1 }, }; +#else /* SANSA_C200 */ +/* TODO: need to determine these for the c200 */ +struct OFDB_info { + char *version; + int version_length; + int sector; + int offset; +} OFDatabaseOffsets[] = { + { "PP5022AF-05.51-S301-01.11-S301.01.11A-D", 39, 0x3c08, 0xe1 }, +}; +#endif /* Load mi4 firmware from a hidden disk partition */ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, @@ -432,18 +447,17 @@ int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, void* main(void) { -#ifndef SANSA_E200 - char buf[256]; - unsigned short* identify_info; -#endif int i; int btn; int rc; int num_partitions; struct partinfo* pinfo; -#ifdef SANSA_E200 +#if defined(SANSA_E200) || defined(SANSA_C200) int usb_retry = 0; bool usb = false; +#else + char buf[256]; + unsigned short* identify_info; #endif chksum_crc32gentab (); @@ -459,7 +473,7 @@ void* main(void) lcd_clear_display(); btn = button_read_device(); -#ifdef SANSA_E200 +#if defined(SANSA_E200) || defined(SANSA_C200) usb_init(); while ((UDC_OTGSC&0x800) && usb_retry < 5 && !usb) { @@ -481,7 +495,7 @@ void* main(void) printf(MODEL_NAME); i=ata_init(); -#ifndef SANSA_E200 +#if !defined(SANSA_E200) && !defined(SANSA_C200) if (i==0) { identify_info=ata_get_identify(); /* Show model */ @@ -525,7 +539,7 @@ void* main(void) */ printf("Loading original firmware..."); -#ifdef SANSA_E200 +#if defined(SANSA_E200) || defined(SANSA_C200) /* First try a (hidden) firmware partition */ printf("Trying firmware partition"); pinfo = disk_partinfo(1); @@ -576,7 +590,7 @@ void* main(void) { printf("dumping sector %d", i); } - ata_read_sectors(pinfo->start + i,1 , sector); + ata_read_sectors(0, pinfo->start + i, 1, sector); write(fd,sector,512); } close(fd); @@ -588,19 +602,21 @@ void* main(void) printf("Can't load %s:", BOOTFILE); printf(strerror(rc)); +#ifdef OLD_BOOTFILE /* 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); error(EBOOTFILE, rc); } +#endif } } return (void*)loadbuffer; } -#ifndef SANSA_E200 +#if !defined(SANSA_E200) && !defined(SANSA_C200) /* These functions are present in the firmware library, but we reimplement them here because the originals do a lot more than we want */ void usb_acknowledge(void) |