[U-Boot] [PATCH v2 2/2] splash: Load internal and external data from FIT

Stefano Babic sbabic at denx.de
Wed Feb 6 09:00:50 UTC 2019



On 05/02/19 16:29, Mark Jonas wrote:
> From: Leo Ruan <tingquan.ruan at cn.bosch.com>
> 
> The FIT image could contain the splash data in 3 different structure:
> - The splash data is embedded in FIT image (internal)
>   In this case, the property 'data' presents in FIT image header. And
>   internal information 'start' and 'end' represent the location and
>   size of splash data inside of FIT image.
> - The splash data is external with absolute position in FIT image
>   This case is made by 'mkimage -p [pos]'. The splash data is stored
>   at the absolute position. Instead the property 'data', the properties
>   'data-position' and 'data-size' are used to specify the location and
>   size of the splash data.
> - the splash data is external with relative offset in FIT image
>   This case is made by 'mkimage -E'. The splash data is placed after
>   the FIT image header with 4 byte alignment. Instead the property
>   'data', the properties 'data-offset' and 'data-size' are used to
>   specify the location and size of the splash data.
> 
> Currently, the splash only support to load external data with relative
> offset from FIT image. This commit make it possible to load the splash
> data embedded in FIT image or the external data with absolute position
> 
> This inspiration comes from Simon Glass <sjg at chromium.org>, see
> common/spl_fit.c
> 
> Signed-off-by: Leo Ruan <tingquan.ruan at cn.bosch.com>
> Signed-off-by: Mark Jonas <mark.jonas at de.bosch.com>
> Reviewed-by: Simon Glass <sjg at chromium.org>
> ---
>  common/splash_source.c | 55 +++++++++++++++++++++++++++++++-------------------
>  1 file changed, 34 insertions(+), 21 deletions(-)
> 
> diff --git a/common/splash_source.c b/common/splash_source.c
> index e1e73db..8f276a3 100644
> --- a/common/splash_source.c
> +++ b/common/splash_source.c
> @@ -304,8 +304,11 @@ static int splash_load_fit(struct splash_location *location, u32 bmp_load_addr)
>  	int res;
>  	int node_offset;
>  	const char *splash_file;
> -	int splash_offset;
> -	int splash_size;
> +	const void *internal_splash_data;
> +	size_t internal_splash_size;
> +	int external_splash_addr;
> +	int external_splash_size;
> +	bool is_splash_external = false;
>  	struct image_header *img_header;
>  	const u32 *fit_header;
>  	u32 fit_size;
> @@ -348,29 +351,39 @@ static int splash_load_fit(struct splash_location *location, u32 bmp_load_addr)
>  		return -ENOENT;
>  	}
>  
> -	res = fit_image_get_data_offset(fit_header, node_offset,
> -					&splash_offset);
> -	if (res < 0) {
> -		printf("Failed to load splash image (err=%d)\n", res);
> -		return res;
> +	/* Extract the splash data from FIT */
> +	/* 1. Test if splash is in FIT internal data. */
> +	if (!fit_image_get_data(fit_header, node_offset, &internal_splash_data, &internal_splash_size))
> +		memmove((void *)bmp_load_addr, internal_splash_data, internal_splash_size);
> +	/* 2. Test if splash is in FIT external data with fixed position. */
> +	else if (!fit_image_get_data_position(fit_header, node_offset, &external_splash_addr))
> +		is_splash_external = true;
> +	/* 3. Test if splash is in FIT external data with offset. */
> +	else if (!fit_image_get_data_offset(fit_header, node_offset, &external_splash_addr)) {
> +		/* Align data offset to 4-byte boundary */
> +		fit_size = ALIGN(fdt_totalsize(fit_header), 4);
> +		/* External splash offset means the offset by end of FIT header */
> +		external_splash_addr += location->offset + fit_size;
> +		is_splash_external = true;
> +	} else {
> +		printf("Failed to get splash image from FIT\n");
> +		return -ENODATA;
>  	}
>  
> -	res = fit_image_get_data_size(fit_header, node_offset, &splash_size);
> -	if (res < 0) {
> -		printf("Failed to load splash image (err=%d)\n", res);
> -		return res;
> +	if (is_splash_external) {
> +		res = fit_image_get_data_size(fit_header, node_offset, &external_splash_size);
> +		if (res < 0) {
> +			printf("Failed to get size of splash image (err=%d)\n", res);
> +			return res;
> +		}
> +
> +		/* Read in the splash data */
> +		location->offset = external_splash_addr;
> +		res = splash_storage_read_raw(location, bmp_load_addr, external_splash_size);
> +		if (res < 0)
> +			return res;
>  	}
>  
> -	/* Align data offset to 4-byte boundrary */
> -	fit_size = fdt_totalsize(fit_header);
> -	fit_size = (fit_size + 3) & ~3;
> -
> -	/* Read in the splash data */
> -	location->offset = (location->offset + fit_size + splash_offset);
> -	res = splash_storage_read_raw(location, bmp_load_addr , splash_size);
> -	if (res < 0)
> -		return res;
> -
>  	return 0;
>  }
>  #endif /* CONFIG_FIT */
> 


Reviewed-by: Stefano Babic <sbabic at denx.de>

Best regards,
Stefano Babic


-- 
=====================================================================
DENX Software Engineering GmbH,      Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================


More information about the U-Boot mailing list