关于nand flash中的ECC效验的问题---内核、uboot、yaffs的ECC冲突
前两天在对博创up-2410s的arm实验箱做文件系统移植,发现cramfs文件系统的移植,烧写,挂载都很顺利,但是做yaffs文件系统移植,烧写后挂载不上,查了很多资料才注意到nand flash的ECC效验这个问题。
网上有很多这方面的资料,但大多都是相互转载过来,转载过去,对于关键问题都一笔带过,语焉不详。
1.我的情况:
------我用的u-boot是按照网上Tekkaman Ninja大侠《移植U-Boot.1.2.0到博创2410-S(S3C2410A)》来做的,关键是他选择了打开CFG_NAND_LEGACY,沿用老式的nand驱动。按照u-boot自己的方式进行ECC效验。
------kernel是用的博创公司提供的linux-2.6.18-2410,drivers/mtd/nand/s3c2410.c中,我发现关于ECC效验是chip->ecc.mode=NAND_ECC_HW。应该是硬件产生ECC效验码。---网上提到改成NONE,也有人说用不着。
结果:下载u-boot到sdram,再用nand write写到nand flash,同理烧写内核,cramfs,最后发现u-boot引导内核成功,挂载cramfs文件系统也挂在上了。yaffs挂载失败----当然,yaffs本省带ECC效验,其组织模式与cramfs也不同。
2.网上的资料:
------内核采用的是s3c2410硬件产生的ECC效验,新版本的内核也可以选择利用软件效验的方式。
------u-boot老版本是采用的自己的效验方式。现版本也可以选择基于mtd的ECC效验方式。当要使用老版本驱动方式时,打开CFG_NAND_LEGACY宏。
------yaffs文件系统在制作时,已近加入了自己的ECC效验码。
还有什么u-boot与内核ECC效验冲突,导致u-boot不能引导内核,u-boot烧写yaffs时二者ECC效验冲突,导致烧写yaffs失败,内核挂载yaffs时效验码冲突,导致挂载不上文件系统。
3.我的问题
-------内核、u-boot、yaffs的ECC效验码是在什么时期产生的,谁控制生成的,谁控制读取。读取ECC效验时一方面的ECC效验码是nand flash中存储的,另一方面用于对比的ECC码时谁控制生成的,怎么控制。
例如:内核镜像zImage.img中是否含ECC效验码(我想应该是不包含的),u-boot.bin中呢?yaffs文件系统中应该是包含的。
u-boot烧写本身(从SDRAM中到nand flash中)时,应该是用u-boot的ECC 产生机制生成ECC码,烧写内核,文件系统时呢?假如烧写内核时用的u-boot的ECC,而u-boot引导内核时也是与自己产生的ECC码对比效验,怎么网上有内核、uboot的ECC效验冲突一说?
我用u-boot烧写cramfs到nand,由于打开CFG_NAND_LEGACY宏,而内核是硬件产生ECC(由于chip->ecc.mode=NAND_ECC_HW),按照网上的说法二者是不一样的,怎么会没冲突,顺利挂载?
我在cramfs文件系统下读文件,在yaffs文件系统下读写文件,ECC效验有什么不同。
-------内核chip->ecc.mode=NAND_ECC_选择HW.NONE.SOFT,到底有什么区别?u-boot打开CFG_NAND_LEGACY宏,或不打开,对ECC效验有什么影响?mtd ECC到底是怎么回事?
希望对这方面有自己理解的朋友们谈一下自己的理解、看法,更期待有高手、大侠予以点拨。如果是完全从网上摘抄的内容就免了,因为网上资料鱼目混珠,我能力有限难以辨别。