mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 02:27:39 -04:00
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:
parent
dc0f497a4f
commit
82a1f8e514
1 changed files with 72 additions and 10 deletions
|
@ -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(§or[HACK_OFFSET], knownBytes,
|
!memcmp(§or[HACK_OFFSET], knownBytes,
|
||||||
sizeof(knownBytes)/sizeof(*knownBytes)))
|
sizeof(knownBytes)/sizeof(*knownBytes)))
|
||||||
{
|
{
|
||||||
|
/* E200R bootloader detected - patch it */
|
||||||
memcpy(§or[HACK_OFFSET], changedBytes,
|
memcpy(§or[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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue