转载地址:https://blog.csdn.net/taot2009/article/details/79660469
https://blog.csdn.net/hurry_liu/article/details/8741565 ---这篇文章(文章1)讲的很详细。
http://www.xuebuyuan.com/zh-hant/916448.html ----这篇文章(文章2)也讲的差不多。
文章1和文章2的描述是一样的,只是代码内容不一样。
一开始我是看到了文章1,按照那个代码来修改自己的代码,结果还是不成功,总是在读取的时候出现如下错误。
S3C NAND: ECC uncorrectable errordetected. Not correctable.
NAND read from offset 0 failed -74
后来看了s3c2440芯片资料,https://download.csdn.net/download/zengsongbin/2354802, 其中第6章,按照文章1的描述,对应了解了NFMECCD0, NFESTAT0, NFMECC0 这几个寄存器的功能。
1,在写入和读出数据完成时,如果没有锁定NFMECC0寄存器将会更新,为写入或读出的数据的ecc code。
2,写入数据时,只需要读出,NFMECC0,然后存放到spare区。
3,读出数据时,需要将第2步存放到spare区的ecc code读取出来,然后写入NFMECCD0。
在做第3步时,
3.1 NFMECC0中的值是读取之后,计算的读出数据的ecc code。
3.2 nand controller会将写入NFMECCD0的值,与NFMECC0中的值进行比较来计算校验结果,并将结果存入NFESTAT0。
发现关键的操作就在于读取NFMECC0的值,如果读取正确了,校验流程应该是没有问题了。
对比文章1和文章2,在函数中s3c2440_nand_calculate_ecc中,读取NFMECC0方式不一样。
改用文章2的方式,就可以正确读取nand数据了。