第9讲 驱动程序.ppt
《第9讲 驱动程序.ppt》由会员分享,可在线阅读,更多相关《第9讲 驱动程序.ppt(78页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、重庆工商大学重庆工商大学 嵌入式嵌入式LinuxLinux设备驱动开发设备驱动开发重庆工商大学重庆工商大学嵌入式嵌入式LinuxLinux设备驱动开发设备驱动开发驱动程序概述驱动程序概述linuxlinux字符设备驱动字符设备驱动触摸屏设备驱动程序介绍触摸屏设备驱动程序介绍块设备驱动块设备驱动网络设备驱动网络设备驱动重庆工商大学重庆工商大学什么是驱动程序驱动程序是指挥硬件工作的软件驱动程序是指挥硬件工作的软件操作系统是通过各种驱动程序来驾驭硬件设备的,操作系统是通过各种驱动程序来驾驭硬件设备的,它为用户屏蔽了各种各样的设备;它为用户屏蔽了各种各样的设备;设备驱动程序是内核的一部分,硬件驱动程序
2、是设备驱动程序是内核的一部分,硬件驱动程序是操作系统最基本的组成部分,在操作系统最基本的组成部分,在LinuxLinux内核源程序内核源程序中也占有中也占有60%60%以上;以上;重庆工商大学重庆工商大学Win2kWin2k体系结构(简化版本)体系结构(简化版本)重庆工商大学重庆工商大学Linux体系结构体系结构重庆工商大学重庆工商大学Hardware Independent SoftwareHardware Independent SoftwareApplicationsApplicationsTCP/IPTCP/IPI/O SystemI/O SystemVxWorks libraries
3、VxWorks librariesWind microKernelWind microKernelFile SystemFile SystemHardware Abstraction LayerHardware Abstraction LayerSCSISCSIDriverDriverFlashFlashDriverDriverMMUMMUDriverDriverCacheCacheDriverDriverSerialSerialDriverDriverEthernetEthernetDrivDrivererOtherOtherDriversDriversHardwareHardwareVxW
4、orks体系结构体系结构重庆工商大学重庆工商大学设备驱动程序的功能o设备驱动程序的功能包括3部分:对设备初始化和释放。检测和处理设备出现的错误。为应用程序提供统一的接口,用于数据传送重庆工商大学重庆工商大学驱动程序与应用程序的区别o主动与被动的区别n应用程序有一个main函数,总是从些函数开始主动执行一个任务,而驱动程序安装之后,便停止工作,并等待被应用程序调用。o使用的库函数不同o程序运行的区域不同n驱动程序工作在内核态;应用程序工作在用户态。重庆工商大学重庆工商大学驱动和普通应用程序的不同驱动和普通应用程序的不同#include#include MODULE_LICENSE(Dual BS
5、D/GPL);static int hello_init(void)printk(KERN_ALERT Hello,worldn);return 0;static void hello_exit(void)printk(KERN_ALERT Goodbye,cruel worldn);module_init(hello_init);module_exit(hello_exit);重庆工商大学重庆工商大学驱动和普通应用程序的不同驱动和普通应用程序的不同编写方法不同编写方法不同编译方法有差异编译方法有差异运行方式不同运行方式不同重庆工商大学重庆工商大学早期驱动模式一重庆工商大学重庆工商大学早期驱动
6、模式二重庆工商大学重庆工商大学LinuxLinux驱动模式驱动模式重庆工商大学重庆工商大学设备分类设备分类LinuxLinux系统的设备分为三类:系统的设备分为三类:字符设备(字符设备(C C)块设备块设备 (B B)网络设备网络设备重庆工商大学重庆工商大学字符设备字符设备字符设备通常指像普通文件或字节流一样,字符设备通常指像普通文件或字节流一样,以字节为单位顺序读写的设备,如:以字节为单位顺序读写的设备,如:简单按键、简单按键、触摸屏、触摸屏、ADAD转换转换。字符设备可以通过设备文件节点访问,它字符设备可以通过设备文件节点访问,它与普通文件之间的区别在于普通文件可以被与普通文件之间的区别在
7、于普通文件可以被随随机访问机访问,而大多数字符设备只能提供顺序访问。,而大多数字符设备只能提供顺序访问。重庆工商大学重庆工商大学块设备块设备 块设备通常指一些需要以块为单位随机读写块设备通常指一些需要以块为单位随机读写的设备,如的设备,如IDEIDE硬盘、硬盘、SCSISCSI硬盘、光驱硬盘、光驱等。块等。块设备也是通过文件节点来访问,它不仅可以提设备也是通过文件节点来访问,它不仅可以提供随机访问,而且可以容纳文件系统(例如硬供随机访问,而且可以容纳文件系统(例如硬盘、闪存等)。盘、闪存等)。重庆工商大学重庆工商大学网络设备网络设备 网络设备通常是指通过网络能够与其他主机网络设备通常是指通过网
8、络能够与其他主机进行数据通信的设备,如网卡等。进行数据通信的设备,如网卡等。内核和网络内核和网络设备驱动程序之间的通信调用一套数据包处理设备驱动程序之间的通信调用一套数据包处理函数,它们完全不同于内核和字符以及块设备函数,它们完全不同于内核和字符以及块设备驱动程序之间的通信(驱动程序之间的通信(read(),write()read(),write()等函数)。等函数)。LinuxLinux网络设备不是面向流的设备,因此不会将网络设备不是面向流的设备,因此不会将网络设备的名字(例如网络设备的名字(例如eth0eth0)映射到文件系统)映射到文件系统中去。中去。重庆工商大学重庆工商大学设备号设备号
9、 设备号设备号是一个数字,它是设备的标志。是一个数字,它是设备的标志。主设备号主设备号表明设备的类型(例如串口设备、表明设备的类型(例如串口设备、SCSISCSI硬盘),与一个确定的驱动程序对应;硬盘),与一个确定的驱动程序对应;次设备号次设备号通常是用于标明不同的属性,例如不通常是用于标明不同的属性,例如不同的使用方法,不同的位置,不同的操作等,同的使用方法,不同的位置,不同的操作等,它标志着某个具体的物理设备。它标志着某个具体的物理设备。高字节为主设备号,低字节为次设备号。高字节为主设备号,低字节为次设备号。重庆工商大学重庆工商大学设备号示例设备号示例重庆工商大学重庆工商大学字符设备向量表
10、chrdevs 初始化字符设备时,字符设备驱动程序向Linux登记,并在字符设备向量表chrdevs中增加一个device_struct数据结构条目,这个设备的主设备号用做这个向量表的索引主设备号用做这个向量表的索引,即chrdevs数组的下标值就是主设备号。重庆工商大学重庆工商大学blkdevs向量表 Linux用blkdevs向量表维护已经登记的块设备文件。它像chrdevs向量表一样,使用设备的主设备号作为索引。重庆工商大学重庆工商大学设备文件o设备类型、主设备号、次设备号是内核与驱动程序通信时所使用的oLinux使用了设备文件的概念来统一对设备的访问接口。o设备文件有时也称为设备节点,
11、一般存放在/dev目录下。o/dev目录下每一个设备文件对应一个设备(含虚拟设备)o设备文件的命名一般为“设备名+数字或字母”。例例:/dev/hda1、/dev/hda2分别表示第一个IDE硬盘的第一个分区和第二个分区。重庆工商大学重庆工商大学设备文件新命令方法设备文件新命令方法 Linux-2.4版本内核中引入了设备文件系统,所有的设备文件作为一个可以挂装的文件,这样就可以被文件系统进行统一管理,从而设备文件就可以挂装到任何需要的地方。设备文件命名规则也发生了变化,一般将主设备建立一个目录,再将具体将主设备建立一个目录,再将具体的子设备文件建立在此目录下。的子设备文件建立在此目录下。重庆工
12、商大学重庆工商大学设备文件的创建方法设备文件的创建方法o自动创建o手动创建重庆工商大学重庆工商大学设备文件的创建方法设备文件的创建方法o手动创建手动创建Mknodn#mknod name type major minor 例如:创建一个字符设备文件,主设备号是100,次设备号是0,设备文件名是/dev/demo,则创建的命令如下:#mkmod demo c 100 0o自自动创建动创建o 在驱动程序中,通过函数调用,在安装驱动程序时,自动创建设设备文件。重庆工商大学重庆工商大学设备文件接口使用文件名主设备号重庆工商大学重庆工商大学设备文件接口 Linux应用程序可以通过设备文件的一组固定的入口
13、点来访问驱动程序,这组入口点是由每个设备的设备驱动程序提供的。字符设备驱动程序能够提供给应用程序的常用入口点如下:int open(char*filename,int access)int close(int handle)int read(int handle,void*buf,int count)int write(int handle,void*buf,int count)int ioctl(int fd,int cmd,)int ioctl(int fd,int cmd,char*argp)重庆工商大学重庆工商大学设备文件接口使用案例o编写应用程序实现向串口发送字符“ATD210999
14、2”int main(int argc,char*args)int fd,n;char bufMAX=ATD2109992;fd=open(/dev/ttyS0,O_RDWR);/open入口点,ttyS0是设备文件 if(fd 0)perror(Unable open/dev/ttyS0n);return 1;n=write(fd,buf,strlen(buf);/write入口点 if(n 0)printf(write()of%d bytes failed!n,strlen(buf);else printf(write()of%d bytes ok!n,strlen(buf);close(
15、fd);/close入口点 return 1;重庆工商大学重庆工商大学操作系统、设备驱动及设备之间的关系操作系统、设备驱动及设备之间的关系 设备驱动设备驱动1 1设备驱动设备驱动n n设备设备1 1设备设备n nLinuxLinux操作系统操作系统LinuxLinux应用系统应用系统重庆工商大学重庆工商大学设备驱动层次结构设备驱动层次结构重庆工商大学重庆工商大学驱动程序的加载方法oLinux驱动程序的安装有2种方式:直接编译进内核,又称静态连接。模块方式,又称动态连接。重庆工商大学重庆工商大学LinuxLinux内核中采用内核中采用可加载的模块化设计可加载的模块化设计(LKMsLKMs,Loa
16、dable Kernel ModulesLoadable Kernel Modules),一般情况下编译),一般情况下编译的的LinuxLinux内核是支持可插入式模块的,也就是将内核是支持可插入式模块的,也就是将最基本的核心代码编译在内核中,最基本的核心代码编译在内核中,其他的代码其他的代码可以编译到内核中,或者编译为内核的模块文可以编译到内核中,或者编译为内核的模块文件件(在需要时动态加载)。(在需要时动态加载)。驱动是一种内核程序,加载驱动就是加载内核驱动是一种内核程序,加载驱动就是加载内核模块。模块。LinuxLinux的驱动模块的驱动模块重庆工商大学重庆工商大学设备驱动模块加载、系统
17、调用和卸载过程重庆工商大学重庆工商大学lsmodlsmod列出当前系统中加载的模块。列出当前系统中加载的模块。rmmodrmmod是用于将当前模块卸载。是用于将当前模块卸载。insmodinsmod和和modprobemodprobe是用于加载当前模块是用于加载当前模块mknodmknod用于创建相关模块用于创建相关模块内核模块的主要相关命令内核模块的主要相关命令重庆工商大学重庆工商大学驱动程序和设备驱动程序的异同驱动程序和设备驱动程序的异同驱动程序通常是驱动程序通常是OSOS留给用户留给用户对内核进行补充对内核进行补充和一定程度访问和一定程度访问的唯一机会(开源的唯一机会(开源OSOS除外)
18、除外)。设备驱动程序是用于管理和操作硬件的代码。设备驱动程序是用于管理和操作硬件的代码。这部分代码这部分代码通常情况下通常情况下是内核的一部分,是内核的一部分,是是驱动程序的一种。驱动程序的一种。重庆工商大学重庆工商大学Linux驱动程序设计o设备驱动的重要数据结构struct filestruct inodestruct file_operationsp驱动程序常用函数字符设备注册及注销函数字符设备注册及注销函数中断申请和释放函数中断申请和释放函数阻塞型阻塞型I/O操作函数操作函数并发处理函数并发处理函数内核空间和用户空间的数据传递函数内核空间和用户空间的数据传递函数设备文件自动创建函数设备
19、文件自动创建函数重庆工商大学重庆工商大学重要数据结构-file结构struct file mode_t f_mode;/标识文件的打开方式 dev_t f_rdev;/用于/dev/tty off_t f_pos;/当前文件位移 unsigned short f_flags;/文件标志,如只读 unsigned short f_count;/打开的文件数目 unsigned short f_reada;struct inode*f_inode;/指向inode的结构指针 struct file_operations*f_op;/文件索引指针;重庆工商大学重庆工商大学重要数据结构-file结构
20、file file结构主要是与文件系统对应的设结构主要是与文件系统对应的设备驱动程序使用。当然备驱动程序使用。当然,其他设备驱动程序其他设备驱动程序也可以使用也可以使用,他提供有关被打开的文件的信他提供有关被打开的文件的信息。息。重庆工商大学重庆工商大学重要数据结构-inode结构structinodestructhlist_nodei_hash;/哈希表哈希表structlist_headi_list;/索引节点链表索引节点链表structlist_headi_dentry;/目录项链表目录项链表unsignedlongi_ino;/节点号节点号/参见课本参见课本177页页inode的详细定
21、义的详细定义u32i_generation;/索引节点版本号索引节点版本号unionvoid*generic_ip;/文件特殊信息文件特殊信息u;重庆工商大学重庆工商大学重要数据结构-inode结构p 文件系统处理的文件所需要的信息在文件系统处理的文件所需要的信息在inodeinode(索引节点)数据结构中。(索引节点)数据结构中。p nodenode结构中保存了结构中保存了pagepage结构,用于进行设备缓结构,用于进行设备缓冲,当进行读写时,系统首先检查是否有冲,当进行读写时,系统首先检查是否有inodeinode存在,然后检查是否已经获得缓冲内容,若没存在,然后检查是否已经获得缓冲内容
22、,若没有则请求,若已经写,那么被写的页标记为有则请求,若已经写,那么被写的页标记为“脏脏”。p inodeinode数据结构提供了关于特别设备文件数据结构提供了关于特别设备文件/dev/DriveName/dev/DriveName的信息的信息 重庆工商大学重庆工商大学file_operationsfile_operations结构体结构体structfile_operationsstructmodule*owner;/拥有该结构的模块的指针,一般为拥有该结构的模块的指针,一般为THIS_MODULESloff_t(*llseek)(structfile*,loff_t,int);/用来修改文
23、件当前的读写位置用来修改文件当前的读写位置ssize_t(*read)(structfile*,char_user*,size_t,loff_t*);/从设备中同步读取数据从设备中同步读取数据ssize_t(*aio_read)(structkiocb*,char_user*,size_t,loff_t);/初始化一个异步的读取操作初始化一个异步的读取操作ssize_t(*write)(structfile*,constchar_user*,size_t,loff_t*);/向设备发送数据向设备发送数据ssize_t(*aio_write)(structkiocb*,constchar_use
24、r*,size_t,loff_t);/初始化异步写入操作初始化异步写入操作int(*readdir)(structfile*,void*,filldir_t);/仅用于读取目录,对于设备文件,该字段为仅用于读取目录,对于设备文件,该字段为NULLunsignedint(*poll)(structfile*,structpoll_table_struct*);/轮询函数,判断可否非阻塞的读写轮询函数,判断可否非阻塞的读写int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);/执行设备执行设备IO控制命令控制命令long(*u
25、nlocked_ioctl)(structfile*,unsignedint,unsignedlong);/此种函数指针代替此种函数指针代替ioctllong(*compat_ioctl)(structfile*,unsignedint,unsignedlong);/在在64位系统上的的位系统上的的ioctl调用调用int(*mmap)(structfile*,structvm_area_struct*);/用于请求将设备内存映射到进程地址空间用于请求将设备内存映射到进程地址空间int(*open)(structinode*,structfile*);/打开设备,主要应用于块设备打开设备,主要
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第9讲 驱动程序
限制150内