Merge branch 'master' of git://git.denx.de/u-boot-video

This commit is contained in:
Tom Rini 2017-01-16 20:23:14 -05:00
commit f253f2933b
6 changed files with 150 additions and 19 deletions

View file

@ -777,6 +777,54 @@ int fit_image_get_data(const void *fit, int noffset,
return 0;
}
/**
* Get 'data-offset' property from a given image node.
*
* @fit: pointer to the FIT image header
* @noffset: component image node offset
* @data_offset: holds the data-offset property
*
* returns:
* 0, on success
* -ENOENT if the property could not be found
*/
int fit_image_get_data_offset(const void *fit, int noffset, int *data_offset)
{
const fdt32_t *val;
val = fdt_getprop(fit, noffset, FIT_DATA_OFFSET_PROP, NULL);
if (!val)
return -ENOENT;
*data_offset = fdt32_to_cpu(*val);
return 0;
}
/**
* Get 'data-size' property from a given image node.
*
* @fit: pointer to the FIT image header
* @noffset: component image node offset
* @data_size: holds the data-size property
*
* returns:
* 0, on success
* -ENOENT if the property could not be found
*/
int fit_image_get_data_size(const void *fit, int noffset, int *data_size)
{
const fdt32_t *val;
val = fdt_getprop(fit, noffset, FIT_DATA_SIZE_PROP, NULL);
if (!val)
return -ENOENT;
*data_size = fdt32_to_cpu(*val);
return 0;
}
/**
* fit_image_hash_get_algo - get hash algorithm name
* @fit: pointer to the FIT format image header

View file

@ -7,15 +7,17 @@
*/
#include <common.h>
#include <nand.h>
#include <errno.h>
#include <splash.h>
#include <spi_flash.h>
#include <spi.h>
#include <usb.h>
#include <sata.h>
#include <bmp_layout.h>
#include <errno.h>
#include <fs.h>
#include <fdt_support.h>
#include <image.h>
#include <nand.h>
#include <sata.h>
#include <spi.h>
#include <spi_flash.h>
#include <splash.h>
#include <usb.h>
DECLARE_GLOBAL_DATA_PTR;
@ -295,6 +297,72 @@ static struct splash_location *select_splash_location(
return NULL;
}
#ifdef CONFIG_FIT
static int splash_load_fit(struct splash_location *location, u32 bmp_load_addr)
{
int res;
int node_offset;
int splash_offset;
int splash_size;
struct image_header *img_header;
const u32 *fit_header;
u32 fit_size;
const size_t header_size = sizeof(struct image_header);
/* Read in image header */
res = splash_storage_read_raw(location, bmp_load_addr, header_size);
if (res < 0)
return res;
img_header = (struct image_header *)bmp_load_addr;
fit_size = fdt_totalsize(img_header);
/* Read in entire FIT */
fit_header = (const u32 *)(bmp_load_addr + header_size);
res = splash_storage_read_raw(location, (u32)fit_header, fit_size);
if (res < 0)
return res;
res = fit_check_format(fit_header);
if (!res) {
debug("Could not find valid FIT image\n");
return -EINVAL;
}
node_offset = fit_image_get_node(fit_header, location->name);
if (node_offset < 0) {
debug("Could not find splash image '%s' in FIT\n",
location->name);
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;
}
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;
}
/* 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 */
/**
* splash_source_load - load splash image from a supported location.
*
@ -327,10 +395,13 @@ int splash_source_load(struct splash_location *locations, uint size)
if (!splash_location)
return -EINVAL;
if (splash_location->flags & SPLASH_STORAGE_RAW)
if (splash_location->flags == SPLASH_STORAGE_RAW)
return splash_load_raw(splash_location, bmp_load_addr);
else if (splash_location->flags & SPLASH_STORAGE_FS)
else if (splash_location->flags == SPLASH_STORAGE_FS)
return splash_load_fs(splash_location, bmp_load_addr);
#ifdef CONFIG_FIT
else if (splash_location->flags == SPLASH_STORAGE_FIT)
return splash_load_fit(splash_location, bmp_load_addr);
#endif
return -EINVAL;
}

View file

@ -5,7 +5,7 @@ The splash_screen_prepare() function is a weak function defined in
common/splash.c. It is called as part of the splash screen display
sequence. It gives the board an opportunity to prepare the splash
image data before it is processed and sent to the frame buffer by
U-Boot. Define your own version to use this feature.
U-Boot. Define your own version to use this feature.
CONFIG_SPLASH_SOURCE
@ -20,7 +20,12 @@ splashsource works as follows:
- If splashsource is undefined, use the first splash location as default.
- If splashsource is set to an unsupported value, do not load a splash screen.
A splash source location can describe either storage with raw data, or storage
formatted with a file system. In case of a filesystem, the splash screen data is
loaded as a file. The name of the splash screen file can be controlled with the
environment variable "splashfile".
A splash source location can describe either storage with raw data, a storage
formatted with a file system or a FIT image. In case of a filesystem, the splash
screen data is loaded as a file. The name of the splash screen file can be
controlled with the environment variable "splashfile".
To enable loading the splash image from a FIT image, CONFIG_FIT must be
enabled. Struct splash_location field 'name' should match the splash image
name within the FIT and the FIT should start at the 'offset' field address in
the specified storage.

View file

@ -1861,14 +1861,16 @@ static void *video_logo(void)
__maybe_unused int y_off = 0;
__maybe_unused ulong addr;
__maybe_unused char *s;
__maybe_unused int len, space;
__maybe_unused int len, ret, space;
splash_get_pos(&video_logo_xpos, &video_logo_ypos);
#ifdef CONFIG_SPLASH_SCREEN
s = getenv("splashimage");
if (s != NULL) {
splash_screen_prepare();
ret = splash_screen_prepare();
if (ret < 0)
return video_fb_address;
addr = simple_strtoul(s, NULL, 16);
if (video_display_bitmap(addr,

View file

@ -872,6 +872,8 @@ int bootz_setup(ulong image, ulong *start, ulong *end);
/* image node */
#define FIT_DATA_PROP "data"
#define FIT_DATA_OFFSET_PROP "data-offset"
#define FIT_DATA_SIZE_PROP "data-size"
#define FIT_TIMESTAMP_PROP "timestamp"
#define FIT_DESC_PROP "description"
#define FIT_ARCH_PROP "arch"
@ -950,6 +952,8 @@ int fit_image_get_load(const void *fit, int noffset, ulong *load);
int fit_image_get_entry(const void *fit, int noffset, ulong *entry);
int fit_image_get_data(const void *fit, int noffset,
const void **data, size_t *size);
int fit_image_get_data_offset(const void *fit, int noffset, int *data_offset);
int fit_image_get_data_size(const void *fit, int noffset, int *data_size);
int fit_image_hash_get_algo(const void *fit, int noffset, char **algo);
int fit_image_hash_get_value(const void *fit, int noffset, uint8_t **value,

View file

@ -33,8 +33,9 @@ enum splash_storage {
};
enum splash_flags {
SPLASH_STORAGE_RAW,
SPLASH_STORAGE_FS,
SPLASH_STORAGE_RAW, /* Stored in raw memory */
SPLASH_STORAGE_FS, /* Stored within a file system */
SPLASH_STORAGE_FIT, /* Stored inside a FIT image */
};
struct splash_location {