嵌入式系统设计-李秀娟-课件-第8章.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《嵌入式系统设计-李秀娟-课件-第8章.pptx》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 嵌入式 系统 设计 李秀娟 课件
- 资源描述:
-
1、第第8 8章章 设备驱动程序开发设备驱动程序开发 驱动激励硬件设备开启,驱动激励硬件设备开启,赋予硬件设备能量赋予硬件设备能量 1本章内容28 8.1 .1 设备驱动概述设备驱动概述18.2 8.2 设备驱动程序的开发过程设备驱动程序的开发过程2 8.3 8.3 驱动程序开发的常见问题驱动程序开发的常见问题3目的和要求目的和要求v了解驱动程序的功能了解驱动程序的功能v理解驱动程序开发过程理解驱动程序开发过程v掌握各类设备驱动程序设计方法掌握各类设备驱动程序设计方法v掌握驱动程序开发过程中的常见问题掌握驱动程序开发过程中的常见问题v掌握直流电机驱动程序设计实例掌握直流电机驱动程序设计实例 38.
2、1 8.1 设备驱动概述设备驱动概述主要完成以下的功能主要完成以下的功能:v(1 1)对设备初始化和释放;)对设备初始化和释放;v(2 2)把操作数据从内核传送到硬件和从硬)把操作数据从内核传送到硬件和从硬 件读取数据;件读取数据;v(3 3)读取应用程序传送给硬件设备的数据)读取应用程序传送给硬件设备的数据 和回送应用程序请求的数据;和回送应用程序请求的数据;v(4 4)检测和处理硬件设备出现的错误。)检测和处理硬件设备出现的错误。48.1.1 8.1.1 驱动程序和应用程序的区别驱动程序和应用程序的区别v设备驱动程序就工作在设备驱动程序就工作在“内核空间内核空间” ; ;应用程序则应用程序
3、则是在是在“用户空间用户空间”中运行中运行 。v驱动程序的优先级高于应用程序。驱动程序的优先级高于应用程序。 v驱动程序可以对硬件进行直接访问和对内存的访驱动程序可以对硬件进行直接访问和对内存的访问。应用程序则不能。问。应用程序则不能。5应用程序与驱动程序的关系图 6 Linux Linux的设备管理的设备管理 v字符设备(字符设备(Character DeviceCharacter Device) v块设备(块设备(Block DeviceBlock Device) v网络设备驱动(网络设备驱动(Network interfaceNetwork interface) 7字符设备字符设备 vL
4、inuxLinux下的字符设备接口支持面向字符的下的字符设备接口支持面向字符的I/OI/O操作,操作,是以字节为单位顺序读写;是以字节为单位顺序读写; v字符设备无需缓存且被直接读写字符设备无需缓存且被直接读写 ;v字符设备可以访问字符设备可以访问/dev/dev目录下的文件系统节点目录下的文件系统节点 8字符设备驱动程序示意图字符设备驱动程序示意图 9块设备块设备 vLinuxLinux系统下的块设备是指对信息存取以系统下的块设备是指对信息存取以“块块”为单为单位位 ;v块设备对于块设备对于I/OI/O请求有对应的缓冲区,块设备具有随请求有对应的缓冲区,块设备具有随机访问特性;机访问特性;v
5、块设备和字符设备一样也是通过块设备和字符设备一样也是通过/dev/dev目录下的文件目录下的文件系统节点被访问的;系统节点被访问的;v块驱动程序除了给内核提供和字符设备驱动程序一块驱动程序除了给内核提供和字符设备驱动程序一样的接口以外,还提供了专门面向块设备的接口样的接口以外,还提供了专门面向块设备的接口 ;v块设备的接口还必须支持挂装块设备的接口还必须支持挂装(mount)(mount)文件系统。文件系统。 10 块设备驱动程序数据结构示意图块设备驱动程序数据结构示意图 11网络设备驱动网络设备驱动 网络驱动的体系结构包括网络协议接口层、网网络驱动的体系结构包括网络协议接口层、网络设备接口层
6、、网络驱动接口层和设备媒介层。络设备接口层、网络驱动接口层和设备媒介层。 12网络驱动的体系结构网络驱动的体系结构 138.2 8.2 设备驱动程序的开发过程设备驱动程序的开发过程v8.2.1 8.2.1 字符设备驱动程序的设计字符设备驱动程序的设计 驱动程序的接口流程图驱动程序的接口流程图 14LinuxLinux为所有的设备文件都提供了统一的操作函数接为所有的设备文件都提供了统一的操作函数接口,具体操作方法是使用数据结构口,具体操作方法是使用数据结构structstruct file_operationsfile_operations。 structstruct file_operatio
7、nsfile_operations structstruct module module * *owner;owner;loff_tloff_t ( (* *llseekllseek) () (structstruct file file * *, , loff_tloff_t, , intint); );ssize_tssize_t ( (* *read) (read) (structstruct file file * *, char , char * *, , size_tsize_t, , loff_tloff_t * *); );ssize_tssize_t ( (* *write)
8、 (write) (structstruct file file * *, const char , const char * *, , size_tsize_t, , loff_tloff_t * *); );intint ( (* *readdirreaddir) () (structstruct file file * *, void , void * *, , filldir_tfilldir_t); );unsigned unsigned intint ( (* *poll) (poll) (structstruct file file * *, , structstruct pol
9、l_table_structpoll_table_struct * *); );intint ( (* *ioctlioctl) () (structstruct inodeinode * *, , structstruct file file * *, unsigned , unsigned intint, unsigned , unsigned long);long);intint ( (* *mmapmmap) () (structstruct file file * *, , structstruct vm_area_structvm_area_struct * *); );intin
10、t ( (* *open) (open) (structstruct inodeinode * *, , structstruct file file * *); ); ;15 在嵌入式系统的开发中,我们一般仅仅实现其中在嵌入式系统的开发中,我们一般仅仅实现其中几个接口函数:几个接口函数:readread、writewrite、ioctlioctl、openopen、releaserelease,就可以完成应用系统需要的功能。就可以完成应用系统需要的功能。vopenopen接口接口 Open Open 接口提供给驱动程序初始化设备的能力,接口提供给驱动程序初始化设备的能力,从而为以后的设备操作
11、做好准备。从而为以后的设备操作做好准备。vreleaserelease接口接口 与与 openopen函数相反函数相反 ; ;vread read 和和write write 接口接口 read read 函数完成将数据从内核拷贝到应用程序空间,函数完成将数据从内核拷贝到应用程序空间,writewrite函数则相反,将数据从应用程序空间拷贝到函数则相反,将数据从应用程序空间拷贝到内核。内核。 16vioctlioctl 接口接口 ioctlioctl 接口主要用于对设备进行读写之外的其他控接口主要用于对设备进行读写之外的其他控制。制。 例:LED驱动程序: S3C2410上的4个LED指示灯由
12、4个I/O端口控制,他们分别是GPF4GPF7,当GPF4GPF7分别输出低电平时候,LED指示灯亮,输出高电平的时候,LED指示灯灭 171 1、LEDLED驱动需要的头文件驱动需要的头文件 # include # include / /配置头文件配置头文件# include # include / /内核头文件内核头文件# include # include / /用户定义模块初始函数需引用户定义模块初始函数需引用的头文件用的头文件# include # include / /模块加载的头文件模块加载的头文件# include # include / /延时头文件延时头文件 # inclu
13、de # include # include # include / /用户的硬件配置文件用户的硬件配置文件# include # include 182 2、LEDLED驱动需要的宏定义驱动需要的宏定义 # define GPIO_LED_MAJOR 220 /# define GPIO_LED_MAJOR 220 /定义主设备号定义主设备号/声明声明4 4个个LEDLED灯的灯的I/OI/O端口;端口; GPFDAT GPFDAT 是端口是端口F F的数据寄存的数据寄存器器# define LED1_ON()(GPFDAT & = # define LED1_ON()(GPFDAT & =
14、 0 x10) /GPF40 x10) /GPF4输出输出0 0# define LED2_ON()(GPFDAT & = # define LED2_ON()(GPFDAT & = 0 x20) /GPF50 x20) /GPF5输出输出0 0# define LED3_ON()(GPFDAT & = # define LED3_ON()(GPFDAT & = 0 x40) /GPF60 x40) /GPF6输出输出0 0# define LED4_ON()(GPFDAT & = # define LED4_ON()(GPFDAT & = 0 x80) /GPF70 x80) /GPF7输出
15、输出0 0# define LED1_OFF()(GPFDAT | = 0 x10) /GPF4# define LED1_OFF()(GPFDAT | = 0 x10) /GPF4输出输出1 1# define LED2_OFF()(GPFDAT | = 0 x20) /GPF5# define LED2_OFF()(GPFDAT | = 0 x20) /GPF5输出输出1 1# define LED3_OFF()(GPFDAT | = 0 x40) /GPF6# define LED3_OFF()(GPFDAT | = 0 x40) /GPF6输出输出1 1# define LED4_OF
16、F()(GPFDAT | = 0 x80) /GPF7# define LED4_OFF()(GPFDAT | = 0 x80) /GPF7输出输出1 1/定义定义LEDLED灯的状态灯的状态# define LED_ON 0 /# define LED_ON 0 /低电平点亮低电平点亮LEDLED# define LED_OFF 1 /# define LED_OFF 1 /高电平熄灭高电平熄灭LEDLED193 3、file_operationsfile_operations 结构体的设计结构体的设计 structstruct file_operationsfile_operations
17、GPIO_LED_ctl_opsGPIO_LED_ctl_ops= open: open: GPIO_LED_openGPIO_LED_open, read: read: GPIO_LED_readGPIO_LED_read, , write: write: GPIO_LED_writeGPIO_LED_write, , ioctlioctl: : GPIO_LED_ioctlGPIO_LED_ioctl, , release: release: GPIO_LED_releaseGPIO_LED_release, , ; ;204 4、LEDLED驱动程序的读写函数实现驱动程序的读写函数实现
18、在本例中,在本例中,LEDLED的读写操作不做任何操作,可以的读写操作不做任何操作,可以省略。本例仅给出了读写操作函数的框架。省略。本例仅给出了读写操作函数的框架。/-READ-/-READ-ssize_tssize_t GPIO_LED_readGPIO_LED_read( (structstruct file file * * file ,char file ,char * * bufbuf , , size_tsize_t count, count, loff_tloff_t * * f_opsf_ops) ) return count; return count; /-WRITE-/-
19、WRITE-ssize_tssize_t GPIO_LED_writeGPIO_LED_write( (structstruct file file * * file ,const char file ,const char * * bufbuf , , size_tsize_t count, count, loff_tloff_t * * f_opsf_ops) ) return count; return count; 21ssize_tssize_t GPIO_LED_ioctlGPIO_LED_ioctl( (structstruct inodeinode * * inodeinode
展开阅读全文