基于PCI Express总线的雷达数据记录器驱动程序开发
[09-13 16:53:20] 来源:http://www.88dzw.com 接口定义 阅读:8411次
文章摘要:IRP全名为IO Request Packet,即I/O请求包,是系统创建的一种数据结构。当应用程序对设备操作时,I/O管理器根据具体的请求建立相应的IRP,IRP先被I/O管理器发送到最上层的驱动程序处理,然后依次传递给下层的驱动程序处理。每层驱动程序可以不作任何事情而直接将IRP向下传递,也可以直接将该IRP设置为完成状态。4 PEX8311驱动程序设计微软提供的驱动程序开发软件包DDK(Device Driver Kits)提供了用于驱动程序开发的资源文件、编译连接程序、开发技术文档等。第三方开发工具有NuMega公司DriverStudio和Jungo公司的WinDriver,它们对D
基于PCI Express总线的雷达数据记录器驱动程序开发,标签:接口技术,微机原理与接口技术,http://www.88dzw.comIRP全名为IO Request Packet,即I/O请求包,是系统创建的一种数据结构。当应用程序对设备操作时,I/O管理器根据具体的请求建立相应的IRP,IRP先被I/O管理器发送到最上层的驱动程序处理,然后依次传递给下层的驱动程序处理。每层驱动程序可以不作任何事情而直接将IRP向下传递,也可以直接将该IRP设置为完成状态。
4 PEX8311驱动程序设计
微软提供的驱动程序开发软件包DDK(Device Driver Kits)提供了用于驱动程序开发的资源文件、编译连接程序、开发技术文档等。第三方开发工具有NuMega公司DriverStudio和Jungo公司的WinDriver,它们对DDK进行了封装,方便用户进行驱动开发。但效率方面不如DDK。考虑到雷达数据记录的数据率较高,所以本文采用DDK开发PEX8311的驱动程序。总线驱动程序由系统提供,过滤驱动程序是可选的。所以本文只设计了PEX8311的功能驱动程序(以下简称驱动程序),它主要由驱动程序初始化、数据传输初始化、数据传输模块三部分组成。其基本思想是:应用程序与驱动程序共享DMA缓存,当驱动程序接收到一个LINT#中断时,启动DMA读取FIFO中的数据存在DMA缓存中,每次读完后,驱动程序通过事件通知应用程序取出DMA缓存中的数据存在SCSI硬盘上。
4.1 驱动程序初始化
DriverEntry是驱动程序的入口函数,负责初始化驱动程序对象。系统启动时,如果检测到PEX8311的存在,I/O管理器会建立一个未初始化的驱动程序对象并将它作为一个参数传给DriverEntry。DriverEntry把驱动程序其它例程的函数指针装入到驱动程序对象里面。当一个IRP被发送到设备时,I/O管理器使用该IRP关联的驱动程序对象找到正确的驱动程序例程处理。初始化的主要函数指针有:AddDevice、DriverUnload、DispatchCreate、DispatchClose、DispatchIoControl、DispatchCleanup、DispatchPnp、DispatchPower。
AddDevice是WDM驱动程序另一个入口函数,当DriverEntry初始化成功后,PnP管理器会调用AddDevice创建一个FDO,然后把总线驱动程序创建的PDO连接到FDO上,同时还会创建一个设备扩展对象。本文在设备扩展对象中保存了DMA缓存地址、设备寄存器地址和一些标志位。AddDevice还寄存了一个设备接口,以便应用程序打开设备。
接着,PnP管理器向驱动程序堆栈发送一个PnP启动消息,它是一个主功能代码为IRP_MN_START_DEVICE的IRP。驱动程序并不处理该IRP,只是将它传递给总线驱动程序处理并等待该IRP的处理结果,总线驱动程序将获得的设备资源(中断、DMA通道、内存和I/O资源等)保存在IRP中并通知驱动程序取出这些信息保存在设备扩展对象中。于是,驱动程序就可以根据这些信息对PEX8311进行操作了。
4.2 数据传输初始化
数据传输初始化是在DispatchIoControl派遣例程中实现的。功能驱动程序正常装入后,应用程序就可以发出DeviceIoControl请求初始化数据传输。初始化包括接收用户程序传来的事件句柄、分配DMA缓存、设置中断寄存器。
驱动程序采用事件方式与应用程序进行通信。应用程序中用CreateEvent创建事件hEvent,再调用DeviceIoControl函数将它传给驱动程序,驱动程序响应该请求,从输入缓冲区中取出这个事件句柄存在设备扩展对象中。当驱动程序将该事件设置为信号状态时,应用程序就可以得到通知。
驱动程序通过函数AllocateCommonBuffer分配的一段非分页、连续的DMA缓存,用于缓存从PEX8311传来的雷达数据。为了使应用程序能够直接访问DMA缓存,本文通过函数MmMapLockedPages把这段内存映射到应用程序。每次DMA读取512KB数据,本文分配了60段512KB的连续DMA缓存,驱动程序依次将每次读取的数据存在这些连续的缓存中,而应用程序按相同的顺序取出数据存在SCSI硬盘上。即使应用程序在下次LINT#中断到来时还没及时将缓存中数据写到SCSI硬盘上,驱动程序也会启动DMA将新数据存在下一段缓存中,不会丢失数据。
驱动程序设置PEX8311的中断寄存器,允许LINT#中断和PCI中断。允许LINT#中断可以使LINT#信号处于可用状态,而允许PCI中断可以将LINT#中断和DMA中断路由到计算机系统,操作系统就能调用中断服务程序响应中断。
4.3 数据传输模块
《基于PCI Express总线的雷达数据记录器驱动程序开发》相关文章
- › 基于PCI总线的实时测频卡WDM驱动程序设计
- › 基于PCI9054的接口卡
- › 基于PCI总线芯片CH365的数据密码卡设计
- › 基于PCI Express总线的雷达数据记录器驱动程序开发
- › 基于PCB油墨高效自动搅拌技术
- › 基于PCI总线和DSP芯片的图像处理平台的硬件设计
- 在百度中搜索相关文章:基于PCI Express总线的雷达数据记录器驱动程序开发
- 在谷歌中搜索相关文章:基于PCI Express总线的雷达数据记录器驱动程序开发
- 在soso中搜索相关文章:基于PCI Express总线的雷达数据记录器驱动程序开发
- 在搜狗中搜索相关文章:基于PCI Express总线的雷达数据记录器驱动程序开发