通过一个星期的努力,终于打2440的HARDWARE ECC调通了!!这篇文章记录一些开发过程中遇到的问题。
ECC校验码可以由硬件产生也可以由软件产生,可以通过内核配置ECC的校验码由Nand flash controller产生还是由软件产生。
HWECC和Bootloader是相关联的。我的Bootloader是Uboot来引导的,而Uboot和Kernel以FS都是放在Nand Flash上的,Nand Flash是64M 的(1Block=16KByte=32Page,1Page =512 +16Byte),当用Uboot写Kernel和FS到NAND Flash时,每写256BYTE HWECC就会产生3Byte OOB,所以每写1页就有6Byte OOB。也可以通过设置每写1页时才去读 NFMECC0。所以每写完一页就要将读回来的6Byte OOB写到512Byte之后相应的位置(不同的位置含义是不同的??好像一般的是第5Byte就是Bad block标志,不太清楚),即后16Byte。8到15没用到,写入FF.
在配置内核时,如在内核选中S3C2410 Nand Hardware ECC,启动时内核时会返回一系列如
mtd->read(0x400 bytes from 0x0) returned ECC error 的信息。
这主要是硬件产生的ECC和你读回来的ECC不同所产生的。查了一下S3C2410.C,原来
chip->ecc.size=512;
所以每读512Byte才去读NFMECC0这个寄存器,因为Uboot是每写256Byte就去读NFMECC0的,故两者读回来的ECC不同.可以通过修改UBoot或ecc.size.当读后256Byte时应该注意OOB的位置必须和UBoot的OOB相匹配,否则还是会Return ECC error.
调试时把相关的信息都打印出来
阅读(3467) | 评论(2) | 转发(0) |