【轉帖請註明出處: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字節可以用戶隨便用。
這下一目瞭然了吧。