From 128ed4f901f7fe3ecd0c0ecf35737569b4b8c92a Mon Sep 17 00:00:00 2001 From: Manikandan Pillai Date: Tue, 2 Sep 2008 09:26:09 +0530 Subject: [PATCH] Changes for NAND to be in sync with Beagle. Signed-off-by: Manikandan Pillai --- common/cmd_nand.c | 9 ++++++--- include/configs/omap3_evm.h | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/common/cmd_nand.c b/common/cmd_nand.c index af3eb9b..9ae434f 100644 --- a/common/cmd_nand.c +++ b/common/cmd_nand.c @@ -38,7 +38,8 @@ int find_dev_and_part(const char *id, struct mtd_device **dev, u8 *part_num, struct part_info **part); #endif -#if defined(CONFIG_OMAP) && (defined(CONFIG_OMAP3_BEAGLE)) +#if defined(CONFIG_OMAP) && (defined(CONFIG_OMAP3_BEAGLE)\ + || defined(CONFIG_OMAP3_EVM)) extern void omap_nand_switch_ecc(nand_info_t *nand, int hardware); #endif @@ -322,7 +323,8 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) } -#if defined(CONFIG_OMAP) && (defined(CONFIG_OMAP3_BEAGLE)) +#if defined(CONFIG_OMAP) && (defined(CONFIG_OMAP3_BEAGLE) \ + || defined(CONFIG_OMAP3_EVM)) if (strncmp(cmd, "ecc", 3) == 0) { if (argc < 2) goto usage; @@ -503,7 +505,8 @@ U_BOOT_CMD(nand, 5, 1, do_nand, "nand scrub - really clean NAND erasing bad blocks (UNSAFE)\n" "nand markbad off - mark bad block at offset (UNSAFE)\n" "nand biterr off - make a bit error at offset (UNSAFE)\n" -#if defined(CONFIG_OMAP) && (defined(CONFIG_OMAP3_BEAGLE)) +#if defined(CONFIG_OMAP) && (defined(CONFIG_OMAP3_BEAGLE) \ + || defined(CONFIG_OMAP3_EVM)) "nand ecc [hw/sw] - switch the ecc calculation algorithm \n" #endif "nand lock [tight] [status]\n" diff --git a/include/configs/omap3_evm.h b/include/configs/omap3_evm.h index 5b5a249..0abfbed 100644 --- a/include/configs/omap3_evm.h +++ b/include/configs/omap3_evm.h @@ -42,6 +42,7 @@ #define CONFIG_OMAP 1 /* in a TI OMAP core */ #define CONFIG_OMAP34XX 1 /* which is a 34XX */ #define CONFIG_OMAP3430 1 /* which is in a 3430 */ +#define CONFIG_OMAP3_EVM 1 /* working with EVM */ #define CONFIG_DOS_PARTITION 1 #include /* get chip and board defs */ -- 1.5.6 From 237ab969db284235b1390919e768493378e08706 Mon Sep 17 00:00:00 2001 From: Manikandan Pillai Date: Tue, 2 Sep 2008 10:57:18 +0530 Subject: [PATCH] Changing promps for OneNAND. Signed-off-by: Manikandan Pillai --- common/cmd_onenand.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/cmd_onenand.c b/common/cmd_onenand.c index 3285707..38797f5 100644 --- a/common/cmd_onenand.c +++ b/common/cmd_onenand.c @@ -218,11 +218,11 @@ U_BOOT_CMD( " ---ofs and len(not for oob) have to be page aligned\n" "onenand write addr ofs len - write data at ofs with len from addr\n" " ---ofs and len have to be page aligned\n" - "onenand erase saddr eaddr - erase block start addr to end addr\n" + "onenand erase sofs eofs - erase block start ofs to end ofs\n" "onenand erase block sblk-endblk - erase blocks sblk to endblk\n" " ---erase command does not erase bad blocks\n" "onenand scrub block start-end - erase block from start to end\n" - "onenand scrub saddr eaddr - erase blocks start addr to end addr\n" + "onenand scrub sofs eofs - erase blocks start ofs to end ofs\n" " ---CAUTION :scrub command erases bad blocks also\n" "onenand block[.oob] addr block [page] [len]\n" " ---read data with (block [, page]) to addr\n" -- 1.5.6 From 88176a4a1ae9ba93bc91e05234e08f426c789702 Mon Sep 17 00:00:00 2001 From: Manikandan Pillai Date: Fri, 5 Sep 2008 14:13:35 +0530 Subject: [PATCH] Fix for hw mode(NAND) - for uploading x-loader from U-boot. Signed-off-by: Manikandan Pillai --- cpu/omap3/nand.c | 2 +- drivers/mtd/nand/nand_base.c | 143 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 143 insertions(+), 2 deletions(-) diff --git a/cpu/omap3/nand.c b/cpu/omap3/nand.c index d140ae0..149ca12 100644 --- a/cpu/omap3/nand.c +++ b/cpu/omap3/nand.c @@ -313,9 +313,9 @@ void omap_nand_switch_ecc(struct mtd_info *mtd, int hardware) nand->ecc.hwctl = omap_enable_hwecc; nand->ecc.correct = omap_correct_data; nand->ecc.calculate = omap_calculate_ecc; - omap_hwecc_init(nand); } + nand_switch_ecc(mtd); if (nand->options & NAND_BUSWIDTH_16) { mtd->oobavail = mtd->oobsize - (nand->ecc.layout->eccbytes + 2); diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c index 0913bb8..7fcd79e 100644 --- a/drivers/mtd/nand/nand_base.c +++ b/drivers/mtd/nand/nand_base.c @@ -1578,7 +1578,6 @@ static void nand_write_page_hwecc(struct mtd_info *mtd, struct nand_chip *chip, for (i = 0; i < chip->ecc.total; i++) chip->oob_poi[eccpos[i]] = ecc_calc[i]; - chip->write_buf(mtd, chip->oob_poi, mtd->oobsize); } @@ -2730,6 +2729,148 @@ int nand_scan_tail(struct mtd_info *mtd) return 0; } +int nand_switch_ecc(struct mtd_info *mtd) +{ + int i; + struct nand_chip *chip = mtd->priv; + + if (!chip->buffers) + return -ENOMEM; + + switch (chip->ecc.mode) { + case NAND_ECC_HW: + /* Use standard hwecc read page function ? */ + chip->ecc.read_page = nand_read_page_hwecc; + chip->ecc.write_page = nand_write_page_hwecc; + chip->ecc.read_oob = nand_read_oob_std; + chip->ecc.write_oob = nand_write_oob_std; + break; + case NAND_ECC_HW_SYNDROME: + if ((!chip->ecc.calculate || !chip->ecc.correct || + !chip->ecc.hwctl) && + (!chip->ecc.read_page || + chip->ecc.read_page == nand_read_page_hwecc || + !chip->ecc.write_page || + chip->ecc.write_page == nand_write_page_hwecc)) { + printk(KERN_WARNING "No ECC functions supplied, " + "Hardware ECC not possible\n"); + BUG(); + } + /* Use standard syndrome read/write page function ? */ + chip->ecc.read_page = nand_read_page_syndrome; + chip->ecc.write_page = nand_write_page_syndrome; + chip->ecc.read_oob = nand_read_oob_syndrome; + chip->ecc.write_oob = nand_write_oob_syndrome; + + if (mtd->writesize >= chip->ecc.size) + break; + printk(KERN_WARNING "%d byte HW ECC not possible on " + "%d byte page size, fallback to SW ECC\n", + chip->ecc.size, mtd->writesize); + chip->ecc.mode = NAND_ECC_SOFT; + break; + case NAND_ECC_SOFT: + chip->ecc.calculate = nand_calculate_ecc; + chip->ecc.correct = nand_correct_data; + chip->ecc.read_page = nand_read_page_swecc; + chip->ecc.write_page = nand_write_page_swecc; + chip->ecc.read_oob = nand_read_oob_std; + chip->ecc.write_oob = nand_write_oob_std; + chip->ecc.size = 256; + chip->ecc.bytes = 3; + break; + + case NAND_ECC_NONE: + printk(KERN_WARNING "NAND_ECC_NONE selected by board driver. " + "This is not recommended !!\n"); + chip->ecc.read_page = nand_read_page_raw; + chip->ecc.write_page = nand_write_page_raw; + chip->ecc.read_oob = nand_read_oob_std; + chip->ecc.write_oob = nand_write_oob_std; + chip->ecc.size = mtd->writesize; + chip->ecc.bytes = 0; + break; + + default: + printk(KERN_WARNING "Invalid NAND_ECC_MODE %d\n", + chip->ecc.mode); + BUG(); + } + /* + * The number of bytes available for a client to place data into + * the out of band area + */ + chip->ecc.layout->oobavail = 0; + for (i = 0; chip->ecc.layout->oobfree[i].length; i++) + chip->ecc.layout->oobavail += + chip->ecc.layout->oobfree[i].length; + mtd->oobavail = chip->ecc.layout->oobavail; + + /* + * Set the number of read / write steps for one page depending on ECC + * mode + */ + chip->ecc.steps = mtd->writesize / chip->ecc.size; + if (chip->ecc.steps * chip->ecc.size != mtd->writesize) { + printk(KERN_WARNING "Invalid ecc parameters\n"); + BUG(); + } + chip->ecc.total = chip->ecc.steps * chip->ecc.bytes; + + /* + * Allow subpage writes up to ecc.steps. Not possible for MLC + * FLASH. + */ + if (!(chip->options & NAND_NO_SUBPAGE_WRITE) && + !(chip->cellinfo & NAND_CI_CELLTYPE_MSK)) { + switch (chip->ecc.steps) { + case 2: + mtd->subpage_sft = 1; + break; + case 4: + case 8: + mtd->subpage_sft = 2; + break; + } + } + chip->subpagesize = mtd->writesize >> mtd->subpage_sft; + + /* Initialize state */ + chip->state = FL_READY; + + /* De-select the device */ + chip->select_chip(mtd, -1); + + /* Invalidate the pagebuffer reference */ + chip->pagebuf = -1; + + /* Fill in remaining MTD driver data */ + mtd->type = MTD_NANDFLASH; + mtd->flags = MTD_CAP_NANDFLASH; + mtd->erase = nand_erase; + mtd->point = NULL; + mtd->unpoint = NULL; + mtd->read = nand_read; + mtd->write = nand_write; + mtd->read_oob = nand_read_oob; + mtd->write_oob = nand_write_oob; + mtd->sync = nand_sync; + mtd->lock = NULL; + mtd->unlock = NULL; + mtd->suspend = nand_suspend; + mtd->resume = nand_resume; + mtd->block_isbad = nand_block_isbad; + mtd->block_markbad = nand_block_markbad; + + /* propagate ecc.layout to mtd_info */ + mtd->ecclayout = chip->ecc.layout; + + /* Check, if we should skip the bad block table scan */ + if (chip->options & NAND_SKIP_BBTSCAN) + chip->options |= NAND_BBT_SCANNED; + +} + /* module_text_address() isn't exported, and it's mostly a pointless test if this is a module _anyway_ -- they'd have to try _really_ hard to call us from in-kernel code if the core NAND support is modular. */ -- 1.5.6