资源描述:
《第9章 嵌入式Linux设备驱动程序开发ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第7章嵌入式Linux设备驱动程序开发9.1嵌入式Linux的设备管理9.2设备驱动模块化编程9.3GPIO字符设备驱动程序设计9.4A/D转换器驱动程序设计9.5IC卡驱动程序设计9.6内核驱动程序设计——触摸屏驱动程序第7章嵌入式Linux设备驱动程序开发9.1嵌入式Linux的设备管理设备驱动程序实际是处理和操作硬件控制器的软件,从本质上讲,是内核中具有最高特权级的、驻留内存的、可共享的底层硬件处理例程。完成以下功能:●对设备初始化和释放;●对设备进行管理,包括实时参数设置,以及提供对设备的操作接口;●读取应用程序传送给设备文件的数据或者回送应用
2、程序请求的数据;●检测和处理设备出现的错误。整个设备管理子系统的结构如图9.1所示。图9.1设备管理系统结构9.1.1设备驱动和文件系统的关系●open——打开设备准备I/O操作。其调用格式为:intopen(char*filename,intaccess);●close——close()函数的作用是关闭由open()函数打开的文件,其调用格式为:intclose(inthandle);该函数关闭文件描述字handle相连的文件。●read——从设备上读数据。对于有缓冲区的I/O操作,一般是从缓冲区里读数据。●write——往设备上写数据,对于有缓冲区
3、的I/O操作,一般是把数据写入缓冲区里。write()函数的调用格式为:intwrite(inthandle,void*buf,intcount);write()函数把count个字节从buf指向的缓冲区写入与handle相连的文件中,返回值为实际写入的字节数。●ioctl——主要用于对设备进行读写之外的其他控制。用户空间的ioctl函数的原型为:intioctl(inffd,intcmd,…)其中的…代表可变数目的参数表,实际中是一个可选参数,一般定义为:intioctl(inffd,intcmd,char*argp)驱动程序中定义的ioctl方法原
4、型为:int(*ioctl)(structinode*inode,structfile*file,unsignedintcmd,unsignedlongarg)inode和filp两个指针对应应用程序传递的文件描述符fd、cmd不会被修改地传递给驱动程序,可选的参数arg则无论用户应用程序使用的是指针还是其他类型值,都以unsignedlong的形式传递给驱动。9.1.2设备类型Linux中的设备可以分为三类:字符设备块设备网络设备。一个运行的linux系统,当前使用的设备可以通过文件/proc/devices查看。9.1.3设备号linux/ucli
5、nux内核还需要:●主设备号标识设备对应的驱动程序。系统中不同的设备可以有相同的主设备号,主设备号相同的设备使用相同的驱动程序。●次设备号用来区分具体驱动程序的实例。一个主设备号可能有多个设备与之对应,这多个设备正是在驱动程序内通过次设备号来进一步区分的。次设备号只能由设备驱动程序使用,内核的其他部分仅将它作为参数传递给驱动程序。字符型设备主设备号的添加和注销字符型设备主设备号的添加和注销分别通过调用函数register_chrdev()和unregister_chrdev()实现,这两个函数原型在文件说明。externintr
6、egister_chrdev(unsignedintmajor,constchar*name,structfile_operations*fops);externintunregister_chrdev(unsignedintmajor,constchar*name);9.1.4设备驱动中关键数据结构在linux系统中,设备驱动程序所提供的这组入口点由一个文件操作结构进行说明,分别是:file_operations数据结构inode数据结构file数据结构,它们定义于Linux/fs.h文件中。1.file_operations数据结构structfi
7、le_operations{structmodule*owner;loff_t(*llseek)(structfile*,loff_t,int);ssize_t(*read)(structfile*,char*,size_t,loff_t*);ssize_t(*write)(structfile*,constchar*,size_t,loff_t*);int(*readdir)(structfile*,void*,filldir_t);unsignedint(*poll)(structfile*,structpoll_table_struct*);in
8、t(*ioctl)(structinode*,structfile*,unsignedint,