diff options
| author | Stefano Babic <sbabic@denx.de> | 2013-08-19 19:03:20 +0200 | 
|---|---|---|
| committer | Stefano Babic <sbabic@denx.de> | 2013-08-31 15:06:29 +0200 | 
| commit | 01390aff251e541fcaa77fa6c6e3eee4d7a5554b (patch) | |
| tree | b0387eeee6b22375a45a8722c2ff22ea9fa8e65f | |
| parent | 9bac0bb37402ca72fd905f3e591080b4cfb98c42 (diff) | |
| download | olio-uboot-2014.01-01390aff251e541fcaa77fa6c6e3eee4d7a5554b.tar.xz olio-uboot-2014.01-01390aff251e541fcaa77fa6c6e3eee4d7a5554b.zip | |
tools: add padding of data image file for imximage
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 <sbabic@denx.de>
| -rw-r--r-- | tools/imximage.c | 88 | 
1 files changed, 85 insertions, 3 deletions
| diff --git a/tools/imximage.c b/tools/imximage.c index 2b4909efe..26460bfec 100644 --- a/tools/imximage.c +++ b/tools/imximage.c @@ -365,6 +365,13 @@ static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token,  				name, lineno, token);  			exit(EXIT_FAILURE);  		} + +		/* +		 * The SOC loads from the storage starting at address 0 +		 * then ensures that the load size contains the offset +		 */ +		if (imximage_init_loadsize < imximage_ivt_offset) +			imximage_init_loadsize = imximage_ivt_offset;  		if (unlikely(cmd_ver_first != 1))  			cmd_ver_first = 0;  		break; @@ -439,7 +446,8 @@ static uint32_t parse_cfg_file(struct imx_header *imxhdr, char *name)  		exit(EXIT_FAILURE);  	} -	/* Very simple parsing, line starting with # are comments +	/* +	 * Very simple parsing, line starting with # are comments  	 * and are dropped  	 */  	while ((getline(&line, &len, fd)) > 0) { @@ -571,18 +579,92 @@ 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; +	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 { +		if (imximage_init_loadsize < imximage_ivt_offset + +			sizeof(imx_header_v2_t)) +				imximage_init_loadsize = imximage_ivt_offset + +					sizeof(imx_header_v2_t); +		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 */ + +	if (stat(datafile, &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; + +	/* 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) |