Flex-OneNAND booting support (take #2)
Subsystems (2)
PATCH 1/1 Flex-OneNAND booting support (take #2)
Flex-OneNAND booting support
Flex-OneNAND is a monolithic integrated circuit with a NAND Flash array using a NOR Flash interface. This on-chip integration enables system designers to reduce external system logic and use high-density NAND Flash in applications that would otherwise have to use more NOR components.
Flex-OneNAND enables users to configure to partition it into SLC and MLC areas in more flexible way. While MLC area of Flex-OneNAND can be used to store data that require low reliability and high density, SLC area of Flex-OneNAND to store data that need high reliability and high performance. Flex-OneNAND can let users take advantage of storing these two different types of data into one chip, which is making Flex-OneNAND more cost- and space-effective.
---
Makefile +4 -2
@@ -339,10 +339,12 @@ $(U_BOOT_NAND): $(NAND_SPL) $(obj)u-boot.bin $(obj)include/autoconf.mk cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin $(ONENAND_IPL): $(VERSION_FILE) $(obj)include/autoconf.mk - $(MAKE) -C onenand_ipl/board/$(BOARDDIR) all + $(MAKE) -C $(obj)onenand_ipl/board/$(BOARDDIR) all $(U_BOOT_ONENAND): $(ONENAND_IPL) $(obj)u-boot.bin $(obj)include/autoconf.mk + $(MAKE) -C $(obj)onenand_ipl/board/$(BOARDDIR) all cat $(obj)onenand_ipl/onenand-ipl-2k.bin $(obj)u-boot.bin > $(obj)u-boot-onenand.bin + cat $(obj)onenand_ipl/onenand-ipl-4k.bin $(obj)u-boot.bin > $(obj)u-boot-flexonenand.bin $(VERSION_FILE): @( echo -n "#define U_BOOT_VERSION \"U-Boot " ; \
@@ -2873,7 +2875,7 @@ clean: $(obj)board/{integratorap,integratorcp}/u-boot.lds \ $(obj)board/{bf533-ezkit,bf533-stamp,bf537-stamp,bf561-ezkit}/u-boot.lds @rm -f $(obj)include/bmp_logo.h $(obj)nand_spl/{u-boot-spl,u-boot-spl.map} - @rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl-2k.bin,ipl.map} + @rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl-2k.bin,ipl-4k.bin,ipl.map} @rm -f $(obj)api_examples/demo $(VERSION_FILE) @find $(OBJTREE) -type f \ \( -name 'core' -o -name '*.bak' -o -name '*~' \
drivers/mtd/onenand/onenand_base.c +6 -0
@@ -1180,6 +1180,12 @@ static int onenand_probe(struct mtd_info *mtd)if (maf_id != bram_maf_id || dev_id != bram_dev_id)return -ENXIO ; +/* FIXME : Current OneNAND MTD doesn't support Flex-OneNAND */ +if (dev_id & (1 <<9 )) { +printk ("Not yet support Flex-OneNAND\n" ); +return -ENXIO ; + } +/* Flash device information */ onenand_print_device_info (dev_id,0 ); this->device_id = dev_id;
onenand_ipl/board/apollon/Makefile +5 -2
@@ -9,7 +9,7 @@ AFLAGS += -DCONFIG_ONENAND_IPL CFLAGS += -DCONFIG_ONENAND_IPL OBJCLFAGS += --gap-fill=0x00 -SOBJS = start.o low_levelinit.o # _memcpy32.o +SOBJS = start.o low_levelinit.o COBJS = apollon.o onenand_read.o onenand_boot.o SRCS := $(addprefix $(obj),$(SOBJS:.o=.S) $(COBJS:.o=.c))
@@ -19,13 +19,16 @@ LNDIR := $(OBJTREE)/onenand_ipl/board/$(BOARDDIR) onenandobj := $(OBJTREE)/onenand_ipl/ -ALL = $(onenandobj)onenand-ipl $(onenandobj)onenand-ipl.bin $(onenandobj)onenand-ipl-2k.bin +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=0x800 -O binary $< $@ +$(onenandobj)onenand-ipl-4k.bin: $(onenandobj)onenand-ipl + $(OBJCOPY) ${OBJCFLAGS} --pad-to=0x1000 -O binary $< $@ + $(onenandobj)onenand-ipl.bin: $(onenandobj)onenand-ipl $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
onenand_ipl/onenand_boot.c +1 -1
@@ -60,7 +60,7 @@ void start_oneboot(void) buf = (uchar *)CFG_LOAD_ADDR ; -if (!onenand_read_block (buf,ONENAND_START_BLOCK )) +if (!onenand_read_block0 (buf)) buf +=ONENAND_BLOCK_SIZE ;if (buf == (uchar *)CFG_LOAD_ADDR )
onenand_ipl/onenand_ipl.h +1 -2
@@ -23,7 +23,6 @@#include <linux/mtd/onenand_regs.h> -#define ONENAND_START_BLOCK 0#define ONENAND_BLOCK_SIZE 2048#ifndef CFG_PRINTF
@@ -40,5 +39,5 @@#define ONENAND_PAGE_SIZE 2048 -extern int onenand_read_block (unsigned char *buf,ulong block); +extern int onenand_read_block0 (unsigned char *buf);#endif
onenand_ipl/onenand_read.c +19 -10
@@ -33,8 +33,13 @@#define onenand_buffer_address () ((1 << 3) << 8)#define onenand_bufferram_address (block) (0) +#ifdef __HAVE_ARCH_MEMCPY32 +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) +static inline int onenand_read_page (ulong block,ulong page, +u_char * buf,int pagesize) {unsigned long *base;
@@ -46,15 +51,15 @@ static inline int onenand_read_page(ulong block, ulong page, u_char *buf)onenand_writew (onenand_block_address (block),THIS_ONENAND (ONENAND_REG_START_ADDRESS1 )); +onenand_writew (onenand_bufferram_address (block), +THIS_ONENAND (ONENAND_REG_START_ADDRESS2 )); +onenand_writew (onenand_sector_address (page),THIS_ONENAND (ONENAND_REG_START_ADDRESS8 ));onenand_writew (onenand_buffer_address (),THIS_ONENAND (ONENAND_REG_START_BUFFER )); -onenand_writew (onenand_bufferram_address (block), -THIS_ONENAND (ONENAND_REG_START_ADDRESS2 )); -onenand_writew (ONENAND_INT_CLEAR ,THIS_ONENAND (ONENAND_REG_INTERRUPT ));onenand_writew (ONENAND_CMD_READ ,THIS_ONENAND (ONENAND_REG_COMMAND ));
@@ -69,9 +74,9 @@ static inline int onenand_read_page(ulong block, ulong page, u_char *buf)#ifdef __HAVE_ARCH_MEMCPY32/* 32 bytes boundary memory copy */ -memcpy32 (buf, base,ONENAND_PAGE_SIZE ); +memcpy32 (buf, base, pagesize);#else -for (offset =0 ; offset < (ONENAND_PAGE_SIZE >>2 ); offset++) { +for (offset =0 ; offset < (pagesize >>2 ); offset++) { value = *(base + offset); *p++ = value; }
@@ -87,18 +92,22 @@ static inline int onenand_read_page(ulong block, ulong page, u_char *buf)* onenand_read_block - Read a block data to buf * @return 0 on success */ -int onenand_read_block (unsigned char *buf,ulong block) +int onenand_read_block0 (unsigned char *buf) {int page, offset =0 ; +int pagesize =ONENAND_PAGE_SIZE ; + +/* MLC OneNAND has 4KiB page size */ +if (onenand_readw (THIS_ONENAND (ONENAND_REG_TECHNOLOGY ))) + pagesize <<=1 ;/* NOTE: you must read page from page 1 of block 0 */ /* read the block page by page*/ for (page =ONENAND_START_PAGE ; page <ONENAND_PAGES_PER_BLOCK ; page++) { -onenand_read_page (block, page, buf + offset); - - offset +=ONENAND_PAGE_SIZE ; +onenand_read_page (0 , page, buf + offset, pagesize); + offset += pagesize; }return 0 ;
Wolfgang Denk
AppliedPATCH 1/1 Flex-OneNAND booting support (take #2)
Quoted 7 lines · In message <20080316235406.GA27517@party> you wrote:
Flex-OneNAND booting support
Flex-OneNAND is a monolithic integrated circuit with a NAND Flash array using a NOR Flash interface. This on-chip integration enables system designers to reduce external system logic and use high-density NAND Flash in applications that would otherwise have to use more NOR components.
Quoted 8 lines
Flex-OneNAND enables users to configure to partition it into SLC and MLC areas in more flexible way. While MLC area of Flex-OneNAND can be used to store data that require low reliability and high density, SLC area of Flex-OneNAND to store data that need high reliability and high performance. Flex-OneNAND can let users take advantage of storing these two different types of data into one chip, which is making Flex-OneNAND more cost- and space-effective.
Signed-off-by Kyungmin Park <[email protected]>
Applied, thanks.
Best regards,
Wolfgang Denk
Signature · 7 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies and the other is to make it so complicated that there are no obvious defi- ciencies. - Charles Anthony Richard Hoare