[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