Implement function vrec_header to be able to pad the final
data image file according the what has been calculated for
boot_data.length.

Signed-off-by: Stefano Babic <sba...@denx.de>
---
Changes in v2: None

 tools/imximage.c |   82 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 80 insertions(+), 2 deletions(-)

diff --git a/tools/imximage.c b/tools/imximage.c
index 2b4909e..5981625 100644
--- a/tools/imximage.c
+++ b/tools/imximage.c
@@ -571,18 +571,96 @@ int imximage_check_params(struct mkimage_params *params)
                (params->xflag) || !(strlen(params->imagename));
 }
 
+static int imximage_generate(struct mkimage_params *params,
+       struct image_type_params *tparams)
+{
+       struct imx_header *imxhdr;
+       size_t alloc_len;
+       int dfd;
+       struct stat sbuf;
+       char *datafile = params->datafile;
+       uint32_t pad_len;
+
+       memset(&imximage_header, 0, sizeof(imximage_header));
+
+       /*
+        * In order to not change the old imx cfg file
+        * by adding VERSION command into it, here need
+        * set up function ptr group to V1 by default.
+        */
+       imximage_version = IMXIMAGE_V1;
+       /* Be able to detect if the cfg file has no BOOT_FROM tag */
+       imximage_ivt_offset = FLASH_OFFSET_UNDEFINED;
+       imximage_csf_size = 0;
+       set_hdr_func(imxhdr);
+
+       /* Parse dcd configuration file */
+       parse_cfg_file(&imximage_header, params->imagename);
+
+       /* TODO: check i.MX image V1 handling, for now use 'old' style */
+       if (imximage_version == IMXIMAGE_V1)
+               alloc_len = 4096;
+       else
+               alloc_len = imximage_init_loadsize - imximage_ivt_offset;
+
+       if (alloc_len < sizeof(struct imx_header)) {
+               fprintf(stderr, "%s: header error\n",
+                       params->cmdname);
+               exit(EXIT_FAILURE);
+       }
+
+       imxhdr = malloc(alloc_len);
+
+       if (!imxhdr) {
+               fprintf(stderr, "%s: malloc return failure: %s\n",
+                       params->cmdname, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       memset(imxhdr, 0, alloc_len);
+
+       tparams->header_size = alloc_len;
+       tparams->hdr         = imxhdr;
+
+       /* determine data image file length */
+       dfd = open(datafile, O_RDONLY|O_BINARY);
+       if (dfd < 0) {
+               fprintf(stderr, "%s: Can't open %s: %s\n",
+                       params->cmdname, datafile, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       if (fstat(dfd, &sbuf) < 0) {
+               fprintf(stderr, "%s: Can't stat %s: %s\n",
+                       params->cmdname, datafile, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+
+       pad_len = ROUND(sbuf.st_size, 4096) - sbuf.st_size;
+
+       close(dfd);
+
+       /* TODO: check i.MX image V1 handling, for now use 'old' style */
+       if (imximage_version == IMXIMAGE_V1)
+               return 0;
+       else
+               return pad_len;
+}
+
+
 /*
  * imximage parameters
  */
 static struct image_type_params imximage_params = {
        .name           = "Freescale i.MX Boot Image support",
-       .header_size    = sizeof(struct imx_header),
-       .hdr            = (void *)&imximage_header,
+       .header_size    = 0,
+       .hdr            = NULL,
        .check_image_type = imximage_check_image_types,
        .verify_header  = imximage_verify_header,
        .print_header   = imximage_print_header,
        .set_header     = imximage_set_header,
        .check_params   = imximage_check_params,
+       .vrec_header    = imximage_generate,
 };
 
 void init_imx_image_type(void)
-- 
1.7.9.5

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to