X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=tools%2Fmkimage.c;h=64ad131860b08c7b2d5d2e772c1e55095967be46;hb=3aba3fd65490eff5305160e92937dc5592ab9bfb;hp=d9939583f5533cd044b32e98b66aa34468dd9157;hpb=1f9ef0dca0a1315f0a216808ade8946bcc54e2b4;p=u-boot diff --git a/tools/mkimage.c b/tools/mkimage.c index d9939583f5..64ad131860 100644 --- a/tools/mkimage.c +++ b/tools/mkimage.c @@ -1,14 +1,14 @@ +// SPDX-License-Identifier: GPL-2.0+ /* * (C) Copyright 2008 Semihalf * * (C) Copyright 2000-2009 * DENX Software Engineering * Wolfgang Denk, wd@denx.de - * - * SPDX-License-Identifier: GPL-2.0+ */ #include "mkimage.h" +#include "imximage.h" #include #include @@ -64,6 +64,7 @@ static int show_valid_options(enum ih_category category) genimg_get_cat_name(category, item)); } fprintf(stderr, "\n"); + free(order); return 0; } @@ -87,29 +88,31 @@ static void usage(const char *msg) " -x ==> set XIP (execute in place)\n", params.cmdname); fprintf(stderr, - " %s [-D dtc_options] [-f fit-image.its|-f auto|-F] [-b [-b ]] fit-image\n" - " file is used with -f auto, it may occour multiple times.\n", + " %s [-D dtc_options] [-f fit-image.its|-f auto|-F] [-b [-b ]] [-i ] fit-image\n" + " file is used with -f auto, it may occur multiple times.\n", params.cmdname); fprintf(stderr, " -D => set all options for device tree compiler\n" - " -f => input filename for FIT source\n"); + " -f => input filename for FIT source\n" + " -i => input filename for ramdisk file\n"); #ifdef CONFIG_FIT_SIGNATURE fprintf(stderr, - "Signing / verified boot options: [-E] [-k keydir] [-K dtb] [ -c ] [-p addr] [-r]\n" + "Signing / verified boot options: [-E] [-k keydir] [-K dtb] [ -c ] [-p addr] [-r] [-N engine]\n" " -E => place data outside of the FIT structure\n" " -k => set directory containing private keys\n" " -K => write public keys to this .dtb file\n" " -c => add comment in signature node\n" " -F => re-sign existing FIT image\n" " -p => place external data at a static position\n" - " -r => mark keys used as 'required' in dtb\n"); + " -r => mark keys used as 'required' in dtb\n" + " -N => engine to use for signing (pkcs11)\n"); #else fprintf(stderr, "Signing / verified boot not supported (CONFIG_FIT_SIGNATURE undefined)\n"); #endif fprintf(stderr, " %s -V ==> print version information and exit\n", params.cmdname); - fprintf(stderr, "Use -T to see a list of available image types\n"); + fprintf(stderr, "Use '-T list' to see a list of available image types\n"); exit(EXIT_FAILURE); } @@ -140,7 +143,7 @@ static void process_args(int argc, char **argv) int opt; while ((opt = getopt(argc, argv, - "a:A:b:cC:d:D:e:Ef:Fk:K:ln:p:O:rR:qsT:vVx")) != -1) { + "a:A:b:c:C:d:D:e:Ef:Fk:i:K:ln:N:p:O:rR:qsT:vVx")) != -1) { switch (opt) { case 'a': params.addr = strtoull(optarg, &ptr, 16); @@ -206,6 +209,9 @@ static void process_args(int argc, char **argv) params.type = IH_TYPE_FLATDT; params.fflag = 1; break; + case 'i': + params.fit_ramdisk = optarg; + break; case 'k': params.keydir = optarg; break; @@ -218,6 +224,9 @@ static void process_args(int argc, char **argv) case 'n': params.imagename = optarg; break; + case 'N': + params.engine_id = optarg; + break; case 'O': params.os = genimg_get_os_id(optarg); if (params.os < 0) { @@ -250,6 +259,10 @@ static void process_args(int argc, char **argv) params.skipcpy = 1; break; case 'T': + if (strcmp(optarg, "list") == 0) { + show_valid_options(IH_TYPE); + exit(EXIT_SUCCESS); + } type = genimg_get_type_id(optarg); if (type < 0) { show_valid_options(IH_TYPE); @@ -287,6 +300,8 @@ static void process_args(int argc, char **argv) else if (!params.datafile) usage("Missing data file for auto-FIT (use -d)"); } else if (type != IH_TYPE_INVALID) { + if (type == IH_TYPE_SCRIPT && !params.datafile) + usage("Missing data file for script (use -d)"); params.type = type; } @@ -503,6 +518,37 @@ int main(int argc, char **argv) } else { copy_file(ifd, params.datafile, pad_len); } + if (params.type == IH_TYPE_FIRMWARE_IVT) { + /* Add alignment and IVT */ + uint32_t aligned_filesize = (params.file_size + 0x1000 + - 1) & ~(0x1000 - 1); + flash_header_v2_t ivt_header = { { 0xd1, 0x2000, 0x40 }, + params.addr, 0, 0, 0, params.addr + + aligned_filesize + - tparams->header_size, + params.addr + aligned_filesize + - tparams->header_size + + 0x20, 0 }; + int i = params.file_size; + for (; i < aligned_filesize; i++) { + if (write(ifd, (char *) &i, 1) != 1) { + fprintf(stderr, + "%s: Write error on %s: %s\n", + params.cmdname, + params.imagefile, + strerror(errno)); + exit(EXIT_FAILURE); + } + } + if (write(ifd, &ivt_header, sizeof(flash_header_v2_t)) + != sizeof(flash_header_v2_t)) { + fprintf(stderr, "%s: Write error on %s: %s\n", + params.cmdname, + params.imagefile, + strerror(errno)); + exit(EXIT_FAILURE); + } + } } /* We're a bit of paranoid */ @@ -543,9 +589,8 @@ int main(int argc, char **argv) if (tparams->print_header) tparams->print_header (ptr); else { - fprintf (stderr, "%s: Can't print header for %s: %s\n", - params.cmdname, tparams->name, strerror(errno)); - exit (EXIT_FAILURE); + fprintf (stderr, "%s: Can't print header for %s\n", + params.cmdname, tparams->name); } (void) munmap((void *)ptr, sbuf.st_size);