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 <nik...@compulab.co.il>
Signed-off-by: Igor Grinberg <grinb...@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.
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to