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字节可以用户随便用。

这下一目了然了吧。

 

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
下面是基于GD9F2G8F3A的nand_ecclayout布局,填充nand_ecclayout结构体的示例代码: ```c #include <linux/mtd/mtd.h> #define NAND_PAGE_SIZE 2048 #define NAND_BLOCK_SIZE (128 * NAND_PAGE_SIZE) #define NAND_OOB_SIZE 64 struct nand_ecclayout gd9f2g8f3a_ecclayout = { .eccbytes = 4, // 每个数据页的ECC校验码字节数 .eccpos = {128, 129, 130, 131}, // 每个数据页的ECC校验码位置 .oobfree = { { .offset = 0, .length = 1 }, // 块内标记位所在的位置和长度 { .offset = 1, .length = 63 } // 用户自定义元数据信息所在的位置和长度 }, .oobused = 62, // 块内Spare页中使用的字节数(不包括块内标记位) .pagesize = NAND_PAGE_SIZE, // 页大小 .oobsize = NAND_OOB_SIZE, // 每个Spare页的字节数 .offset = 0, // 第一个数据页的偏移量(即块内数据页的起始位置) .pagemask = 0x7f, // 页地址掩码(用于计算块内页地址) .badblockspos = 0 // 坏块标记位所在位置(一般为第一个字节) }; ``` 在上面的代码中,我们填充了nand_ecclayout结构体的各个字段,按照GD9F2G8F3A的nand_ecclayout布局进行设置。其中,eccbytes表示每个数据页的ECC校验码字节数;eccpos表示每个数据页的ECC校验码位置;oobfree表示块内Spare页中可用于存储用户元数据信息的区域,其中第一个元素表示块内标记位所在的位置和长度,第二个元素表示用户自定义元数据信息所在的位置和长度;oobused表示块内Spare页中用于存储元数据信息的字节数,不包括块内标记位;pagesize和oobsize分别表示页大小和每个Spare页的字节数;offset表示第一个数据页的偏移量,即块内数据页的起始位置;pagemask表示页地址掩码,用于计算块内页地址;badblockspos表示坏块标记位所在的位置,一般为第一个字节。 通过以上示例,我们可以清楚地了解到GD9F2G8F3A的nand_ecclayout布局,并且在实际开发中可以根据该布局填充nand_ecclayout结构体。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值