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>
This commit is contained in:
		
							parent
							
								
									9bac0bb374
								
							
						
					
					
						commit
						01390aff25
					
				|  | @ -365,6 +365,13 @@ static void parse_cfg_cmd(struct imx_header *imxhdr, int32_t cmd, char *token, | ||||||
| 				name, lineno, token); | 				name, lineno, token); | ||||||
| 			exit(EXIT_FAILURE); | 			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)) | 		if (unlikely(cmd_ver_first != 1)) | ||||||
| 			cmd_ver_first = 0; | 			cmd_ver_first = 0; | ||||||
| 		break; | 		break; | ||||||
|  | @ -439,7 +446,8 @@ static uint32_t parse_cfg_file(struct imx_header *imxhdr, char *name) | ||||||
| 		exit(EXIT_FAILURE); | 		exit(EXIT_FAILURE); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* Very simple parsing, line starting with # are comments
 | 	/*
 | ||||||
|  | 	 * Very simple parsing, line starting with # are comments | ||||||
| 	 * and are dropped | 	 * and are dropped | ||||||
| 	 */ | 	 */ | ||||||
| 	while ((getline(&line, &len, fd)) > 0) { | 	while ((getline(&line, &len, fd)) > 0) { | ||||||
|  | @ -571,18 +579,92 @@ int imximage_check_params(struct mkimage_params *params) | ||||||
| 		(params->xflag) || !(strlen(params->imagename)); | 		(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 |  * imximage parameters | ||||||
|  */ |  */ | ||||||
| static struct image_type_params imximage_params = { | static struct image_type_params imximage_params = { | ||||||
| 	.name		= "Freescale i.MX Boot Image support", | 	.name		= "Freescale i.MX Boot Image support", | ||||||
| 	.header_size	= sizeof(struct imx_header), | 	.header_size	= 0, | ||||||
| 	.hdr		= (void *)&imximage_header, | 	.hdr		= NULL, | ||||||
| 	.check_image_type = imximage_check_image_types, | 	.check_image_type = imximage_check_image_types, | ||||||
| 	.verify_header	= imximage_verify_header, | 	.verify_header	= imximage_verify_header, | ||||||
| 	.print_header	= imximage_print_header, | 	.print_header	= imximage_print_header, | ||||||
| 	.set_header	= imximage_set_header, | 	.set_header	= imximage_set_header, | ||||||
| 	.check_params	= imximage_check_params, | 	.check_params	= imximage_check_params, | ||||||
|  | 	.vrec_header	= imximage_generate, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| void init_imx_image_type(void) | void init_imx_image_type(void) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue