SLC ECC Correction in S3C2440
S3C24xx都內建有NAND Flash Controller,而且都支援NAND Flash Boot。NAND Flash 和NOR Flash 相比,除了不能用linear addressing的方式來access外,就是NAND Flash有「允許bit error」的特性,所以在實際的使用上,就要配合ECC 來correct。
NAND Flash Controller中NFECCSAT0就NFESTAT0 (0x4E000024) ,用來表示以下:
- Main Area
- Spare Area
S3C2440只支援SLC,因為只有內建1 bite ECC,也就是說只能correct 1 bit的錯誤。S3C2443則內建4 bit的ECC,最多可以correct到4 bit的錯誤,所以可以support MLC。
SLC和MLC除了1 time programming的限制外,就是容易產生的Error bit 數。
- SLC保證 99.9999% 的chip 只會產生最多 1 bit的error。
- MLC要到99.9999%的程度,會有 4 bit error。
回到NFESTAT0,要correct bit error,首先要check一下 error的狀態,以bit[1.0],[3.2] 分別代表兩個區域的error狀態:
- 00 : No Error - Lucky
- 01 : 1 bit error - Correct 回來
- 10 : Multiple error - 沒救了
- 11 : ECC area error - 沒救 (?)
然後讀出 Error bit 所在的byte位置和bit位置,分別是
- Byte 位置 bit[17:7], bit[24:21]
- Bit 位置 bit[6:4], bit[20:18]
*(ReadBuf + ByteNo) ^= ( 1 << BitNo )
SECCD 就是 Spare-area ECC Data
MECCD 就是 Main-area ECC Data