字符设备驱动程序.ppt
《字符设备驱动程序.ppt》由会员分享,可在线阅读,更多相关《字符设备驱动程序.ppt(44页珍藏版)》请在三一办公上搜索。
1、上章回顾,Linux设备驱动的简介,以及分类字符设备块设备网络接口模块的应用如何编写模块模块相关的宏模块和应用程序的区别编译和装载内核模块,字符设备驱动程序,第2章,预习检查,什么是主设备号和次设备号?字符设备驱动程序的基本成员函数有哪些?,本章目标,掌握字符设备驱动程序的基本结构和开发方法 掌握用户空间调用设备驱动程序的方法,本章结构,字符设备驱动基本结构,字符设备驱动程序,用户空间调用设备驱动程序,添加驱动程序到内核,内核配置和编译方法,添加驱动程序到内核中,主要概念和结构体,实例,字符驱动的主要组成,2-1 字符设备驱动程序基本结构,字符设备开发的基本步骤确定主设备号和次设备号实现字符驱
2、动程序实现file_operations结构体实现初始化函数,注册字符设备实现销毁函数,释放字符设备创建设备文件节点,2-1 字符设备驱动程序基本结构,什么是主设备号/次设备号主设备号是内核识别一个设备的标识。整数(占12bits),范围从0到4095,通常使用1到255次设备号由内核使用,用于正确确定设备文件所指的设备。整数(占20bits),范围从0到1048575,一般使用0到255,2-1 字符设备驱动程序基本结构,设备编号的内部表达dev_t类型(32位):用来保存设备编号(包括主设备号(12位)和次设备号(20位)从dev_t获得主设备号和次设备号:MAJOR(dev_t);MIN
3、OR(dev_t);将主设备号和次设备号转换成dev_t类型:MKDEV(int major,int minor);,2-1 字符设备驱动程序基本结构,分配主设备号手工分配主设备号:找一个内核没有使用的主设备号来使用。,#include int register_chrdev_region(dev_t first,unsigned int count,char*name);,要分配的设备编号范围的起始值,次设备号经常为0,所请求的连续设备编号的个数,和该编号范围关联的设备名称,2-1 字符设备驱动程序基本结构,动态分配主设备号:,#include int alloc_chrdev_resion
4、(dev_t*dev,unsigned int firstminor,unsigned int count,char*name);,输出的设备号,要使用的被请求的第一个次设备号,2-1 字符设备驱动程序基本结构,释放设备号,void unregister_chrdev_region(dev_t first,unsigned int count);,通常在模块的清除函数中调用。,2-1 字符设备驱动程序基本结构,实现字符驱动程序cdev 结构体,struct cdev struct kobject kobj;/*内嵌的kobject 对象*/struct module*owner;/*所属模块*
5、/struct file_operations*ops;/*文件操作结构体*/struct list_head list;dev_t dev;/*设备号*/unsigned int count;,2-1 字符设备驱动程序基本结构,操作cdev的函数,void cdev_init(struct cdev*,struc t file_operations*);struct cdev*cdev_alloc(void);int cdev_add(st ruct cdev*,dev_t,unsigned);void cdev_del(struct cdev*);,用于初始化cdev的成员,并建立cdev
6、和file_operations之间的连接,分别向系统删除一个cdev,完成字符设备的注销,通常在模块的卸载函数中调用,分别向系统添加一个cdev,完成字符设备的注册,通常在模块加载函数中调用,函数用于动态申请一个cdev 内存,2-1 字符设备驱动程序基本结构,file_operations 结构体字符驱动和内核的接口:在include/linux/fs.h定义字符驱动只要实现一个file_operations结构体并注册到内核中,内核就有了操作此设备的能力。,2-1 字符设备驱动程序基本结构,file_operations的主要成员:struct module*owner:指向模块自身op
7、en:打开设备release:关闭设备read:从设备上读数据write:向设备上写数据ioctl:I/O控制函数llseek:定位读写指针mmap:映射设备空间到进程的地址空间,2-1 字符设备驱动程序基本结构,file 结构体 file结构:file_operations结构相关的一个结构体。描述一个正在打开的设备文件。成员:loff_t f_pos:当前读/写位置unsigned int f_flags标识文件打开时,是否可读或可写O_RDONLYO_NONBLOCKO_SYNCstruct file_operations*f_op文件相关的操作,指向所实现的struct file_op
8、erations void*private_data:私有数据指针。驱动程序可以将这个字段用于任何目的或者忽略这个字段。,2-1 字符设备驱动程序基本结构,inode 结构体内核用inode结构在内部表示文件Inode与file的区别file表示打开的文件描述符多个表示打开的文件描述符的file结构,可以指向单个inode结构。,2-1 字符设备驱动程序基本结构,Inode结构中的两个主要字段:dev_t i_rdev;对表示设备文件的inode结构,该字段包含了真正的设备编号。struct cdev*i_cdev;struct cdev是表示字符设备的内核的内部结构。当inode指向一个字符
9、设备文件时,该字段包含了指向struct cdev结构的指针从一个inode中获得主设备号和次设备号:,unsigned int iminor(struct inode*inode);unsigned int imajor(struct inode*inode);,2-1 字符设备驱动程序基本结构,注册设备,在模块或驱动初始化时调用Linux-2.4 及之前Linux-2.6,int register_chrdev(unsigned int major,const char*name,struct file_operations*fops),如何操作字符设备的接口,void cdev_init
10、(struct cdev*,struc t file_operations*);int cdev_add(st ruct cdev*,dev_t,unsigned);,2-1 字符设备驱动程序基本结构,注销设备:在模块卸载时调用Linux-2.4及之前Linux-2.6,int unregister_chrdev(unsigned int major,const char*name);,void cdev_del(struct cdev*);,2-1 字符设备驱动程序基本结构,/设备驱动模块加载函数static int _init xxx_init(void).cdev_init(/注册设备.
11、,2-1 字符设备驱动程序基本结构,/*设备驱动模块卸载函数*/static void _exit xxx_exit(void)unregister_chrdev_region(xxx_dev_no,1);/释放占用的设备号 cdev_del(/注销设备.,2-1 字符设备驱动程序基本结构,打开模块使用计数加1识别次设备号硬件操作:检查设备相关错误(诸如设备未就绪或类似的硬件问题);如果设备是首次打开,则对其初始化;如果有中断操作,申请中断处理程序;,int open(struct inode*inode,struct file*filp);,2-1 字符设备驱动程序基本结构,关闭 模块使用计
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字符 设备 驱动程序
链接地址:https://www.31ppt.com/p-6268060.html