diff options
author | Amaury Pouly <amaury.pouly@gmail.com> | 2013-01-26 18:24:06 +0000 |
---|---|---|
committer | Amaury Pouly <amaury.pouly@gmail.com> | 2013-01-26 18:24:50 +0000 |
commit | f6e4456cc4337e30483bc52c9dac6e2d38c78897 (patch) | |
tree | 7ed153f7b09ae131ae530885656cb724e8400503 /rbutil/mkimxboot/mkimxboot.c | |
parent | b6cad07f335db0f52e949b9ead0ea7f82202c854 (diff) | |
download | rockbox-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.c | 103 |
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 | |||
499 | enum 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 | } | ||