2007年7月31日 星期二

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
兩個區域的「哪個byte中的哪個bit是錯的」,這就是NAND flash Controller提供的hardware ECC 功能。

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 - 沒救 (?)
所以,需要作ECC correct的,只有在 01 的時候。

然後讀出 Error bit 所在的byte位置和bit位置,分別是
  • Byte 位置 bit[17:7], bit[24:21]
  • Bit 位置 bit[6:4], bit[20:18]
所以correction 的動作
 *(ReadBuf + ByteNo) ^= ( 1 << BitNo ) 

SECCD 就是 Spare-area ECC Data
MECCD 就是 Main-area ECC Data

1 則留言:

harlan 提到...

ECC在其他controller會用硬體去model,速度會更快.可是知道錯誤之後,要如何去更正才會是重點.要做搬移的運算等等.請問你有survey過一些方法嗎?
謝謝