从模型分析到Flash驱动模板(5)

MTD设备提供了字符设备和块设备两种接口,对于字符设备接口,在"drivers/mtd/mtdchar.c"中实现了,比如,用户程序可以直接通过ioctl()回调相应的驱动实现。其中下面的几个是这些操作中常用的结构,这些结构是对用户空间开放的,类似于输入子系统中的input_event结构。

mtd_info_user //include/uapi/mtd/mtd-abi.h 125 struct mtd_info_user { 126 __u8 type; 127 __u32 flags; 128 __u32 size; /* Total size of the MTD */ 129 __u32 erasesize; 130 __u32 writesize; 131 __u32 oobsize; /* Amount of OOB data per block (e.g. 16) */ 132 __u64 padding; /* Old obsolete field; do not use */ 133 }; mtd_oob_buf

描述NandFlash的OOB(Out Of Band)信息。

35 struct mtd_oob_buf { 36 __u32 start; 37 __u32 length; 38 unsigned char __user *ptr; 39 }; erase_info_user 25 struct erase_info_user { 26 __u32 start; 27 __u32 length; 28 }; 实例 mtd_oob_buf oob; erase_info_user erase; mtd_info_user meminfo; /* 获得设备信息 */ if(0 != ioctl(fd, MEMGETINFO, &meminfo)) perror("MEMGETINFO"); /* 擦除块 */ if(0 != ioctl(fd, MEMERASE, &erase)) perror("MEMERASE"); /* 读OOB */ if(0 != ioctl(fd, MEMREADOOB, &oob)) perror("MEMREADOOB"); /* 写OOB??? */ if(0 != ioctl(fd, MEMWRITEOOB, &oob)) perror("MEMWRITEOOB"); /* 检查坏块 */ if(blockstart != (ofs & (~meminfo.erase + 1))){ blockstart = ofs & (~meminfo.erasesize + 1); if((badblock = ioctl(fd, MEMGETBADBLOCK, &blockstart)) < 0) perror("MEMGETBADBLOCK"); else if(badblock) /* 坏块代码 */ else /* 好块代码 */ }

NANDFlash和NORFlash都是基于MTD框架编写的,由于MTD框架中通用代码已经在内核中实现了,所以驱动开发主要是进行MTD框架中的的开发。

NOR Flash驱动

下图就是NORFlash驱动在MTD驱动框架中的位置

从模型分析到Flash驱动模板

基于上述的MTD框架, Flash驱动都变的十分的简单, 因为当下Flash的操作接口已经很统一, a, 相应的代码在"drivers/mtd/chips"中文件实现,所以在设备驱动层, 留给驱动工程师的工作就大大的减少了。
基于MTD子系统开发NOR FLash驱动,只需要构造一个map_info类型的对象并调用do_map_probe()来匹配内核中已经写好的驱动,比如CFI接口的驱动或JEDEC接口的驱动。当下编写一个NorFlash驱动的工作流程如下

从模型分析到Flash驱动模板

map_info 208 struct map_info { 209 const char *name; 210 unsigned long size; 211 resource_size_t phys; 212 #define NO_XIP (-1UL) 214 void __iomem *virt; 215 void *cached; 217 int swap; /* this mapping's byte-swapping requirement */ 218 int bankwidth; 243 void (*set_vpp)(struct map_info *, int); 245 unsigned long pfow_base; 246 unsigned long map_priv_1; 247 unsigned long map_priv_2; 248 struct device_node *device_node; 249 void *fldrv_priv; 250 struct mtd_chip_driver *fldrv; 251 };

struct map_info
--210-->NOR Flash设备的容量
--211-->NOR Flash在物理地址空间中的地址
--214-->由物理地址映射的虚拟地址
--218-->总线宽度,NOR Flash是有地址总线的,所以才能片上执行,一般都是8位或16位宽

构造好一个map_info对象之后,接下来的工作就是匹配驱动+注册分区表

do_map_probe()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8840177b6c5801da96185883ebeb051f.html