NandFash:Linux MTD 結構體關聯圖 和 Nandflash的一些概念

以前基於linux-3.8.8 MTD框架整理的框圖, 在最新linux-4.20上,仍然使用。
補充下《Linux MTD架構下的nand flash驅動詳解》一文中關於主要結構體的內容,

 Nandflash相關的概念:

1. ECC: Error Checking and Correction

一種用於Nand的差錯檢測和修正算法。有1位、4位和8位,也就是說在512字節的數據中,對於4位-ECC,最多可以糾正4個bit位的錯誤,一般就是翻轉的錯誤!

2. OOB: Out Of Band

可以存放:
    1)壞塊標誌
    2)系統文件的標誌
    3)ecc糾錯碼

 oob分區一般已經由硬件廠商固定了,每512字節的oob大小爲16字節,對於頁大小爲2kB時,就是64字節。   
 oob分區:

struct nand_ecclayout _nand_oob_64 = {
   .eccbytes = 24,   //ecc糾錯需要的空間
   .eccpos = {       //具體存放的位置
      40, 41, 42, 43, 44, 45, 46, 47,
      48, 49, 50, 51, 52, 53, 54, 55,
      56, 57, 58, 59, 60, 61, 62, 63},
   .oobfree = {
      {.offset = 2,   //偏移2位,這2位主要用來存放壞塊標誌,0xff
      .length = 38}} //多餘的部分,可以用來存放系統文件的標誌,如yaffs!
};

下圖是OOB存儲的示例

OOB區域存儲了:
    1)LSN:扇區號,文件系統使用
    2)BI: 壞塊標誌
    3)ECCx:爲512字節的數據區所計算生成的ecc校準碼
    4)S_ECCx:爲3字節的ECCx數據所生成的ecc校準嗎

-------------------------------------------------------------

256 byte/ ECC的生成算法  (512 byte情況類似)

校驗碼生成算法:ECC校驗每次對256字節的數據進行操作,包含列校驗和行校驗。對每個待校驗的Bit位求異或,若結果爲0,則表明含有偶數個1;若結果爲1,則表明含有奇數個1。列校驗規則如表1所示。256字節數據形成256行、8列的矩陣,矩陣每個元素表示一個Bit位。

其中CP0 ~ CP5 爲六個Bit位,表示Column Parity(列極性),
CP0爲第0、2、4、6列的極性,CP1爲第1、3、5、7列的極性,
CP2爲第0、1、4、5列的極性,CP3爲第2、3、6、7列的極性,
CP4爲第0、1、2、3列的極性,CP5爲第4、5、6、7列的極性。
用公式表示就是:CP0=Bit0^Bit2^Bit4^Bit6, 表示第0列內部256個Bit位異或之後再跟第2列256個Bit位異或,再跟第4列、第6列的每個Bit位異或,這樣,CP0其實是256*4=1024個Bit位異或的結果。CP1 ~ CP5 依此類推。

行校驗如下圖所示

其中RP0 ~ RP15 爲十六個Bit位,表示Row Parity(行極性),
RP0爲第0、2、4、6、….252、254 個字節的極性
RP1-----1、3、5、7……253、255 
RP2----0、1、4、5、8、9…..252、253 (處理2個Byte,跳過2個Byte)
RP3---- 2、3、6、7、10、11…..254、255 (跳過2個Byte,處理2個Byte)
RP4---- 處理4個Byte,跳過4個Byte;
RP5---- 跳過4個Byte,處理4個Byte;
RP6---- 處理8個Byte,跳過8個Byte
RP7---- 跳過8個Byte,處理8個Byte;
RP8---- 處理16個Byte,跳過16個Byte
RP9---- 跳過16個Byte,處理16個Byte;
RP10----處理32個Byte,跳過32個Byte
RP11----跳過32個Byte,處理32個Byte;
RP12----處理64個Byte,跳過64個Byte
RP13----跳過64個Byte,處理64個Byte;
RP14----處理128個Byte,跳過128個Byte
RP15----跳過128個Byte,處理128個Byte;
可見,RP0 ~ RP15 每個Bit位都是128個字節(也就是128行)即128*8=1024個Bit位求異或的結果。

綜上所述,對256字節的數據共生成了6個Bit的列校驗結果,16個Bit的行校驗結果,共22個Bit。在Nand中使用3個字節存放校驗結果,多餘的兩個Bit位置1。存放次序如下表所示:

以K9F1208爲例,每個Page頁包含512字節的數據區和16字節的OOB區。前256字節數據生成3字節ECC校驗碼,後256字節數據生成3字節ECC校驗碼,共6字節ECC校驗碼存放在OOB區中,存放的位置爲OOB區的第0、1、2和3、6、7字節。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章