在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. 使用MTD的ecc校验,而不使用yaffs2的ecc校验(不知道到底为什么)。
在内核选项中去掉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校验之间到底是个什么样的关系!不知道大家有什么意见!