diff options
author | Wolfgang Denk <wd@denx.de> | 2009-09-30 23:34:36 +0200 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2009-09-30 23:34:36 +0200 |
commit | 7529b4445bc4525765b003d3269bcf37fc33fac5 (patch) | |
tree | d05724960f20d8e369945d68283b60d81cdca486 | |
parent | 9e2032aa56a722af8959cd214cc1e54d59b2ba64 (diff) | |
parent | d44e9c1736283f0abc5d3c5d28cfea8480c93a79 (diff) |
Merge branch 'master' of git://git.denx.de/u-boot-nand-flash
-rw-r--r-- | Makefile | 9 | ||||
-rw-r--r-- | board/micronas/vct/ebi_onenand.c | 1 | ||||
-rw-r--r-- | drivers/mtd/nand/davinci_nand.c | 3 | ||||
-rw-r--r-- | onenand_ipl/onenand_boot.c | 1 | ||||
-rw-r--r-- | onenand_ipl/onenand_ipl.h | 5 | ||||
-rw-r--r-- | onenand_ipl/onenand_read.c | 46 |
6 files changed, 42 insertions, 23 deletions
@@ -285,6 +285,7 @@ endif ifeq ($(CONFIG_ONENAND_U_BOOT),y) ONENAND_IPL = onenand_ipl U_BOOT_ONENAND = $(obj)u-boot-onenand.bin +ONENAND_BIN ?= $(obj)onenand_ipl/onenand-ipl-2k.bin endif __OBJS := $(subst $(obj),,$(OBJS)) @@ -378,8 +379,7 @@ $(ONENAND_IPL): $(TIMESTAMP_FILE) $(VERSION_FILE) $(obj)include/autoconf.mk $(MAKE) -C onenand_ipl/board/$(BOARDDIR) all $(U_BOOT_ONENAND): $(ONENAND_IPL) $(obj)u-boot.bin - 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 + cat $(ONENAND_BIN) $(obj)u-boot.bin > $(obj)u-boot-onenand.bin $(VERSION_FILE): @( printf '#define U_BOOT_VERSION "U-Boot %s%s"\n' "$(U_BOOT_VERSION)" \ @@ -3210,8 +3210,6 @@ zylonite_config : ######################################################################### apollon_config : unconfig - @mkdir -p $(obj)include - @mkdir -p $(obj)onenand_ipl/board/apollon @echo "#define CONFIG_ONENAND_U_BOOT" > $(obj)include/config.h @$(MKCONFIG) $(@:_config=) arm arm1136 apollon NULL omap24xx @echo "CONFIG_ONENAND_U_BOOT = y" >> $(obj)include/config.mk @@ -3693,7 +3691,8 @@ clean: $(obj)cpu/blackfin/bootrom-asm-offsets.[chs] @rm -f $(obj)include/bmp_logo.h @rm -f $(obj)nand_spl/{u-boot.lds,u-boot-spl,u-boot-spl.map,System.map} - @rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl-2k.bin,ipl-4k.bin,ipl.map} + @rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl.map} + @rm -f $(ONENAND_BIN) @rm -f $(obj)onenand_ipl/u-boot.lds @rm -f $(TIMESTAMP_FILE) $(VERSION_FILE) @find $(OBJTREE) -type f \ diff --git a/board/micronas/vct/ebi_onenand.c b/board/micronas/vct/ebi_onenand.c index 522b88f8ea1..1e8afa6f57d 100644 --- a/board/micronas/vct/ebi_onenand.c +++ b/board/micronas/vct/ebi_onenand.c @@ -193,6 +193,5 @@ void onenand_board_init(struct mtd_info *mtd) chip->write_word = ebi_nand_write_word; chip->read_bufferram = ebi_read_bufferram; - chip->read_spareram = ebi_read_bufferram; chip->write_bufferram = ebi_write_bufferram; } diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c index 37d8b7312cf..eabaf3e773f 100644 --- a/drivers/mtd/nand/davinci_nand.c +++ b/drivers/mtd/nand/davinci_nand.c @@ -202,7 +202,6 @@ static struct nand_ecclayout nand_davinci_4bit_layout_oobfirst = { }, #endif }; -#endif static void nand_davinci_4bit_enable_hwecc(struct mtd_info *mtd, int mode) { @@ -289,7 +288,6 @@ static int nand_davinci_4bit_calculate_ecc(struct mtd_info *mtd, static int nand_davinci_4bit_correct_data(struct mtd_info *mtd, uint8_t *dat, uint8_t *read_ecc, uint8_t *calc_ecc) { - struct nand_chip *this = mtd->priv; unsigned short ecc_10bit[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; int i; unsigned int hw_4ecc[4] = { 0, 0, 0, 0 }, iserror = 0; @@ -441,6 +439,7 @@ static int nand_davinci_4bit_correct_data(struct mtd_info *mtd, uint8_t *dat, return numerrors; } +#endif /* CONFIG_SYS_NAND_4BIT_HW_ECC_OOBFIRST */ static int nand_davinci_dev_ready(struct mtd_info *mtd) { diff --git a/onenand_ipl/onenand_boot.c b/onenand_ipl/onenand_boot.c index 63995ce504e..22baebb314c 100644 --- a/onenand_ipl/onenand_boot.c +++ b/onenand_ipl/onenand_boot.c @@ -24,7 +24,6 @@ */ #include <common.h> -#include <version.h> #include "onenand_ipl.h" diff --git a/onenand_ipl/onenand_ipl.h b/onenand_ipl/onenand_ipl.h index 412572a08dc..7ebb3e32ddb 100644 --- a/onenand_ipl/onenand_ipl.h +++ b/onenand_ipl/onenand_ipl.h @@ -28,8 +28,9 @@ #define THIS_ONENAND(a) (CONFIG_SYS_ONENAND_BASE + (a)) -#define READ_INTERRUPT() \ - onenand_readw(THIS_ONENAND(ONENAND_REG_INTERRUPT)) +#define READ_INTERRUPT() onenand_readw(ONENAND_REG_INTERRUPT) +extern int (*onenand_read_page)(ulong block, ulong page, + u_char *buf, int pagesize); extern int onenand_read_block(unsigned char *buf); #endif diff --git a/onenand_ipl/onenand_read.c b/onenand_ipl/onenand_read.c index d1a842dd67d..8d0df81af63 100644 --- a/onenand_ipl/onenand_read.c +++ b/onenand_ipl/onenand_read.c @@ -1,5 +1,5 @@ /* - * (C) Copyright 2005-2008 Samsung Electronis + * (C) Copyright 2005-2009 Samsung Electronics * Kyungmin Park <kyungmin.park@samsung.com> * * See file CREDITS for list of people who contributed to this @@ -37,8 +37,10 @@ extern void *memcpy32(void *dest, void *src, int size); #endif +int (*onenand_read_page)(ulong block, ulong page, u_char *buf, int pagesize); + /* read a page with ECC */ -static inline int onenand_read_page(ulong block, ulong page, +static int generic_onenand_read_page(ulong block, ulong page, u_char * buf, int pagesize) { unsigned long *base; @@ -89,9 +91,25 @@ static inline int onenand_read_page(ulong block, ulong page, return 0; } -#define ONENAND_START_PAGE 1 +#ifndef CONFIG_ONENAND_START_PAGE +#define CONFIG_ONENAND_START_PAGE 1 +#endif #define ONENAND_PAGES_PER_BLOCK 64 +static void onenand_generic_init(int *page_is_4KiB, int *page) +{ + int dev_id, density; + + if (onenand_readw(ONENAND_REG_TECHNOLOGY)) + *page_is_4KiB = 1; + dev_id = onenand_readw(ONENAND_REG_DEVICE_ID); + density = dev_id >> ONENAND_DEVICE_DENSITY_SHIFT; + density &= ONENAND_DEVICE_DENSITY_MASK; + if (density >= ONENAND_DEVICE_DENSITY_4Gb && + !(dev_id & ONENAND_DEVICE_IS_DDP)) + *page_is_4KiB = 1; +} + /** * onenand_read_block - Read CONFIG_SYS_MONITOR_LEN from begining * of OneNAND, skipping bad blocks @@ -99,24 +117,28 @@ static inline int onenand_read_page(ulong block, ulong page, */ int onenand_read_block(unsigned char *buf) { - int block; - int page = ONENAND_START_PAGE, offset = 0; - int pagesize = 0, erase_shift = 0; - int erasesize = 0, nblocks = 0; + int block, nblocks; + int page = CONFIG_ONENAND_START_PAGE, offset = 0; + int pagesize, erasesize, erase_shift; + int page_is_4KiB = 0; + + onenand_read_page = generic_onenand_read_page; + + onenand_generic_init(&page_is_4KiB, &page); - if (onenand_readw(ONENAND_REG_TECHNOLOGY)) { - pagesize = 4096; /* MLC OneNAND has 4KiB pagesize */ + if (page_is_4KiB) { + pagesize = 4096; /* OneNAND has 4KiB pagesize */ erase_shift = 18; } else { - pagesize = 2048; + pagesize = 2048; /* OneNAND has 2KiB pagesize */ erase_shift = 17; } - erasesize = ONENAND_PAGES_PER_BLOCK * pagesize; + erasesize = (1 << erase_shift); nblocks = (CONFIG_SYS_MONITOR_LEN + erasesize - 1) >> erase_shift; /* NOTE: you must read page from page 1 of block 0 */ - /* read the block page by page*/ + /* read the block page by page */ for (block = 0; block < nblocks; block++) { for (; page < ONENAND_PAGES_PER_BLOCK; page++) { if (onenand_read_page(block, page, buf + offset, |