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

Nikita Kiryanov
2012-12-25T08:56:57Z

Hi Jeroen,

On 12/24/2012 10:55 AM, Jeroen Hofstee wrote:
> 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).

Thanks for verifying this issue. I did encounter it during testing, but
I assumed it to be a compiler problem because it worked when compiling
with a different version.

Loading to aligned address - 2 works for me as well when compiling with
the problematic compiler, but this is strange to me. Isn't the "packed"
attribute that is applied to bmp_header_t supposed to prevent these
types of problems by effectively forcing the compiler to assume byte
alignment?

Albert, can you shed some light on this?

>
> Regards,
> Jeroen
>

--
Regards,
Nikita.