1
0
Fork 0
forked from len0rd/rockbox

Add check for e200 bootloaders and also for an already-patched e200r bootloader, so we can display more useful messages to the user, instead of simply "Unknown Bootloader". Also a bit of code cleaning and whitespace insertion.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15543 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dave Chapman 2007-11-08 20:37:16 +00:00
parent dc0f497a4f
commit 82a1f8e514

View file

@ -19,6 +19,7 @@
* KIND, either express or implied. * KIND, either express or implied.
* *
****************************************************************************/ ****************************************************************************/
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "common.h" #include "common.h"
@ -43,9 +44,47 @@ char version[] = APPSVERSION;
#define START_SECTOR_OF_ROM 1 #define START_SECTOR_OF_ROM 1
#define ROMSECTOR_TO_HACK 63 #define ROMSECTOR_TO_HACK 63
#define HACK_OFFSET 498 #define HACK_OFFSET 498
#define KNOWN_CRC32 0x5a09c266 #define KNOWN_CRC32 0x5a09c266 /* E200R CRC before patching */
char knownBytes[] = {0x00, 0x24, 0x07, 0xe1}; #define PATCHED_CRC32 0x0a162b34 /* E200R CRC after patching */
char changedBytes[] = {0xc0, 0x46, 0xc0, 0x46 };
static unsigned char knownBytes[] = {0x00, 0x24, 0x07, 0xe1};
static unsigned char changedBytes[] = {0xc0, 0x46, 0xc0, 0x46 };
/*
CRC32s of sector 63 from E200 bootloaders - so we can tell users if they're
trying to use e200rpatcher with a vanilla e200.
These are all known E200 bootloaders as of 8 November 2007.
*/
static uint32_t e200_crcs[] =
{
0xbeceba58,
0x4e6b038f,
0x5e4f4219,
0xae087742,
0x3dd94852,
0x72fa69f3,
0x4ce0d10b
};
#define NUM_E200_CRCS ((int)((sizeof(e200_crcs) / sizeof(uint32_t))))
static bool is_e200(uint32_t crc)
{
int i;
for (i = 0 ; i < NUM_E200_CRCS ; i++)
{
if (crc == e200_crcs[i])
return true;
}
return false;
}
void* main(void) void* main(void)
{ {
int i; int i;
@ -54,6 +93,7 @@ void* main(void)
int crc32; int crc32;
char sector[512]; char sector[512];
struct partinfo* pinfo; struct partinfo* pinfo;
chksum_crc32gentab (); chksum_crc32gentab ();
system_init(); system_init();
@ -81,11 +121,14 @@ void* main(void)
i=ata_init(); i=ata_init();
disk_init(IF_MV(0)); disk_init(IF_MV(0));
num_partitions = disk_mount_all(); num_partitions = disk_mount_all();
if (num_partitions<=0) if (num_partitions<=0)
{ {
error(EDISK,num_partitions); error(EDISK,num_partitions);
} }
pinfo = disk_partinfo(1); pinfo = disk_partinfo(1);
#if 0 /* not needed in release builds */ #if 0 /* not needed in release builds */
printf("--- Partition info ---"); printf("--- Partition info ---");
printf("start: %x", pinfo->start); printf("start: %x", pinfo->start);
@ -93,26 +136,39 @@ void* main(void)
printf("type: %x", pinfo->type); printf("type: %x", pinfo->type);
printf("reading: %x", (START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK)*512); printf("reading: %x", (START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK)*512);
#endif #endif
ata_read_sectors(IF_MV2(0,) ata_read_sectors(IF_MV2(0,)
pinfo->start + START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK, pinfo->start + START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK,
1 , sector); 1 , sector);
crc32 = chksum_crc32 (sector, 512); crc32 = chksum_crc32 (sector, 512);
#if 0 /* not needed in release builds */ #if 0 /* not needed in release builds */
printf("--- Hack Status ---"); printf("--- Hack Status ---");
printf("Sector checksum: %x", crc32); printf("Sector checksum: %x", crc32);
#endif #endif
if ((crc32 == KNOWN_CRC32) &&
if (crc32 == PATCHED_CRC32)
{
/* Bootloader already patched */
printf("Firmware unlocked");
printf("Proceed to Step 2");
} else if ((crc32 == KNOWN_CRC32) &&
!memcmp(&sector[HACK_OFFSET], knownBytes, !memcmp(&sector[HACK_OFFSET], knownBytes,
sizeof(knownBytes)/sizeof(*knownBytes))) sizeof(knownBytes)/sizeof(*knownBytes)))
{ {
/* E200R bootloader detected - patch it */
memcpy(&sector[HACK_OFFSET], changedBytes, memcpy(&sector[HACK_OFFSET], changedBytes,
sizeof(changedBytes)/sizeof(*changedBytes)); sizeof(changedBytes)/sizeof(*changedBytes));
ata_write_sectors(IF_MV2(0,) ata_write_sectors(IF_MV2(0,)
pinfo->start + START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK, pinfo->start + START_SECTOR_OF_ROM + ROMSECTOR_TO_HACK,
1 , sector); 1 , sector);
printf("Firmware Unlocked"); printf("Already unlocked");
printf("Proceed to Step 2"); printf("Proceed to Step 2");
} else if (is_e200(crc32))
{
printf("Vanilla E200 detected!");
printf("Please install using");
printf("Sansapatcher");
} }
else else
{ {
@ -120,14 +176,20 @@ void* main(void)
printf("Rockbox installer cannot"); printf("Rockbox installer cannot");
printf("continue"); printf("continue");
} }
/* Turn button lights off */
GPIOG_OUTPUT_VAL &=~0x80; GPIOG_OUTPUT_VAL &=~0x80;
printf(""); printf("");
if (button_hold()) if (button_hold())
printf("Release Hold and"); printf("Release Hold and");
printf("Press any key to shutdown"); printf("Press any key to shutdown");
while(button_read_device() == BUTTON_NONE)
; while(button_read_device() == BUTTON_NONE);
power_off(); power_off();
return NULL; return NULL;
} }