[U-Boot] [PATCH 5/5] cm-t35: add support for loading splash image from NAND

Jeroen Hofstee
2012-12-24T08:55:45Z

Hi Nikita,

On 12/23/2012 08:03 AM, Nikita Kiryanov wrote:
> Add support for loading splash image from NAND
>
> Signed-off-by: Nikita Kiryanov <nikita@compulab.co.il>
> Signed-off-by: Igor Grinberg <grinberg@compulab.co.il>
> ---
> board/cm_t35/cm_t35.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++
> include/configs/cm_t35.h | 4 +++
> 2 files changed, 65 insertions(+)
>
> diff --git a/board/cm_t35/cm_t35.c b/board/cm_t35/cm_t35.c
> index 8f3d735..8dbdb44 100644
> --- a/board/cm_t35/cm_t35.c
> +++ b/board/cm_t35/cm_t35.c
> @@ -33,7 +33,9 @@
> #include <net.h>
> #include <i2c.h>
> #include <usb.h>
> +#include <nand.h>
> #include <twl4030.h>
> +#include <bmp_layout.h>
> #include <linux/compiler.h>
>
> #include <asm/io.h>
> @@ -75,6 +77,65 @@ static u32 gpmc_nand_config[GPMC_MAX_REG] = {
> 0,
> };
>
> +#ifdef CONFIG_LCD
> +#ifdef CONFIG_CMD_NAND
> +static int splash_load_from_nand(u32 bmp_load_addr)
> +{
> + struct bmp_header *bmp_hdr;
> + int res, splash_screen_nand_offset = 0x100000;
> + size_t bmp_size, bmp_header_size = sizeof(struct bmp_header);
> +
> + if (bmp_load_addr + bmp_header_size >= gd->start_addr_sp)
> + goto splash_address_too_high;
> +
> + res = nand_read_skip_bad(&nand_info[nand_curr_device],
> + splash_screen_nand_offset, &bmp_header_size,
> + (u_char *)bmp_load_addr);
> + if (res < 0)
> + return res;
> +
> + bmp_hdr = (struct bmp_header *)bmp_load_addr;
> + bmp_size = le32_to_cpu(bmp_hdr->file_size);
> +
> + if (bmp_load_addr + bmp_size >= gd->start_addr_sp)
> + goto splash_address_too_high;
> +
> + return nand_read_skip_bad(&nand_info[nand_curr_device],
> + splash_screen_nand_offset, &bmp_size,
> + (u_char *)bmp_load_addr);
> +
> +splash_address_too_high:
> + printf("Error: splashimage address too high. Data overwrites U-Boot "
> + "and/or placed beyond DRAM boundaries.\n");
> +
> + return -1;
> +}
> +#else
> +static inline int splash_load_from_nand(void)
> +{
> + return -1;
> +}
> +#endif /* CONFIG_CMD_NAND */
> +
> +int board_splash_screen_prepare(void)
> +{
> + char *env_splashimage_value;
> + u32 bmp_load_addr;
> +
> + env_splashimage_value = getenv("splashimage");
> + if (env_splashimage_value == NULL)
> + return -1;
> +
> + bmp_load_addr = simple_strtoul(env_splashimage_value, 0, 16);
> + if (bmp_load_addr == 0) {
> + printf("Error: bad splashimage address specified\n");
> + return -1;
> + }
> +
> + return splash_load_from_nand(bmp_load_addr);
> +}
> +#endif /* CONFIG_LCD */
> +
fyi, I noticed that my board compiled with gcc 4.7.3 from ELDK 5.3 will trap
if the bitmap is not aligned. Aligned is a bit tricky though since the
bitmap
has the signature, e.g. "BM" prepended and is thereafter 32 bit aligned
(or at least combined fields of 32 bits). In my case displaying the
bitmap now only works when loaded to an aligned address - 2. Since
you accept the value from the user, which has no ability to restore it once
set "incorrectly", you might want to check the load address (well obviously
only if it is a problem in your case as well).

Regards,
Jeroen