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.c40
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;
58char version[] = APPSVERSION; 61char 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
339struct OFDB_info { 343struct 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 */
355struct 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 */
351int load_mi4_part(unsigned char* buf, struct partinfo* pinfo, 366int 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
433void* main(void) 448void* 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 */
606void usb_acknowledge(void) 622void usb_acknowledge(void)