您的位置:首页 > 运维架构 > Linux

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

2012-04-16 14:12 302 查看
花了近三个星期,终于和阿虚一起将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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: