diff mbox

[U-Boot,15/26] mkimage: Allow a FIT to include an image of any type

Message ID 1453999186-18747-16-git-send-email-sjg@chromium.org
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Simon Glass Jan. 28, 2016, 4:39 p.m. UTC
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 |  1 +
 tools/mkimage.c   | 33 ++++++++++++++++++++++++++++-----
 2 files changed, 29 insertions(+), 5 deletions(-)
diff mbox

Patch

diff --git a/tools/imagetool.h b/tools/imagetool.h
index ad2deb5..e0397f7 100644
--- a/tools/imagetool.h
+++ b/tools/imagetool.h
@@ -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 */
 };
 
 /*
diff --git a/tools/mkimage.c b/tools/mkimage.c
index b8293f6..73367d1 100644
--- a/tools/mkimage.c
+++ b/tools/mkimage.c
@@ -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 = strtoul(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 || expecting == IH_TYPE_COUNT) {
+				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];
 }