diff options
Diffstat (limited to 'common')
| -rw-r--r-- | common/cmd_ximg.c | 109 | 
1 files changed, 78 insertions, 31 deletions
| diff --git a/common/cmd_ximg.c b/common/cmd_ximg.c index 360b05e1b..77f68c44c 100644 --- a/common/cmd_ximg.c +++ b/common/cmd_ximg.c @@ -37,12 +37,21 @@  int  do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])  { -	ulong addr = load_addr, dest = 0; -	ulong data, len; -	ulong *len_ptr; -	int i, verify, part = 0; -	char pbuf[10], *s; -	image_header_t *hdr; +	ulong		addr = load_addr; +	ulong		dest = 0; +	ulong		data, len, count; +	int		i, verify; +	int		part = 0; +	char		pbuf[10]; +	char		*s; +	image_header_t	*hdr; +#if defined(CONFIG_FIT) +	const char	*uname; +	const void*	fit_hdr; +	int		noffset; +	const void	*fit_data; +	size_t		fit_len; +#endif  	verify = getenv_verify (); @@ -51,16 +60,20 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])  	}  	if (argc > 2) {  		part = simple_strtoul(argv[2], NULL, 16); +#if defined(CONFIG_FIT) +		uname = argv[2]; +#endif  	}  	if (argc > 3) {  		dest = simple_strtoul(argv[3], NULL, 16);  	} -  	switch (genimg_get_format ((void *)addr)) {  	case IMAGE_FORMAT_LEGACY: -		printf("## Copying from legacy image at %08lx ...\n", addr); +		printf("## Copying part %d from legacy image " +			"at %08lx ...\n", part, addr); +  		hdr = (image_header_t *)addr;  		if (!image_check_magic (hdr)) {  			printf("Bad Magic Number\n"); @@ -71,9 +84,9 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])  			printf("Bad Header Checksum\n");  			return 1;  		} -	#ifdef DEBUG +#ifdef DEBUG  		image_print_contents (hdr); -	#endif +#endif  		if (!image_check_type (hdr, IH_TYPE_MULTI)) {  			printf("Wrong Image Type for %s command\n", @@ -96,31 +109,60 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])  			printf("OK\n");  		} -		data = image_get_data (hdr); -		len_ptr = (ulong *) data; - -		data += 4;		/* terminator */ -		for (i = 0; len_ptr[i]; ++i) { -			data += 4; -			if (argc > 2 && part > i) { -				u_long tail; -				len = uimage_to_cpu (len_ptr[i]); -				tail = len % 4; -				data += len; -				if (tail) { -					data += 4 - tail; -				} -			} -		} -		if (argc > 2 && part >= i) { +		count = image_multi_count (hdr); +		if (part >= count) {  			printf("Bad Image Part\n");  			return 1;  		} -		len = uimage_to_cpu (len_ptr[part]); + +		image_multi_getimg (hdr, part, &data, &len); +		break;  #if defined(CONFIG_FIT)  	case IMAGE_FORMAT_FIT: -		fit_unsupported ("imxtract"); -		return 1; +		if (uname == NULL) { +			puts ("No FIT subimage unit name\n"); +			return 1; +		} + +		printf("## Copying '%s' subimage from FIT image " +			"at %08lx ...\n", uname, addr); + +		fit_hdr = (const void *)addr; +		if (!fit_check_format (fit_hdr)) { +			puts ("Bad FIT image format\n"); +			return 1; +		} + +		/* get subimage node offset */ +		noffset = fit_image_get_node (fit_hdr, fit_uname); +		if (noffset < 0) { +			printf ("Can't find '%s' FIT subimage\n", uname); +			return 1; +		} + +		if (fit_image_check_comp (fit_hdr, noffset, IH_COMP_NONE)) { +			printf("Wrong Compression Type for %s command\n", +					cmdtp->name); +			return 1; +		} + +		/* verify integrity */ +		if (verify) { +			if (!fit_image_check_hashes (fit_hdr, noffset)) { +				puts ("Bad Data Hash\n"); +				return 1; +			} +		} + +		/* get subimage data address and length */ +		if (fit_image_get_data (fit_hdr, noffset, &fit_data, &fit_len)) { +			puts ("Could not find script subimage data\n"); +			return 1; +		} + +		data = (ulong *)fit_data; +		len = (ulong)fit_len; +		break;  #endif  	default:  		puts ("Invalid image type for imxtract\n"); @@ -142,6 +184,11 @@ do_imgextract(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])  U_BOOT_CMD(imxtract, 4, 1, do_imgextract,  	   "imxtract- extract a part of a multi-image\n",  	   "addr part [dest]\n" -	   "    - extract <part> from image at <addr> and copy to <dest>\n"); +	   "    - extract <part> from legacy image at <addr> and copy to <dest>\n" +#if defined(CONFIG_FIT) +	   "addr uname [dest]\n" +	   "    - extract <uname> subimage from FIT image at <addr> and copy to <dest>\n" +#endif +);  #endif |