linux驱动开发.doc_第1页
linux驱动开发.doc_第2页
linux驱动开发.doc_第3页
linux驱动开发.doc_第4页
linux驱动开发.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Linux设备驱动程序是一组由内核中的相关子例程和数据组成的I/O设备软件接口,每当内核要对某个设备进行相关的操作时,调用相应的设备驱动程序与硬件通信。设备驱动程序把设备映射为一个特殊的设备文件,在应用程序看来,硬件设备只是一个设备文件(所有设备文件都在/dev目录下),应用程序可以像操作普通文件一样对硬件设备进行操作,使用Open,Read等系统调用像操作普通文件一样操作设备文件。 Linux系统设备分成三种基本类型,字符类模块、块模块或者网路模块。每个模块通常实现其中的某一类。PCI设备驱动程序属于字符类模块,能够实现字节流式访问。Linux下的设备驱动程序可以按照两种方式进行编译和加载:直接静态编译成内核的一部分或者是编译成可以动态加载的模块。如果编译进内核的话,会增加内核的大小,还要改动内核源文件,不能动态地卸载,不利于调试,开发驱动选择加载模块方式。从本质上来讲,模块也是内核的一部分,它不同于普通的应用程序,不能调用位于用户态下的C或者C+库函数,而只能调用Linux内核提供的函数,在/proc/ksyms中可以查看到内核提供的所有函数。一、 PCI设备驱动模块编译、加载与卸载在构造内核模块之前,先查看内核文档目录中的Documentation/Changes文件列出需要的工具版本,确保系统中已经安装了正确的编程工具。编写Makefile文件实现模块编译,makefile在安装的模块目录中构造一个符号链接,指向内核的构造树,从而可以定位内核的源代码目录,然后调用make命令编译生成模块。ifneq ($(KERNELRELEASE),) /说明从内核构造系统调用obj-m := pcid.o /调用内建语句else /直接从命令行调用KERNELDIR := /lib/modules/$(shell uname -r)/build /调用内核构造系统PWD: = $(shell pwd)default:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif生成设备驱动目标模块后,使用命令insmod载入Linux内核,从而成为内核的一个组成部分,此时内核会调用模块中的函数init_module( )。当不需要该模块时,可以使用rmmod命令进行卸载,此时内核会调用模块中的函数cleanup_module( )。使用lsmod命令查看目前已经加载的模块以及正在使用该模块的用户数。驱动程序加载到内核当中后应该创建设备文件,mknod /dev/yourdevicename c major minor,在应用程序中可以按照文件操作使用驱动程序模块。其中,-c参数表示建立的是字符设备文件,-b参数表示建立的是块设备文件;主设备号可以通过查看/proc/devices文件得到;次设备号由用户自定义,用来区分同一类型的不同设备。建立设备文件后,应用程序就可以通过文件操作来访问设备驱动程序。删除设备文件使用rm /dev/设备命令。二、PCI设备探测、注册与移除在使用PCI设备之前,设备驱动程序需要检测设备、初始化设备并向内核注册该设备,该项工作一般是由设备初始化函数init _inti pci_init_module完成。PCI驱动程序提供struct pci_device_id结构体用与定义该驱动程序支持的不同类型的PCI设备列表,使用辅助宏PCI_DEVICE (VENDORID,DEVICEID)进行结构体初始化,建立仅和特定厂商及设备ID相匹配的PCI设备结构体,表示驱动程序可以支持该设备。PCI驱动程序创建struct pci_driver结构体向内核注册PCI驱动程序【41】,包括去除程序名字、pci_device_id表的指针、探测函数指针与移除函数指针。当驱动程序模块动态加载后,进入设备初始化函数调用函数pci_register_driver(&pdo)(pdo即被定义的pci_driver结构体)探测PCI设备。若系统中存在该设备调用probe探测函数初始化设备,通常是访问配置空间(配置寄存器访问)以及访问I/O和内存空间(空间申请、分配缓冲区)等操作。对驱动程序而言,对配置空间的访问至关重要,这是找到设备映射到内存和I/O空间的唯一途径。Linux提供了访问配置空间的标准接口,对于驱动程序而言,可通过8位、16位或32位的数据传输访问配置空间,相关函数原型定义在中:int pci_read-config_byte(word,dword) (struct pci_dev dev,int where,u8(16,32),val) 函数访问dev标识的设备配置空间,where参数是从配置空间起始位置计算的字节偏移量,从配置空间获得的信息通过var指针返回,配置访问过程中struct pci_dev *dev结构体指针在文件include/linux/pci.h里,详细描述了PCI设备几乎所有的硬件信息,包括厂商ID、设备ID、各种资源等,在驱动程序中建立设备拓展信息结构体DevInfo,包含pci_dev结构体以及与DMA传输有关的信息。设备探测与初始化过程如图5-3所示:图5-3 设备探测与初始化Figure 5-3 Device Probing and Initializating设备初始化之后调用设备注册函数register_chrdev( ),注册本设备为字符设备,该函数的原型如下:int register_chrdev struct(unsigned int major,const char *name file_ operations *fop);其中参数 major是指设备驱动程序所使用的主设备号,如果是0则表示由内核自动分配空闲的主设备号,name是设备名,向/proc/devices进行注册;fops是指向file_ operation结构的指针(在下面将会介绍),定义了设备与驱动程序的通信方式方法。此函数的返回值就是主设备号,负数表示注册失败。当卸载驱动程序模块时,将调用remove( )函数将设备结构体从系统中移除,将驱动程序从内核中卸载。调用pci_cleanup_module函数,在该函数中调用设备函数unregister_chrdev( )注销设备,其两个参数分别是要释放的主设备号和相应的设备名。使用cat /proc/devices命令查看设备注册/移除信息。三、PCI设备驱动程序接口函数驱动程序分配设备编号之后,需要将驱动程序操作连接到该设备当中。内核使用file_operations结构访问驱动程序的函数。file_operations结构是一个定义在中的函数【41】,这个结构的每一个成员函数都对应着一个系统调用,用户进程利用系统调用对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。按照惯例,file_operations结构或指向这类结构的指针称为fops在register_chrdev调用中有一个参数就是fops。这个结构中的每一个字段都必须指向驱动程序中特定操作的函数,虽然在file_operations结构里包含了很多操作,但对于每一个具体的设备,只需要实现其中一部分操作。在本设计中,只需要实现read,write,open,release四个操作,声明方式如下,驱动程序通过调用这四个函数访问设备。file_operations fops=.owner= THIS_MODULE,.open= open,.read= read,.write= write,.release= release,;open函数主要实现申请中断、检查读写模式以及申请对设备的控制权等。在申请控制权的时候,非阻塞方式遇忙返回,否则进程主动接受调度,进入睡眠状态,等待其它进程释放对设备的控制权。open函数中有两个重要的数据结构:Struct file数据结构是是在中定义的内核结构,file结构代表一个打开的文件,包含被打开的文件的信息,主要用于与文件系统对应的设备驱动程序使用。在open函数中创建,并传递给在该文件上进行操作的所有函数,直到最后的关闭函数。在文件的所有实例都被关闭之后,内核会释放这个数据结构。inode结构是Linux管理文件系统中最基本单位,是Linux中的虚拟文件系统与下层模块对话的重要结构。文件系统由目录和文件构成,任何一个子目录、文件或设备在系统中都只能由唯一的inode描述,Inode参数与i_cdev参数包含需要的设备信息。当最后一个打开设备的用户进程执行 close ()系统调用时,内核将调用驱动程序的 release()函数,其主要任务是清理未结束的输入/输出操作、释放资源、用户自定义排他标志的复位等。当应用程序打开设备文件开始读时,系统将调用驱动程序的read函数,其原型为:ssize_t read(struct file *flip,char *buff, size_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论