Nand flash ecc校验

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

你可能感兴趣的:(Nand flash ecc校验)