summaryrefslogtreecommitdiff
path: root/rbutil/mkimxboot/mkimxboot.c
diff options
context:
space:
mode:
authorAmaury Pouly <amaury.pouly@gmail.com>2013-01-26 18:24:06 +0000
committerAmaury Pouly <amaury.pouly@gmail.com>2013-01-26 18:24:50 +0000
commitf6e4456cc4337e30483bc52c9dac6e2d38c78897 (patch)
tree7ed153f7b09ae131ae530885656cb724e8400503 /rbutil/mkimxboot/mkimxboot.c
parentb6cad07f335db0f52e949b9ead0ea7f82202c854 (diff)
downloadrockbox-f6e4456cc4337e30483bc52c9dac6e2d38c78897.tar.gz
rockbox-f6e4456cc4337e30483bc52c9dac6e2d38c78897.zip
mkimxboot: add an option to extract the of without processing
Change-Id: Ie370f152f4efff4428ee023a9211b82a77fd1df4
Diffstat (limited to 'rbutil/mkimxboot/mkimxboot.c')
-rw-r--r--rbutil/mkimxboot/mkimxboot.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/rbutil/mkimxboot/mkimxboot.c b/rbutil/mkimxboot/mkimxboot.c
index b79361dd63..9e43bbd61c 100644
--- a/rbutil/mkimxboot/mkimxboot.c
+++ b/rbutil/mkimxboot/mkimxboot.c
@@ -495,3 +495,106 @@ enum imx_error_t mkimxboot(const char *infile, const char *bootfile,
495 sb_free(sb_file); 495 sb_free(sb_file);
496 return ret; 496 return ret;
497} 497}
498
499enum imx_error_t extract_firmware(const char *infile,
500 enum imx_firmware_variant_t fw_variant, const char *outfile)
501{
502 /* Dump tables */
503 if(fw_variant > VARIANT_COUNT) {
504 return IMX_ERROR;
505 }
506 dump_imx_dev_info("[INFO] ");
507 /* compute MD5 sum of the file */
508 uint8_t file_md5sum[16];
509 FILE *f = fopen(infile, "rb");
510 if(f == NULL)
511 {
512 printf("[ERR] Cannot open input file\n");
513 return IMX_OPEN_ERROR;
514 }
515 fseek(f, 0, SEEK_END);
516 size_t sz = ftell(f);
517 fseek(f, 0, SEEK_SET);
518 void *buf = xmalloc(sz);
519 if(fread(buf, sz, 1, f) != 1)
520 {
521 fclose(f);
522 free(buf);
523 printf("[ERR] Cannot read file\n");
524 return IMX_READ_ERROR;
525 }
526 md5_context ctx;
527 md5_starts(&ctx);
528 md5_update(&ctx, buf, sz);
529 md5_finish(&ctx, file_md5sum);
530 fclose(f);
531
532 printf("[INFO] MD5 sum of the file: ");
533 print_hex(file_md5sum, 16, true);
534 /* find model */
535 enum imx_model_t model;
536 int md5_idx;
537 do
538 {
539 int i = 0;
540 while(i < NR_IMX_SUMS)
541 {
542 uint8_t md5[20];
543 if(strlen(imx_sums[i].md5sum) != 32)
544 {
545 printf("[INFO] Invalid MD5 sum in imx_sums\n");
546 return IMX_ERROR;
547 }
548 for(int j = 0; j < 16; j++)
549 {
550 byte a, b;
551 if(convxdigit(imx_sums[i].md5sum[2 * j], &a) || convxdigit(imx_sums[i].md5sum[2 * j + 1], &b))
552 {
553 printf("[ERR][INTERNAL] Bad checksum format: %s\n", imx_sums[i].md5sum);
554 free(buf);
555 return IMX_ERROR;
556 }
557 md5[j] = (a << 4) | b;
558 }
559 if(memcmp(file_md5sum, md5, 16) == 0)
560 break;
561 i++;
562 }
563 if(i == NR_IMX_SUMS)
564 {
565 printf("[ERR] MD5 sum doesn't match any known file\n");
566 return IMX_NO_MATCH;
567 }
568 model = imx_sums[i].model;
569 md5_idx = i;
570 }while(0);
571 printf("[INFO] File is for model %d (%s, version %s)\n", model,
572 imx_models[model].model_name, imx_sums[md5_idx].version);
573
574 if(imx_sums[md5_idx].fw_variants[fw_variant].size == 0)
575 {
576 printf("[ERR] Input file does not contain variant '%s'\n", imx_fw_variant[fw_variant]);
577 free(buf);
578 return IMX_VARIANT_MISMATCH;
579 }
580
581 f = fopen(outfile, "wb");
582 if(f == NULL)
583 {
584 printf("[ERR] Cannot open input file\n");
585 free(buf);
586 return IMX_OPEN_ERROR;
587 }
588 enum imx_error_t ret = IMX_SUCCESS;
589
590 if(fwrite(buf + imx_sums[md5_idx].fw_variants[fw_variant].offset,
591 imx_sums[md5_idx].fw_variants[fw_variant].size, 1, f) != 1)
592 {
593 printf("[ERR] Cannot write file\n");
594 ret = IMX_ERROR;
595 }
596 fclose(f);
597 free(buf);
598
599 return ret;
600}