分类: LINUX
2010-07-22 17:19:35
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():
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, 就没有问题了,不知道哪个高手,可以给我指点指点这个是问什么?