The SMDKC100 Board has 256MB onenand.
So, It's bootable, if this patch is adapted thus the board use onenand_ipl.

Signed-off-by: HeungJun, Kim <riverful....@samsung.com>

---

This patch support onenand boot on SMDKC100 Board.

 onenand_ipl/board/samsung/smdkc100/Makefile        |   95 ++++++++++++++++++++
 .../board/samsung/smdkc100/u-boot-onenand.lds      |   53 +++++++++++
 onenand_ipl/onenand_ipl.h                          |   11 +++
 onenand_ipl/onenand_read.c                         |   18 ++++
 4 files changed, 177 insertions(+), 0 deletions(-)
 create mode 100644 onenand_ipl/board/samsung/smdkc100/Makefile
 create mode 100644 onenand_ipl/board/samsung/smdkc100/u-boot-onenand.lds

diff --git a/onenand_ipl/board/samsung/smdkc100/Makefile
b/onenand_ipl/board/samsung/smdkc100/Makefile
new file mode 100644
index 0000000..4301938
--- /dev/null
+++ b/onenand_ipl/board/samsung/smdkc100/Makefile
@@ -0,0 +1,95 @@
+#
+#  Samsung SMDKC100(S5PC100) board OneNAND IPL
+#
+#  Copyright (C) 2009 Samsung Electronics
+#  Minkyu Kang <mk7.k...@samsung.com>
+#
+# 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.
+#
+
+include $(TOPDIR)/config.mk
+TEXT_BASE = 0xD0034000
+TEXT_BASE2K = 0xD0034800
+TEXT_BASE4K = 0xD0035000
+
+LDSCRIPT= $(TOPDIR)/onenand_ipl/board/$(BOARDDIR)/u-boot-onenand.lds
+LDFLAGS        = -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) 
$(PLATFORM_LDFLAGS)
+AFLAGS += -DCONFIG_ONENAND_IPL -g
+CFLAGS += -DCONFIG_ONENAND_IPL -g
+OBJCFLAGS += --gap-fill=0x00
+
+SOBJS  := lowlevel_init.o mem_setup.o
+SOBJS  += start.o
+COBJS  += onenand_read.o
+COBJS  += onenand_boot.o
+
+SRCS   := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
+OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
+__OBJS := $(SOBJS) $(COBJS)
+LNDIR  := $(OBJTREE)/onenand_ipl/board/$(BOARDDIR)
+
+onenandobj     := $(OBJTREE)/onenand_ipl/
+
+ALL    = $(onenandobj)onenand-ipl $(onenandobj)onenand-ipl.bin
$(onenandobj)onenand-ipl-2k.bin $(onenandobj)onenand-ipl-4k.bin
+
+all:   $(obj).depend $(ALL)
+
+$(onenandobj)onenand-ipl-2k.bin:       $(onenandobj)onenand-ipl
+       $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(TEXT_BASE2K) -O binary $< $@
+
+$(onenandobj)onenand-ipl-4k.bin:       $(onenandobj)onenand-ipl
+       $(OBJCOPY) ${OBJCFLAGS} --pad-to=$(TEXT_BASE4K) -O binary $< $@
+
+$(onenandobj)onenand-ipl.bin:  $(onenandobj)onenand-ipl
+       $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
+
+$(onenandobj)onenand-ipl:      $(OBJS)
+       cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
+               -Map $...@.map -o $@
+
+# create symbolic links from common files
+
+# from cpu directory
+$(obj)start.S:
+       @rm -f $@
+       ln -s $(SRCTREE)/cpu/$(CPU)/start.S $@
+
+$(obj)mem_setup.S:
+       ln -sf $(SRCTREE)/board/$(BOARDDIR)/mem_setup.S $@
+
+$(obj)lowlevel_init.S:
+       ln -sf $(SRCTREE)/board/$(BOARDDIR)/lowlevel_init.S $@
+
+# from onenand_ipl directory
+$(obj)onenand_ipl.h:
+       @rm -f $@
+       ln -s $(SRCTREE)/onenand_ipl/onenand_ipl.h $@
+
+$(obj)onenand_boot.c:  $(obj)onenand_ipl.h
+       @rm -f $@
+       ln -s $(SRCTREE)/onenand_ipl/onenand_boot.c $@
+
+$(obj)onenand_read.c:  $(obj)onenand_ipl.h
+       @rm -f $@
+       ln -s $(SRCTREE)/onenand_ipl/onenand_read.c $@
+
+#########################################################################
+
+$(obj)%.o:     $(obj)%.S
+       $(CC) $(AFLAGS) -c -o $@ $<
+
+$(obj)%.o:     $(obj)$.c
+       $(CC) $(CFLAGS) -c -o $@ $<
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+clean:
+       rm onenand_boot.c onenand_read.c
+
+#########################################################################
diff --git a/onenand_ipl/board/samsung/smdkc100/u-boot-onenand.lds
b/onenand_ipl/board/samsung/smdkc100/u-boot-onenand.lds
new file mode 100644
index 0000000..559f9f2
--- /dev/null
+++ b/onenand_ipl/board/samsung/smdkc100/u-boot-onenand.lds
@@ -0,0 +1,53 @@
+/*
+ * (C) Copyright 2005-2008 Samsung Electronics
+ * Kyungmin Park <kyungmin.p...@samsung.com>
+ *
+ * Derived from X-loader
+ *
+ * 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
+ */
+
+OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
+OUTPUT_ARCH(arm)
+ENTRY(_start)
+SECTIONS
+{
+       . = 0x00000000;
+
+       . = ALIGN(4);
+       .text      :
+       {
+         start.o       (.text)
+         *(.text)
+       }
+
+       . = ALIGN(4);
+       .rodata : { *(.rodata) }
+
+       . = ALIGN(4);
+       .data : { *(.data) }
+
+       . = ALIGN(4);
+       .got : { *(.got) }
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .bss : { *(.bss) }
+       _end = .;
+}
diff --git a/onenand_ipl/onenand_ipl.h b/onenand_ipl/onenand_ipl.h
index 412572a..9a1a214 100644
--- a/onenand_ipl/onenand_ipl.h
+++ b/onenand_ipl/onenand_ipl.h
@@ -23,7 +23,18 @@

 #include <linux/mtd/onenand_regs.h>

+#ifdef CONFIG_S5PC1XX
+#define AHB_ADDR                       0xB0000000
+#define MEM_ADDR(fba, fpa, fsa)                (((fba) << 13 | (fpa) << 7 | \
+                                       (fsa) << 5) & 0x3ffffff)
+#define CMD_MAP_01(mem_addr)           (AHB_ADDR | (1 << 26) | (mem_addr))
+#define CMD_MAP_11(addr)               (AHB_ADDR | (3 << 26) | ((addr) << 2))
+
+#define onenand_readw(a)               (readl(CMD_MAP_11((a) >> 1)) & 0xffff)
+#else  /* CONFIG_S5PC1XX */
 #define onenand_readw(a)        readw(THIS_ONENAND(a))
+#endif /* CONFIG_S5PC1XX */
+
 #define onenand_writew(v, a)    writew(v, THIS_ONENAND(a))

 #define THIS_ONENAND(a)         (CONFIG_SYS_ONENAND_BASE + (a))
diff --git a/onenand_ipl/onenand_read.c b/onenand_ipl/onenand_read.c
index d1a842d..df2740b 100644
--- a/onenand_ipl/onenand_read.c
+++ b/onenand_ipl/onenand_read.c
@@ -37,10 +37,24 @@
 extern void *memcpy32(void *dest, void *src, int size);
 #endif

+
+
 /* read a page with ECC */
 static inline int onenand_read_page(ulong block, ulong page,
                                u_char * buf, int pagesize)
 {
+#ifdef CONFIG_S5PC1XX
+       unsigned int *p = (unsigned int *) buf;
+       int mem_addr, i;
+
+       mem_addr = MEM_ADDR(block, page, 0);
+
+       pagesize >>= 2;
+
+       for (i = 0; i < pagesize; i++)
+               *p++ = *(volatile unsigned int *)(CMD_MAP_01(mem_addr));
+#else  /* CONFIG_S5PC1XX */
+
        unsigned long *base;

 #ifndef __HAVE_ARCH_MEMCPY32
@@ -85,6 +99,7 @@ static inline int onenand_read_page(ulong block, ulong page,
                *p++ = value;
        }
 #endif
+#endif /* CONFIG_S5PC1XX */

        return 0;
 }
@@ -114,6 +129,9 @@ int onenand_read_block(unsigned char *buf)

        erasesize = ONENAND_PAGES_PER_BLOCK * pagesize;
        nblocks = (CONFIG_SYS_MONITOR_LEN + erasesize - 1) >> erase_shift;
+#ifdef CONFIG_S5PC1XX
+       nblocks = 1;
+#endif

        /* NOTE: you must read page from page 1 of block 0 */
        /* read the block page by page*/
-- 
1.5.6.3
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to