Chinaunix首页 | 论坛 | 博客
  • 博客访问: 455529
  • 博文数量: 724
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

2008-10-13 16:57:29

Yaffs2的ecc校验

 

S3C2410的一个板子上移植内核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校验之间到底是个什么样的关系!不知道大家有什么意见!

 


--------------------next---------------------

阅读(205) | 评论(0) | 转发(0) |
0

上一篇:2007年2月10日

下一篇:Yaffs2的ecc校验

给主人留下些什么吧!~~