Signed-off-by: Heiko Schocher <h...@denx.de>
Cc: Albert ARIBAUD <albert.u.b...@aribaud.net>
Cc: Sandeep Paulraj <s-paul...@ti.com>
Cc: Scott Wood <scottw...@freescale.com>
Cc: Tom Rini <tr...@ti.com>

---
change for v6:
- moved arch/arm/cpu/arm926ejs/davinci/spl_nand.c to
  drivers/mtd/nand/nand_spl_load.c as Scoot Wood suggested.
  compiled through CONFIG_SPL_NAND_LOAD define

changes for v7:
- add comments from Scott Wood:
  - removed unnecessary inline
  - add only a comment after #ifdef CONFIG_SPL_BUILD that says:
    /* not set with legacy CONFIG_NAND_SPL */
  - replaced tab with space in drivers/mtd/nand/Makefile
  - changed indent/alignment in drivers/mtd/nand/nand_spl_load.c

 Makefile                                |    8 +++-
 arch/arm/cpu/arm926ejs/davinci/Makefile |    5 ++
 arch/arm/cpu/arm926ejs/davinci/spl.c    |   63 +++++++++++++++++++++++++++++++
 arch/arm/cpu/arm926ejs/start.S          |   19 +++++++++-
 doc/README.SPL                          |    1 +
 drivers/mtd/nand/Makefile               |    3 +
 drivers/mtd/nand/nand_spl_load.c        |   56 +++++++++++++++++++++++++++
 7 files changed, 152 insertions(+), 3 deletions(-)
 create mode 100644 arch/arm/cpu/arm926ejs/davinci/spl.c
 create mode 100644 drivers/mtd/nand/nand_spl_load.c

diff --git a/Makefile b/Makefile
index 9ef33f9..46a6e78 100644
--- a/Makefile
+++ b/Makefile
@@ -415,9 +415,13 @@ $(obj)u-boot.sha1: $(obj)u-boot.bin
 $(obj)u-boot.dis:      $(obj)u-boot
                $(OBJDUMP) -d $< > $@
 
-$(obj)u-boot.ubl:       $(obj)u-boot-nand.bin
+$(obj)u-boot.ubl:       $(obj)spl/u-boot-spl.bin $(obj)u-boot.bin
+               $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(PAD_TO) -O binary 
$(obj)spl/u-boot-spl $(obj)spl/u-boot-spl-pad.bin
+               cat $(obj)spl/u-boot-spl-pad.bin $(obj)u-boot.bin > 
$(obj)u-boot-ubl.bin
                $(obj)tools/mkimage -n $(UBL_CONFIG) -T ublimage \
-               -e $(CONFIG_SYS_TEXT_BASE) -d $< $@
+               -e $(CONFIG_SYS_TEXT_BASE) -d $(obj)u-boot-ubl.bin 
$(obj)u-boot.ubl
+               rm $(obj)u-boot-ubl.bin
+               rm $(obj)spl/u-boot-spl-pad.bin
 
 ifeq ($(CONFIG_SANDBOX),y)
 GEN_UBOOT = \
diff --git a/arch/arm/cpu/arm926ejs/davinci/Makefile 
b/arch/arm/cpu/arm926ejs/davinci/Makefile
index 0310957..98c7e55 100644
--- a/arch/arm/cpu/arm926ejs/davinci/Makefile
+++ b/arch/arm/cpu/arm926ejs/davinci/Makefile
@@ -35,6 +35,11 @@ COBJS-$(CONFIG_SOC_DM644X)   += dm644x.o
 COBJS-$(CONFIG_SOC_DM646X)     += dm646x.o
 COBJS-$(CONFIG_DRIVER_TI_EMAC) += lxt972.o dp83848.o et1011c.o ksz8873.o
 
+ifdef CONFIG_SPL_BUILD
+COBJS-y        += spl.o
+COBJS-y        += dm365_lowlevel.o
+endif
+
 SOBJS  = reset.o
 
 ifndef CONFIG_SKIP_LOWLEVEL_INIT
diff --git a/arch/arm/cpu/arm926ejs/davinci/spl.c 
b/arch/arm/cpu/arm926ejs/davinci/spl.c
new file mode 100644
index 0000000..db69be8
--- /dev/null
+++ b/arch/arm/cpu/arm926ejs/davinci/spl.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2011
+ * Heiko Schocher, DENX Software Engineering, h...@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <asm/u-boot.h>
+#include <asm/utils.h>
+#include <nand.h>
+#include <asm/arch/dm365_lowlevel.h>
+#include <ns16550.h>
+
+void puts(const char *str)
+{
+       while (*str)
+               putc(*str++);
+}
+
+void putc(char c)
+{
+       if (c == '\n')
+               NS16550_putc((NS16550_t)(CONFIG_SYS_NS16550_COM1), '\r');
+
+       NS16550_putc((NS16550_t)(CONFIG_SYS_NS16550_COM1), c);
+}
+
+void hang(void)
+{
+       puts("### ERROR ### Please RESET the board ###\n");
+       for (;;)
+               ;
+}
+
+void board_init_f(ulong dummy)
+{
+       dm36x_lowlevel_init(0);
+       relocate_code(CONFIG_SPL_STACK, NULL, CONFIG_SPL_TEXT_BASE);
+}
+
+void board_init_r(gd_t *id, ulong dummy)
+{
+
+       nand_init();
+       puts("Nand boot...\n");
+       nand_boot();
+}
diff --git a/arch/arm/cpu/arm926ejs/start.S b/arch/arm/cpu/arm926ejs/start.S
index 86a0dc2..5ffc653 100644
--- a/arch/arm/cpu/arm926ejs/start.S
+++ b/arch/arm/cpu/arm926ejs/start.S
@@ -126,7 +126,12 @@ _fiq:
 
 .globl _TEXT_BASE
 _TEXT_BASE:
+#ifdef CONFIG_SPL_BUILD
+       /* not set with legacy CONFIG_NAND_SPL */
+       .word   CONFIG_SPL_TEXT_BASE
+#else
        .word   CONFIG_SYS_TEXT_BASE
+#endif
 
 /*
  * These are defined in the board-specific linker script.
@@ -192,7 +197,12 @@ reset:
 
 /* Set stackpointer in internal RAM to call board_init_f */
 call_board_init_f:
+#ifdef CONFIG_SPL_BUILD
+       /* not set with legacy CONFIG_NAND_SPL */
+       ldr     sp, =(CONFIG_SPL_STACK)
+#else
        ldr     sp, =(CONFIG_SYS_INIT_SP_ADDR)
+#endif
        bic     sp, sp, #7 /* 8-byte alignment for ABI compliance */
        ldr     r0,=0x00000000
        bl      board_init_f
@@ -217,6 +227,7 @@ stack_setup:
        mov     sp, r4
 
        adr     r0, _start
+       sub     r9, r6, r0              /* r9 <- relocation offset */
        cmp     r0, r6
        beq     clear_bss               /* skip relocation */
        mov     r1, r6                  /* r1 <- scratch for copy loop */
@@ -271,12 +282,17 @@ fixnext:
 #endif
 
 clear_bss:
-#ifndef CONFIG_SPL_BUILD
+#ifdef CONFIG_SPL_BUILD
+       /* No relocation for SPL */
+       ldr     r0, =__bss_start
+       ldr     r1, =__bss_end__
+#else
        ldr     r0, _bss_start_ofs
        ldr     r1, _bss_end_ofs
        mov     r4, r6                  /* reloc addr */
        add     r0, r0, r4
        add     r1, r1, r4
+#endif
        mov     r2, #0x00000000         /* clear                            */
 
 clbss_l:str    r2, [r0]                /* clear loop...                    */
@@ -284,6 +300,7 @@ clbss_l:str r2, [r0]                /* clear loop...        
            */
        cmp     r0, r1
        bne     clbss_l
 
+#ifndef CONFIG_SPL_BUILD
        bl coloured_LED_init
        bl red_led_on
 #endif
diff --git a/doc/README.SPL b/doc/README.SPL
index b460e84..89d24a7 100644
--- a/doc/README.SPL
+++ b/doc/README.SPL
@@ -64,3 +64,4 @@ CONFIG_SPL_POWER_SUPPORT (drivers/power/libpower.o)
 CONFIG_SPL_NAND_SUPPORT (drivers/mtd/nand/libnand.o)
 CONFIG_SPL_DMA_SUPPORT (drivers/dma/libdma.o)
 CONFIG_SPL_POST_MEM_SUPPORT (post/drivers/memory.o)
+CONFIG_SPL_NAND_LOAD (drivers/mtd/nand/nand_spl_load.o)
diff --git a/drivers/mtd/nand/Makefile b/drivers/mtd/nand/Makefile
index 1eeba5c..e80da62 100644
--- a/drivers/mtd/nand/Makefile
+++ b/drivers/mtd/nand/Makefile
@@ -30,6 +30,9 @@ ifdef CONFIG_SPL_BUILD
 ifdef CONFIG_SPL_NAND_SIMPLE
 COBJS-y += nand_spl_simple.o
 endif
+ifdef CONFIG_SPL_NAND_LOAD
+COBJS-y += nand_spl_load.o
+endif
 else
 COBJS-y += nand.o
 COBJS-y += nand_bbt.o
diff --git a/drivers/mtd/nand/nand_spl_load.c b/drivers/mtd/nand/nand_spl_load.c
new file mode 100644
index 0000000..d7f6f10
--- /dev/null
+++ b/drivers/mtd/nand/nand_spl_load.c
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2011
+ * Heiko Schocher, DENX Software Engineering, h...@denx.de.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <nand.h>
+
+/*
+ * The main entry for NAND booting. It's necessary that SDRAM is already
+ * configured and available since this code loads the main U-Boot image
+ * from NAND into SDRAM and starts it from there.
+ */
+void nand_boot(void)
+{
+       int ret;
+       __attribute__((noreturn)) void (*uboot)(void);
+
+       /*
+        * Load U-Boot image from NAND into RAM
+        */
+       ret =  nand_spl_load_image(CONFIG_SYS_NAND_U_BOOT_OFFS,
+                       CONFIG_SYS_NAND_U_BOOT_SIZE,
+                       (void *)CONFIG_SYS_NAND_U_BOOT_DST);
+
+#ifdef CONFIG_NAND_ENV_DST
+       ret =  nand_spl_load_image(CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
+               (void *)CONFIG_NAND_ENV_DST);
+
+#ifdef CONFIG_ENV_OFFSET_REDUND
+       ret =  nand_spl_load_image(CONFIG_ENV_OFFSET_REDUND, CONFIG_ENV_SIZE,
+               (void *)CONFIG_NAND_ENV_DST + CONFIG_ENV_SIZE);
+#endif
+#endif
+
+       /*
+        * Jump to U-Boot image
+        */
+       uboot = (void *)CONFIG_SYS_NAND_U_BOOT_START;
+       (*uboot)();
+}
-- 
1.7.6.4

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to