目前我们基于TI 的AM3352 系列在VxWorks系统上开发NAND driver。所以整个driver都需要我们开发人员自己实现。这款NAND的参数如下:
pagesize:4096,sparesize:256.
目前ELM纠错不能工作。我有以下问题:
在使用ELM 实现16bit纠错的时候,往ELM_SYNDROME_FRAGMENT 寄存器里写入的ECC 结果。这个ECC结果是读完data(4096 byte)区的计算的结果,还是读完data区以后再读取OOB区的数据(4096+256),最后计算的ECC?
Shine:
我的理解是两种情况都可以,在TRM手册上有说明“an optional spare-area data field”。
Each syndrome polynomial gives a status of the read operations for a full block, including 512 bytes of data, parity bits, and an optional spare-area data field, with a maximum block size of 1023 bytes
www.ti.com/…/spruh73p.pdf
user5997019:
回复 Shine:
Hi Shine,
非常感谢你的答复。我再详细描述一下我们这边前面的操作。
我们在写NAND数据的时候,对每个page(4096 bytes)写入的时候,计算了ECC,并且保存在了spare 区域。保存位置也和u-boot下面的位置一致。
已经确认,这个BHC16 ECC 结果计算是OK的。但是,后面我们测试ELM是否工作的时候,人为将4096 byte的data 区里面的某个byte改变以后,再将先前保存在spare区域的ECC 结果输入到ELM 对应的fragment寄存器里,使能硬件检错。最后读取到的结果是error bit 太多,无法纠错。实际上,error bit 不超过8bit。
所以,我想确认,这个ECC结果到底是先前write page存放在spare 区域的,还是这次读取完page数据,再读取OOB数据,重新生产ECC?
Shine:
回复 user5997019:
这个ECC结果是GPMC在读flash page的时候产生的,ELM直接检测这个ECC结果。
The general-purpose memory controller (GPMC) probes data read from an external NAND flash and uses this to compute checksum-like information, called syndrome polynomials, on a per-block basis. Each syndrome polynomial gives a status of the read operations for a full block, including 512 bytes of data, parity bits, and an optional spare-area data field, with a maximum block size of 1023 bytes. Computation
is based on a Bose-ChaudhurI-Hocquenghem (BCH) algorithm. The error-location module (ELM) extracts error addresses from these syndrome polynomials.
The ELM is intended to be used in conjunction with the GPMC. Syndrome polynomials generated on-the fly when reading a NAND Flash page and stored in GPMC registers are passed to the ELM module. The MPU can then easily correct the data block by flipping the bits pointed to by the ELM error locations outputs.