你好:
Linux kernel:linux-2.6.37-psp04.00.00.12 Platform: DM8168 & OMAP3530 Nand Flash:Micron & Samsung 512M 文件系统:yaffs2 ECC: 软校验
问题描述:当cpu占用率比较高的时候读写Nand Flash,yaffs2中会打印Block xxx struck out 、 Block xxx retired等,这就表示Nand中已经出现了坏块,在读写十几分钟之后就会开始出现坏块,此后坏块的数量持续增加。正常情况下,不可能出现这么多的坏块的。
查找原因:原来是在 read 的时候,进行ecc校验时,出现了错误,导致被标记为坏块。在内核的drivers/mtd/nand/nand_ecc.c文件中的__nand_correct_data函数,ECC校验时检测到single bit error,而且会将该bit进行翻转(bitflip),最后返回给nand_read的值是EUCLEAN,EUCLEAN表示读nand的时候,有一个bit错误。yaffs2就认为此次读nand失败,需要重新再次读取或者标记为坏块。
疑问:ECC软校验不是可以更正一个bit的错误吗?为什么要将返回EUCLEAN的结果也要标记为坏块?我认为当检测到1bit错误并且进行纠正之后应该就表示此次读取成功,不知道内核中为什么要那样处理?还是有可能是yaffs2的问题?
我也怀疑是GPMC的时序配置或者其他配置错误,但是尝试了很多配置之后,依然还是会不断出现EUCLEAN,导致坏块不断增加。如果是时序错误或者配置错误,不应该始终只有1bit错误。
谢谢!