mkimage: Add variable lenght header support
authorStefano Babic <sbabic@denx.de>
Thu, 15 Sep 2011 23:50:16 +0000 (23:50 +0000)
committerWolfgang Denk <wd@denx.de>
Wed, 5 Oct 2011 20:03:12 +0000 (22:03 +0200)
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>
tools/mkimage.c
tools/mkimage.h

index 2f3310175489a2d55894b0d5a2c2252b233262d7..c307a37615fc7e9550cfc59a5b77028086d21ad4 100644 (file)
@@ -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;
 
index e59a91913e305cfd977c805fde4886f117052006..213baf0037620edb1dab024b4615e478cd691ab9 100644 (file)
@@ -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;
 };