Linux下PCI设备驱动程序的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子对抗技术・第2【)卷2()05年5月第3期
跚勇’,李峥二,窦衡‘
LjJⅢx下P(:I设备驱动程序的实现45
图2PCI子系统的体系结构
的,可定义如下所示的数据结构来表示一个设备:
该数据结构的参数pNextDevice表示下一个设备,通过对它的控制,就可以达到控制多个硬件设备的目的,参数I)RⅣER—OBJECT代表着驱动程序对象,其定义如下:
其中参数pDeviceobject表示第一个设备对象的指针,参数DeviceCount表示硬件设备数,参数SupponedIDs表示该设备驱动程序支持的设备序列,参数Dispatchl、曲1e是最重要的部分,它是设备驱动程序对应用程序提供诸如打开、读写、I/0控制等等操作的入口,有关nle—opemtions在前面已有说明。
对PCI设备进行驱动程序开发,要完成的工作主要包括:对PCI设备的初始化,对PCI设备的数据读写和控制,中断处理等。
3.1初始化PCI设备
对一个PCI设备的初始化,首先是找到要驱动的PCI设备,在Ljnux系统下,通过调用内核函数pci一6nd—device()来查找要驱动的PCI设备,检查设备是否插在总线插槽上,如果在的话则保存它所占用的插槽的位置等信息,读出配置头中的信息提供给驱动程序使用。同时,应当将驱动程序向系统进行注册,这主要是通过内核函数regis—ter—chrdev()来完成,其参数中的6le—operation结构,它定义了设备与外界交流的方式方法,可将其设置为DRIVER—OBJECT中的DispatchTable参数。通过Dispatch‘I铀1e,应用程序就可对设备文件进行诸如open、close、read、谢te等操作。在初始化设备时,同时应当对设备进行内存分配,可通过函数kInalloc()来实现。
3.2数据读写和设备控制
在“nux下,对设备的读写相对比较简单,直接使用file—operations结构中的函数read()和俪te()就可以实现。该结构中的函数ioctl(),向应用程序提供了对硬件进行控制的接口,针对PCI设备,对设备的数据读写及控制主要就是对PcI设备的三个地址空间的访问。对PCI的配置空间的访问主要是通过内核函数pci—read~con一鲰一dwo谢()及pcj一涮te—co幽g—dword()等来完成,对PCI的I/0空间的访问则是通过指令inb(),inw(),inl(),outb(),outw(),outl()等来完成,对PCI的存储空间访问则是通过内核函数readl(),佣tel()等来完成。对这些内存的操作一方面可以通过把I/0内存重新映射后作为普通内存进行操作,对I/0内存映射通过内核函数Iomap()实现。另一方面也可以通过总线主DMA(BusMasterDMA)的方式让设备把数据通过DMA传送到系统内存中。
3.3中断处理
由于设计和硬件上的改变,Linux处理中断的方法近几年来有很大的改变,现代硬件不仅有很多的中断,而且还可以以智能的方式在多个处理
器之间分发中断。在一个多处理器的系统中,对
Linux下PCI设备驱动程序的实现
作者:谢勇, 李峥, 窦衡, XIE Yong, LI Zheng, DOU Heng
作者单位:谢勇,窦衡,XIE Yong,DOU Heng(电子科技大学,成都,610054), 李峥,LI Zheng(中国电子科技集团公司第二十九研究所,成都,610036)
刊名:
电子对抗技术
英文刊名:ELECTRONIC WARFARE TECHNOLOGY
年,卷(期):2005,20(3)
本文链接:/Periodical_dzdkjs200503012.aspx