Browse Source

mkimage: Add variable lenght header support

Some images have not a header of fix lenght. The patch will be
used for the generation of AIS images, because this header has
a variable lenght. The patch adds also the parameter "-s" (skip)
to not copy automatically the passed image file.

Signed-off-by: Stefano Babic <sbabic@denx.de>
Stefano Babic 13 years ago
parent
commit
f0662105b6
2 changed files with 22 additions and 5 deletions
  1. 14 5
      tools/mkimage.c
  2. 8 0
      tools/mkimage.h

+ 14 - 5
tools/mkimage.c

@@ -248,6 +248,9 @@ main (int argc, char **argv)
 					usage ();
 				params.imagename = *++argv;
 				goto NXTARG;
+			case 's':
+				params.skipcpy = 1;
+				break;
 			case 'v':
 				params.vflag++;
 				break;
@@ -361,11 +364,15 @@ NXTARG:		;
 	}
 
 	/*
-	 * Must be -w then:
-	 *
-	 * write dummy header, to be fixed later
+	 * In case there an header with a variable
+	 * length will be added, the corresponding
+	 * function is called. This is responsible to
+	 * allocate memory for the header itself.
 	 */
-	memset (tparams->hdr, 0, tparams->header_size);
+	if (tparams->vrec_header)
+		tparams->vrec_header(&params, tparams);
+	else
+		memset(tparams->hdr, 0, tparams->header_size);
 
 	if (write(ifd, tparams->hdr, tparams->header_size)
 					!= tparams->header_size) {
@@ -374,7 +381,9 @@ NXTARG:		;
 		exit (EXIT_FAILURE);
 	}
 
-	if (params.type == IH_TYPE_MULTI || params.type == IH_TYPE_SCRIPT) {
+	if (!params.skipcpy &&
+		(params.type == IH_TYPE_MULTI ||
+			params.type == IH_TYPE_SCRIPT)) {
 		char *file = params.datafile;
 		uint32_t size;
 

+ 8 - 0
tools/mkimage.h

@@ -60,6 +60,7 @@ struct mkimage_params {
 	int lflag;
 	int vflag;
 	int xflag;
+	int skipcpy;
 	int os;
 	int arch;
 	int type;
@@ -122,6 +123,13 @@ struct image_type_params {
 	int (*check_image_type) (uint8_t);
 	/* This callback function will be executed if fflag is defined */
 	int (*fflag_handle) (struct mkimage_params *);
+	/*
+	 * This callback function will be executed for variable size record
+	 * It is expected to build this header in memory and return its length
+	 * and a pointer to it
+	 */
+	int (*vrec_header) (struct mkimage_params *,
+		struct image_type_params *);
 	/* pointer to the next registered entry in linked list */
 	struct image_type_params *next;
 };