Yaffs2的ecc校验

S3C2440的一个板子上移植内核2.6.14和yaffs2文件系统,但ecc校验总是设置不对,总是警告未使用ecc校验,内核配置如下

Device Drivers --->
Memory Technology Devices (MTD) --->
   NAND Flash Device Drivers --->

·  NAND Device Support

[ ] Verify NAND page writes

·  NAND Flash support for S3C2410/S3C2440 SoC

·  S3C2410 NAND driver debug

[ ] S3C2410 NAND Hardware ECC

File systems --->
    Miscellaneous filesystems --->

·  YAFFS2 file system support

 --- 512 byte / page devices

·  Lets Yaffs do its own ECC

·  Use the same ecc byte order as Steven Hill's nand_ecc.c

 --- 2048 byte (or larger) / page devices 

·  Autoselect yaffs2 format 

·  Disable lazy loading 

·  Turn off wide tnodes 

·  Turn off debug chunk erase check 

·  Cache short names in RAM

 

drivers/mtd/nand/s3c2410.c中使用chip->eccmode = NAND_ECC_SOFT;

kernel启动没有出现警告,通过nfs启动后,安装文件系统

mount -t yaffs /dev/mtdblock/3 /mnt
cd mnt
tar xvzf /fa-yaffs-v5.tgz

然后就出现如下警告
./
Reading data from NAND FLASH without ECC is not recommended
Writing data without ECC to NAND-FLASH is not recommended
Writing data without ECC to NAND-FLASH is not recommended
Writing data without ECC to NAND-FLASH is not recommended
./bin/
Writing data without ECC to NAND-FLASH is not recommended
Writing data without ECC to NAND-FLASH is not recommended
……………………………………………………………………
省略几千行

 

耐心等文件系统解压完后,使用/dev/mtdblock/3能正常启动,但只要读/写文件系统内容就会出现上述的警告,看着真是不爽。

上网查看说去掉这种警告有两种方法

1.  去掉警告信息(~掩耳盗铃@_@)

2.  使用MTDecc校验,而不使用yaffs2ecc校验(不知道到底为什么)

在内核选项中去掉Lets Yaffs do its own ECC这个选项,果然成功了。

察看yaffs2源码

yaffs_mtdif.c有如下内容:

if (data && spare) {

        if (dev->useNANDECC) {  /* 配置了Lets Yaffs do its own ECC选项 */

            retval =

                mtd->read_ecc(mtd, addr, dev->nBytesPerChunk,

                      &dummy, data, spareAsBytes,

                      &yaffs_oobinfo);

        } else {

            retval =

                mtd->read_ecc(mtd, addr, dev->nBytesPerChunk,

                      &dummy, data, spareAsBytes,

                      &yaffs_noeccinfo);

        }

mtd关于nand的驱动中nand_base.c有如下内容:

static int nand_read_ecc (struct mtd_info *mtd, loff_t from, size_t len,

              size_t * retlen, u_char * buf, u_char * oob_buf, struct nand_oobinfo *oobsel)

{

    /* use userspace supplied oobinfo, if zero */

    if (oobsel == NULL) /* 当使用yaffs_noeccinfo时,条件语句为真 */

        oobsel = &mtd->oobinfo;

    return nand_do_read_ecc(mtd, from, len, retlen, buf, oob_buf, oobsel, 0xff);

}

nand_do_read_ecc函数中有

eccmode = oobsel->useecc ? this->eccmode : NAND_ECC_NONE;

 

在使用yaffs2的ecc校验时在这句就把eccmode赋值为NAND_ECC_NONE(要不就不会出现警告),也就是说oobsel->useecc的值为0,真不知道对不对,使用yaffs2自己的ecc校验时怎么会把这个选项置为0呢?但是从实验看这个猜测应该是对的!

 

真不知道yaffs2的ECC校验和MTD的ECC校验之间到底是个什么样的关系!不知道大家有什么意见!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值