mkamsboot: restructure model / firmware file information.

Merge the various arrays holding model specific information into a
structure and give it a distinct name. Avoids problems when linking with
Rockbox Utility.

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29177 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Dominik Riebeling 2011-01-31 20:15:50 +00:00
parent 6f2bba961f
commit 02dce4500d
3 changed files with 46 additions and 103 deletions

View file

@ -104,7 +104,8 @@ int main(int argc, char* argv[])
fprintf(stderr, "[INFO] Original firmware MD5 checksum match\n"); fprintf(stderr, "[INFO] Original firmware MD5 checksum match\n");
fprintf(stderr, "[INFO] Model: Sansa %s v%d - Firmware version: %s\n", fprintf(stderr, "[INFO] Model: Sansa %s v%d - Firmware version: %s\n",
model_names[sum.model], hw_revisions[sum.model], sum.version); ams_identity[sum.model].model_name,
ams_identity[sum.model].hw_revision, sum.version);
printf("[INFO] Firmware patching has begun !\n\n"); printf("[INFO] Firmware patching has begun !\n\n");
@ -118,7 +119,7 @@ int main(int argc, char* argv[])
fprintf(stderr, "[INFO] Packed bootloader size: %8d bytes\n", fprintf(stderr, "[INFO] Packed bootloader size: %8d bytes\n",
rb_packedsize); rb_packedsize);
fprintf(stderr, "[INFO] Dual-boot function size: %8d bytes\n", fprintf(stderr, "[INFO] Dual-boot function size: %8d bytes\n",
bootloader_sizes[sum.model]); ams_identity[sum.model].bootloader_size);
fprintf(stderr, "[INFO] UCL unpack function size: %8u bytes\n", fprintf(stderr, "[INFO] UCL unpack function size: %8u bytes\n",
(unsigned int)sizeof(nrv2e_d8)); (unsigned int)sizeof(nrv2e_d8));
fprintf(stderr, "[INFO] Original firmware version: %8u bytes\n", fprintf(stderr, "[INFO] Original firmware version: %8u bytes\n",
@ -137,8 +138,9 @@ int main(int argc, char* argv[])
return 1; return 1;
} }
patch_firmware(sum.model, fw_revisions[sum.model], firmware_size, buf, len, patch_firmware(sum.model, ams_identity[sum.model].fw_revision,
of_packed, of_packedsize, rb_packed, rb_packedsize); firmware_size, buf, len, of_packed, of_packedsize, rb_packed,
rb_packedsize);
/* Write the new firmware */ /* Write the new firmware */
fdout = open(outfile, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0666); fdout = open(outfile, O_CREAT|O_TRUNC|O_WRONLY|O_BINARY, 0666);

View file

@ -111,91 +111,19 @@ execution to the uncompressed firmware.
#define O_BINARY 0 #define O_BINARY 0
#endif #endif
/* 4 for m200, 2 for e200/c200, 1 or 2 for fuze/clip, 1 for clip+ */ /* fw_revision: version 2 is used in Clipv2, Clip+ and Fuzev2 firmwares */
const unsigned short hw_revisions[] = { /* hw_revision: 4 for m200, 2 for e200/c200, 1 or 2 for fuze/clip, 1 for clip+ */
[MODEL_FUZE] = 1, const struct ams_models ams_identity[] = {
[MODEL_CLIP] = 1, [MODEL_C200V2] = { 2, 1, "c200", dualboot_c200v2, sizeof(dualboot_c200v2), "c2v2", 44 },
[MODEL_CLIPV2] = 2, [MODEL_CLIPPLUS]= { 1, 2, "Clip+", dualboot_clipplus, sizeof(dualboot_clipplus), "cli+", 66 },
[MODEL_E200V2] = 2, [MODEL_CLIPV2] = { 2, 2, "Clip", dualboot_clipv2, sizeof(dualboot_clipv2), "clv2", 60 },
[MODEL_M200V4] = 4, [MODEL_CLIP] = { 1, 1, "Clip", dualboot_clip, sizeof(dualboot_clip), "clip", 40 },
[MODEL_C200V2] = 2, [MODEL_E200V2] = { 2, 1, "e200", dualboot_e200v2, sizeof(dualboot_e200v2), "e2v2", 41 },
[MODEL_CLIPPLUS]= 1, [MODEL_FUZEV2] = { 2, 2, "Fuze", dualboot_fuzev2, sizeof(dualboot_fuzev2), "fuz2", 68 },
[MODEL_FUZEV2] = 2, [MODEL_FUZE] = { 1, 1, "Fuze", dualboot_fuze, sizeof(dualboot_fuze), "fuze", 43 },
[MODEL_M200V4] = { 4, 1, "m200", dualboot_m200v4, sizeof(dualboot_m200v4), "m2v4", 42 },
}; };
/* version 2 is used in Clipv2, Clip+ and Fuzev2 firmwares */
const unsigned short fw_revisions[] = {
[MODEL_FUZE] = 1,
[MODEL_CLIP] = 1,
[MODEL_CLIPV2] = 2,
[MODEL_E200V2] = 1,
[MODEL_M200V4] = 1,
[MODEL_C200V2] = 1,
[MODEL_CLIPPLUS]= 2,
[MODEL_FUZEV2] = 2,
};
/* Descriptive name of these models */
const char* model_names[] = {
[MODEL_FUZE] = "Fuze",
[MODEL_CLIP] = "Clip",
[MODEL_CLIPV2] = "Clip",
[MODEL_CLIPPLUS]= "Clip+",
[MODEL_E200V2] = "e200",
[MODEL_M200V4] = "m200",
[MODEL_C200V2] = "c200",
[MODEL_FUZEV2] = "Fuze",
};
/* Dualboot functions for these models */
static const unsigned char* bootloaders[] = {
[MODEL_FUZE] = dualboot_fuze,
[MODEL_CLIP] = dualboot_clip,
[MODEL_CLIPV2] = dualboot_clipv2,
[MODEL_E200V2] = dualboot_e200v2,
[MODEL_M200V4] = dualboot_m200v4,
[MODEL_C200V2] = dualboot_c200v2,
[MODEL_CLIPPLUS]= dualboot_clipplus,
[MODEL_FUZEV2] = dualboot_fuzev2,
};
/* Size of dualboot functions for these models */
const int bootloader_sizes[] = {
[MODEL_FUZE] = sizeof(dualboot_fuze),
[MODEL_CLIP] = sizeof(dualboot_clip),
[MODEL_CLIPV2] = sizeof(dualboot_clipv2),
[MODEL_E200V2] = sizeof(dualboot_e200v2),
[MODEL_M200V4] = sizeof(dualboot_m200v4),
[MODEL_C200V2] = sizeof(dualboot_c200v2),
[MODEL_CLIPPLUS]= sizeof(dualboot_clipplus),
[MODEL_FUZEV2] = sizeof(dualboot_fuzev2),
};
/* Model names used in the Rockbox header in ".sansa" files - these match the
-add parameter to the "scramble" tool */
static const char* rb_model_names[] = {
[MODEL_FUZE] = "fuze",
[MODEL_CLIP] = "clip",
[MODEL_CLIPV2] = "clv2",
[MODEL_E200V2] = "e2v2",
[MODEL_M200V4] = "m2v4",
[MODEL_C200V2] = "c2v2",
[MODEL_CLIPPLUS]= "cli+",
[MODEL_FUZEV2] = "fuz2",
};
/* Model numbers used to initialise the checksum in the Rockbox header in
".sansa" files - these are the same as MODEL_NUMBER in config-target.h */
static const int rb_model_num[] = {
[MODEL_FUZE] = 43,
[MODEL_CLIP] = 40,
[MODEL_CLIPV2] = 60,
[MODEL_E200V2] = 41,
[MODEL_M200V4] = 42,
[MODEL_C200V2] = 44,
[MODEL_CLIPPLUS]= 66,
[MODEL_FUZEV2] = 68,
};
/* Checksums of unmodified original firmwares - for safety, and device /* Checksums of unmodified original firmwares - for safety, and device
detection */ detection */
@ -265,7 +193,7 @@ static unsigned int model_memory_size(int model)
int firmware_revision(int model) int firmware_revision(int model)
{ {
return fw_revisions[model]; return ams_identity[model].fw_revision;
} }
static off_t filesize(int fd) static off_t filesize(int fd)
@ -403,8 +331,8 @@ unsigned char* load_of_file(
*sum = sansasums[i]; *sum = sansasums[i];
if(sum->model != model) { if(sum->model != model) {
ERROR("[ERR] OF File provided is %sv%d version %s, not for %sv%d\n", ERROR("[ERR] OF File provided is %sv%d version %s, not for %sv%d\n",
model_names[sum->model], hw_revisions[sum->model], ams_identity[sum->model].model_name, ams_identity[sum->model].hw_revision,
sum->version, model_names[model], hw_revisions[model] sum->version, ams_identity[model].model_name, ams_identity[model].hw_revision
); );
} }
} else { } else {
@ -425,7 +353,7 @@ unsigned char* load_of_file(
ERROR("[ERR] Original firmware unknown, please try an other version." \ ERROR("[ERR] Original firmware unknown, please try an other version." \
" Tested %sv%d versions are : %s\n", " Tested %sv%d versions are : %s\n",
model_names[model], hw_revisions[model], tested_versions); ams_identity[model].model_name, ams_identity[model].hw_revision, tested_versions);
} }
/* TODO: Do some more sanity checks on the OF image. Some images (like /* TODO: Do some more sanity checks on the OF image. Some images (like
@ -435,13 +363,13 @@ unsigned char* load_of_file(
if (checksum != 0xefbeadde && checksum != calc_checksum(buf, last_word)) if (checksum != 0xefbeadde && checksum != calc_checksum(buf, last_word))
ERROR("%s", "[ERR] Whole file checksum failed\n"); ERROR("%s", "[ERR] Whole file checksum failed\n");
if (bootloaders[sum->model] == NULL) if (ams_identity[sum->model].bootloader == NULL)
ERROR("[ERR] Unsupported model - \"%s\"\n", model_names[sum->model]); ERROR("[ERR] Unsupported model - \"%s\"\n", ams_identity[sum->model].model_name);
/* Get the firmware size */ /* Get the firmware size */
if (fw_revisions[sum->model] == 1) if (ams_identity[sum->model].fw_revision == 1)
*firmware_size = get_uint32le(&buf[0x0c]); *firmware_size = get_uint32le(&buf[0x0c]);
else if (fw_revisions[sum->model] == 2) else if (ams_identity[sum->model].fw_revision == 2)
*firmware_size = get_uint32le(&buf[0x10]); *firmware_size = get_uint32le(&buf[0x10]);
/* Compress the original firmware image */ /* Compress the original firmware image */
@ -479,7 +407,7 @@ unsigned char* load_rockbox_file(
ERROR("[ERR] Could not read file %s\n", filename); ERROR("[ERR] Could not read file %s\n", filename);
for(*model = 0; *model < NUM_MODELS; (*model)++) for(*model = 0; *model < NUM_MODELS; (*model)++)
if (memcmp(rb_model_names[*model], header + 4, 4) == 0) if (memcmp(ams_identity[*model].rb_model_name, header + 4, 4) == 0)
break; break;
if(*model == NUM_MODELS) if(*model == NUM_MODELS)
@ -497,7 +425,7 @@ unsigned char* load_rockbox_file(
ERROR("[ERR] Could not read file %s\n", filename); ERROR("[ERR] Could not read file %s\n", filename);
/* Check checksum */ /* Check checksum */
sum = rb_model_num[*model]; sum = ams_identity[*model].rb_model_num;
for (i = 0; i < *bufsize; i++) { for (i = 0; i < *bufsize; i++) {
/* add 8 unsigned bits but keep a 32 bit sum */ /* add 8 unsigned bits but keep a 32 bit sum */
sum += buf[i]; sum += buf[i];
@ -536,7 +464,7 @@ void patch_firmware(
/* Insert dual-boot bootloader at offset 0x200, we preserve the OF /* Insert dual-boot bootloader at offset 0x200, we preserve the OF
* version string located between 0x0 and 0x200 */ * version string located between 0x0 and 0x200 */
memcpy(buf + 0x600, bootloaders[model], bootloader_sizes[model]); memcpy(buf + 0x600, ams_identity[model].bootloader, ams_identity[model].bootloader_size);
/* Insert vectors, they won't overwrite the OF version string */ /* Insert vectors, they won't overwrite the OF version string */
@ -614,7 +542,7 @@ int check_sizes(int model, int rb_packed_size, int rb_unpacked_size,
{ {
/* XXX: we keep the first 0x200 bytes block unmodified, we just replace /* XXX: we keep the first 0x200 bytes block unmodified, we just replace
* the ARM vectors */ * the ARM vectors */
unsigned int packed_size = bootloader_sizes[model] + sizeof(nrv2e_d8) + unsigned int packed_size = ams_identity[model].bootloader_size + sizeof(nrv2e_d8) +
of_packed_size + rb_packed_size + 0x200; of_packed_size + rb_packed_size + 0x200;
/* how much memory is available */ /* how much memory is available */

View file

@ -56,10 +56,23 @@ struct md5sums {
char *md5; char *md5;
}; };
extern const unsigned short hw_revisions[]; struct ams_models {
extern const unsigned short fw_revisions[]; unsigned short hw_revision;
extern const char* model_names[]; unsigned short fw_revision;
extern const int bootloader_sizes[]; /* Descriptive name of this model */
const char* model_name;
/* Dualboot functions for this model */
const unsigned char* bootloader;
/* Size of dualboot functions for this model */
int bootloader_size;
/* Model name used in the Rockbox header in ".sansa" files - these match the
-add parameter to the "scramble" tool */
const char* rb_model_name;
/* Model number used to initialise the checksum in the Rockbox header in
".sansa" files - these are the same as MODEL_NUMBER in config-target.h */
const int rb_model_num;
};
extern const struct ams_models ams_identity[];
/* load_rockbox_file() /* load_rockbox_file()
* *