diff options
Diffstat (limited to 'rbutil/mkamsboot/mkamsboot.c')
-rw-r--r-- | rbutil/mkamsboot/mkamsboot.c | 63 |
1 files changed, 19 insertions, 44 deletions
diff --git a/rbutil/mkamsboot/mkamsboot.c b/rbutil/mkamsboot/mkamsboot.c index 1ec9ec26e6..f47afe312a 100644 --- a/rbutil/mkamsboot/mkamsboot.c +++ b/rbutil/mkamsboot/mkamsboot.c | |||
@@ -323,30 +323,6 @@ static uint32_t calc_checksum(unsigned char* buf, uint32_t n) | |||
323 | return sum; | 323 | return sum; |
324 | } | 324 | } |
325 | 325 | ||
326 | static int get_model(int model_id) | ||
327 | { | ||
328 | switch(model_id) { | ||
329 | case 0x1e: | ||
330 | return MODEL_FUZE; | ||
331 | case 0x22: | ||
332 | return MODEL_CLIP; | ||
333 | case 0x23: | ||
334 | return MODEL_C200V2; | ||
335 | case 0x24: | ||
336 | return MODEL_E200V2; | ||
337 | case 0x25: | ||
338 | return MODEL_M200V4; | ||
339 | case 0x27: | ||
340 | return MODEL_CLIPV2; | ||
341 | case 0x28: | ||
342 | return MODEL_CLIPPLUS; | ||
343 | case 0x70: | ||
344 | return MODEL_FUZEV2; | ||
345 | } | ||
346 | |||
347 | return MODEL_UNKNOWN; | ||
348 | } | ||
349 | |||
350 | /* Compress using nrv2e algorithm : Thumb decompressor fits in 168 bytes ! */ | 326 | /* Compress using nrv2e algorithm : Thumb decompressor fits in 168 bytes ! */ |
351 | static unsigned char* uclpack(unsigned char* inbuf, int insize, int* outsize) | 327 | static unsigned char* uclpack(unsigned char* inbuf, int insize, int* outsize) |
352 | { | 328 | { |
@@ -388,7 +364,7 @@ static unsigned char* uclpack(unsigned char* inbuf, int insize, int* outsize) | |||
388 | 364 | ||
389 | /* Loads a Sansa AMS Original Firmware file into memory */ | 365 | /* Loads a Sansa AMS Original Firmware file into memory */ |
390 | unsigned char* load_of_file( | 366 | unsigned char* load_of_file( |
391 | char* filename, off_t* bufsize, struct md5sums *sum, | 367 | char* filename, int model, off_t* bufsize, struct md5sums *sum, |
392 | int* firmware_size, unsigned char** of_packed, | 368 | int* firmware_size, unsigned char** of_packed, |
393 | int* of_packedsize, char* errstr, int errstrsize) | 369 | int* of_packedsize, char* errstr, int errstrsize) |
394 | { | 370 | { |
@@ -397,7 +373,6 @@ unsigned char* load_of_file( | |||
397 | off_t n; | 373 | off_t n; |
398 | unsigned int i=0; | 374 | unsigned int i=0; |
399 | uint32_t checksum; | 375 | uint32_t checksum; |
400 | int model_id; | ||
401 | unsigned int last_word; | 376 | unsigned int last_word; |
402 | 377 | ||
403 | fd = open(filename, O_RDONLY|O_BINARY); | 378 | fd = open(filename, O_RDONLY|O_BINARY); |
@@ -425,21 +400,20 @@ unsigned char* load_of_file( | |||
425 | 400 | ||
426 | if (i < NUM_MD5S) { | 401 | if (i < NUM_MD5S) { |
427 | *sum = sansasums[i]; | 402 | *sum = sansasums[i]; |
403 | if(sum->model != model) { | ||
404 | ERROR("[ERR] OF File provided is %sv%d version %s, not for %sv%d\n", | ||
405 | model_names[sum->model], hw_revisions[sum->model], | ||
406 | sum->version, model_names[model], hw_revisions[model] | ||
407 | ); | ||
408 | } | ||
428 | } else { | 409 | } else { |
429 | int fw_version = (get_uint32le(&buf[0x204]) == 0x0000f000) ? 2 : 1; | 410 | /* OF unknown, give a list of tested versions for the requested model */ |
430 | model_id = buf[(fw_version == 2) ? 0x219 : 0x215]; | ||
431 | sum->model = get_model(model_id); | ||
432 | |||
433 | if (sum->model == MODEL_UNKNOWN) | ||
434 | ERROR("[ERR] Unknown firmware model (v%d) - model id 0x%02x\n", | ||
435 | fw_version, model_id); | ||
436 | 411 | ||
437 | #if 1 /* comment to test new OFs */ | ||
438 | char tested_versions[100]; | 412 | char tested_versions[100]; |
439 | tested_versions[0] = '\0'; | 413 | tested_versions[0] = '\0'; |
440 | 414 | ||
441 | for (i = 0; i < NUM_MD5S ; i++) | 415 | for (i = 0; i < NUM_MD5S ; i++) |
442 | if (sansasums[i].model == sum->model) { | 416 | if (sansasums[i].model == model) { |
443 | if (tested_versions[0] != '\0') { | 417 | if (tested_versions[0] != '\0') { |
444 | strncat(tested_versions, ", ", | 418 | strncat(tested_versions, ", ", |
445 | sizeof(tested_versions) - strlen(tested_versions) - 1); | 419 | sizeof(tested_versions) - strlen(tested_versions) - 1); |
@@ -449,9 +423,8 @@ unsigned char* load_of_file( | |||
449 | } | 423 | } |
450 | 424 | ||
451 | ERROR("[ERR] Original firmware unknown, please try an other version." \ | 425 | ERROR("[ERR] Original firmware unknown, please try an other version." \ |
452 | " Tested %s versions are : %s\n", | 426 | " Tested %sv%d versions are : %s\n", |
453 | model_names[sum->model], tested_versions); | 427 | model_names[model], hw_revisions[model], tested_versions); |
454 | #endif | ||
455 | } | 428 | } |
456 | 429 | ||
457 | /* TODO: Do some more sanity checks on the OF image. Some images (like | 430 | /* TODO: Do some more sanity checks on the OF image. Some images (like |
@@ -484,7 +457,7 @@ error: | |||
484 | 457 | ||
485 | /* Loads a rockbox bootloader file into memory */ | 458 | /* Loads a rockbox bootloader file into memory */ |
486 | unsigned char* load_rockbox_file( | 459 | unsigned char* load_rockbox_file( |
487 | char* filename, int model, int* bufsize, int* rb_packedsize, | 460 | char* filename, int *model, int* bufsize, int* rb_packedsize, |
488 | char* errstr, int errstrsize) | 461 | char* errstr, int errstrsize) |
489 | { | 462 | { |
490 | int fd; | 463 | int fd; |
@@ -504,10 +477,12 @@ unsigned char* load_rockbox_file( | |||
504 | if (n != sizeof(header)) | 477 | if (n != sizeof(header)) |
505 | ERROR("[ERR] Could not read file %s\n", filename); | 478 | ERROR("[ERR] Could not read file %s\n", filename); |
506 | 479 | ||
507 | /* Check for correct model string */ | 480 | for(*model = 0; *model < NUM_MODELS; (*model)++) |
508 | if (memcmp(rb_model_names[model], header + 4, 4)!=0) | 481 | if (memcmp(rb_model_names[*model], header + 4, 4) == 0) |
509 | ERROR("[ERR] Expected model name \"%s\" in %s, not \"%4.4s\"\n", | 482 | break; |
510 | rb_model_names[model], filename, (char*)header+4); | 483 | |
484 | if(*model == NUM_MODELS) | ||
485 | ERROR("[ERR] Model name \"%4.4s\" unknown. Is this really a rockbox bootloader?\n", header + 4); | ||
511 | 486 | ||
512 | *bufsize = filesize(fd) - sizeof(header); | 487 | *bufsize = filesize(fd) - sizeof(header); |
513 | 488 | ||
@@ -521,7 +496,7 @@ unsigned char* load_rockbox_file( | |||
521 | ERROR("[ERR] Could not read file %s\n", filename); | 496 | ERROR("[ERR] Could not read file %s\n", filename); |
522 | 497 | ||
523 | /* Check checksum */ | 498 | /* Check checksum */ |
524 | sum = rb_model_num[model]; | 499 | sum = rb_model_num[*model]; |
525 | for (i = 0; i < *bufsize; i++) { | 500 | for (i = 0; i < *bufsize; i++) { |
526 | /* add 8 unsigned bits but keep a 32 bit sum */ | 501 | /* add 8 unsigned bits but keep a 32 bit sum */ |
527 | sum += buf[i]; | 502 | sum += buf[i]; |