[U-Boot] [PATCH 6/6] S5PC100: Add onenand_ipl for SMDKC100 support
HeungJun Kim
riverful.kim at gmail.com
Thu Jun 25 10:21:45 CEST 2009
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.kim at 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.kang at 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.park at 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
More information about the U-Boot
mailing list