struct nand_ecclayout 之解義 ,eccbytes,eccpos,eccfree

【轉帖請註明出處:blog.csdn.net/lanmanck】

內核的nand flash驅動真可謂用“日新月異”來形容,今兒個剛寫完的驅動,等到明天下個新內核放進去,又不好使了,shit!

這裏討論下struct nand_ecclayout,即nand 的ecc佈局問題,基於2.6.32-rc2.

該結構體定義如下:

struct nand_ecclayout {

uint32_t eccbytes;    //表示使用幾個ecc字節

uint32_t eccpos[128]; //表示ecc佔用的位置,因爲現在大頁面4kbyte也就128個,所以這裏寫了128,

                                   //以後有更大頁面的,這裏也要改了。

uint32_t oobavail;       //有幾個oob可用,這個跟下面的成員有點像,一般用下面的

struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES];  //定義oob有效個數,從哪開始等

};

給個例子:

static struct nand_ecclayout mylayout = {

#ifdef CONFIG_SYS_NAND_PAGE_2K

.eccbytes = 40,

.eccpos = { 

24, 25, 26, 27, 28,

29, 30, 31, 32, 33, 34, 35, 36, 37, 38,

39, 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, .length = 22, },

},

#endif

}
 其中,.eccbytes = 40,跟初始化有關係,我們一般這樣初始化:

 

nand->ecc.size = 512; 

nand->ecc.bytes = 10;

恩,這下明朗了,我們需要每512個字節產生10個ecc字節,因此對2kbyte頁面的flash來說,一頁就是4個512,因此需要4*10=40個ecc字節。

.eccpos就是告訴驅動,這些ecc字節放在哪裏,一般是按順序存放,不要覆蓋芯片默認的壞塊標記位,對2kbyte的flash來說,廠家說是前兩個即第0、1個字節是壞塊標誌。

所以分配爲eccbytes和eccpos後,後面有個oobfree,這樣看來也很明白了:

offset=2表示從第2個字節開始(因爲前面2個是壞塊標誌啊~~),length=22表示(從offset開始)共22個ecc字節可以用戶隨便用。

這下一目瞭然了吧。


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