mkimage: Allow a FIT to include an image of any type
authorSimon Glass <sjg@chromium.org>
Tue, 23 Feb 2016 05:55:48 +0000 (22:55 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 14 Mar 2016 23:18:27 +0000 (19:18 -0400)
At present FIT images are set up by providing a device tree source file
which is a file with a .its extension. We want to support automatically
creating this file based on the image supplied to mkimage. This means that
even though the final file type is always IH_TYPE_FLATDT, the image inside
may be something else.

Signed-off-by: Simon Glass <sjg@chromium.org>
tools/imagetool.h
tools/mkimage.c

index ad2deb5..e0397f7 100644 (file)
@@ -61,6 +61,7 @@ struct image_tool_params {
        int require_keys;       /* 1 to mark signing keys as 'required' */
        int file_size;          /* Total size of output file */
        int orig_file_size;     /* Original size for file before padding */
+       int fit_image_type;     /* Image type to put into the FIT */
 };
 
 /*
index e1900bd..4526da2 100644 (file)
@@ -112,10 +112,14 @@ static void usage(const char *msg)
 static void process_args(int argc, char **argv)
 {
        char *ptr;
+       int type = IH_TYPE_INVALID;
+       char *datafile = NULL;
+       int expecting;
        int opt;
 
+       expecting = IH_TYPE_COUNT;      /* Unknown */
        while ((opt = getopt(argc, argv,
-                            "a:A:cC:d:D:e:f:Fk:K:ln:O:rR:sT:vVx")) != -1) {
+                            "-a:A:cC:d:D:e:f:Fk:K:ln:O:rR:sT:vVx")) != -1) {
                switch (opt) {
                case 'a':
                        params.addr = strtoull(optarg, &ptr, 16);
@@ -162,6 +166,7 @@ static void process_args(int argc, char **argv)
                         * The flattened image tree (FIT) format
                         * requires a flattened device tree image type
                         */
+                       params.fit_image_type = params.type;
                        params.type = IH_TYPE_FLATDT;
                        params.fflag = 1;
                        break;
@@ -196,11 +201,12 @@ static void process_args(int argc, char **argv)
                        params.skipcpy = 1;
                        break;
                case 'T':
-                       params.type = genimg_get_type_id(optarg);
-                       if (params.type < 0) {
+                       type = genimg_get_type_id(optarg);
+                       if (type < 0) {
                                show_image_types();
                                usage("Invalid image type");
                        }
+                       expecting = type;
                        break;
                case 'v':
                        params.vflag++;
@@ -211,14 +217,31 @@ static void process_args(int argc, char **argv)
                case 'x':
                        params.xflag++;
                        break;
+               case 1:
+                       if (expecting == type || optind == argc) {
+                               params.imagefile = optarg;
+                               expecting = IH_TYPE_INVALID;
+                       }
+                       break;
                default:
                        usage("Invalid option");
                }
        }
 
-       if (optind >= argc)
+       /*
+        * For auto-generated FIT images we need to know the image type to put
+        * in the FIT, which is separate from the file's image type (which
+        * will always be IH_TYPE_FLATDT in this case).
+        */
+       if (params.type == IH_TYPE_FLATDT) {
+               params.fit_image_type = type;
+               params.datafile = datafile;
+       } else if (type != IH_TYPE_INVALID) {
+               params.type = type;
+       }
+
+       if (!params.imagefile)
                usage("Missing output filename");
-       params.imagefile = argv[optind];
 }