基于linux2.6.16的nand驱动开发(一)

花了近三个星期,终于和阿虚一起将sep4020上的nand驱动给搞定了。

 

第一部分:MTD

首先是花了好几天来了解nand以及在linux下nand的开发,在linux中使用了一个mtd层来作为具体的硬件设备驱动和上层文件系统的桥梁。.mtd给出了系统中所有mtd设备(nand,nor,diskonchip)的统一组织方式。

使用mtd层的好处有:

●1.我们要做mtd设备的驱动模块,所需要做的事情就是去填满那些公共接口函数的实际内容。有了mtd,在设计驱动模块的时候,不用去理会字符(块)设备驱动设计标准,因为所有这些复杂的与内核的交互接口机制mtd已经替我们做好了,我们只需要实现对物理设备的范围控制。——这是对于写驱动的人来说的方便。

●2.上层应用只需要访问mtd抽象层提供的字符设备方式或者块设备方式来访问mtd设备,因此具体驱动对于上层应用来说是具有独立性的,即使底层驱动修改了,上层拥有也不需要改动。并且由于mtd抽象层,上层应用就可以避免直接对具体硬件操作,而是对mtd操作,这样的话这些应用就不是建立在某个具体的设备上,更好的实现了通用性和兼容性——这是对于上层应用来说的方便。

 

关于mtd层:

●.mtd抽象层用一个数组struct mtd_info *mtd_table[MAX_MTD_DEVICES]保存系统中所有的设备,mtd设备利用struct mtd_info 这个结构来描述,该结构中描述了存储设备的基本信息和具体操作所需要的内核函数,mtd系统的那个机制主要就是围绕这个结构来实现的。下面简单介绍下这个结构:

struct mtd_info {

u_char type;          //MTD 设备类型

u_int32_t flags;    //MTD设备属性标志

u_int32_t size; // 标示了这个mtd设备的大小

u_int32_t erasesize; // MTD设备的擦除单元大小,对于NandFlash来说就是Block的大小

u_int32_t oobblock;  // oob区在页内的位置,对于512字节一页的nand来说是512

u_int32_t oobsize;   // oob区的大小,对于512字节一页的nand来说是16

u_int32_t ecctype;

u_int32_t eccsize;

 

char *name;             //设备的名字

int index;                 //设备在MTD列表中的位置

 

struct nand_oobinfo oobinfo; //其中是oob区的信息,包括是否使用ecc,ecc的大小

 

//以下是关于mtd的一些读写函数,将在nand_base中的nand_scan中将其重载

int (*erase)

int (*read)

int (*write)

int (*read_ecc)

int (*write_ecc)

int (*read_oob)

int (*read_oob)

void *priv;             //设备私有数据指针,对于nand Flash来说指向,nand芯片的结构



转自:http://blog.csdn.net/myleeming/article/details/3057639

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值