您的位置:首页 > 其它

Nand flash ecc校验

2015-11-03 15:36 302 查看
linux
ecc校验

uboot和kernel的ecc计算方法有点不一样的,但是计算结果是一样的,但是至于为什么默认的kernel跑步起来,现在我没有看,将来有机会再研究:

首先需要将kernel的校验方式改为相同,在drivers/mtd/nand/s3c2410.c中:s3c2410_nand_init_chip(), 最后的位置, 改为:chip->ecc.mode = NAND_ECC_SOFT;

kernel读取函数调用过程:mtd->read = nand_read; ==> nand_do_read_ops():
1075 /* dancy note :
1076 * func ecc.read_subpage is have some error.
1077 * check ecc fail.
1078 */
1079 /* Now read the page into the buffer */
1080 if (unlikely(ops->mode == MTD_OOB_RAW))
1081 ret = chip->ecc.read_page_raw(mtd, chip, bufpoi);
1082 // else if (!aligned && NAND_SUBPAGE_READ(chip) && !oob)
1083 // ret = chip->ecc.read_subpage(mtd, chip, col, bytes, bufpoi);//nand_read_subpage 
1084 else
1085 ret = chip->ecc.read_page(mtd, chip, bufpoi);
1086 if (ret < 0)
1087 break;

1082和1083行注释掉, 使用read_page读取flash。

check ecc不过的就是这个函数:nand_read_subpage. 

在linux2.6.29内核以后nand_read_subpage也没有什么问题了。。

因nand_read_subpage引起的问题:

uncorrectable error : <3>end_request: I/O error, dev mtdblock2, sector 0

yaffs: dev is 32505858 name is "mtdblock2"

yaffs: passed flags ""

yaffs: Attempting MTD mount on 31.2, "mtdblock2"

yaffs: auto selecting yaffs2

yaffs: restored from checkpoint

yaffs_read_super: isCheckpointed 1

是调用nand_read_subpage接口读取OOB时,读取时只读取六个字节,即aligned_len=6, 通过printk打印发现这六个字节后面的两三个有问题,不知是不是因为硬件的不稳定引起的,如果将aligned_len+=3,
就没有问题了,不知道哪个高手,可以给我指点指点这个是问什么?
http://blog.chinaunix.net/uid-14833587-id-76514.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: