基于PCI总线的实时测频卡WDM驱动程序设计

[09-13 16:56:10]   来源:http://www.88dzw.com  接口定义   阅读:8762

文章摘要:在WDM模型中,每个硬件设备至少有两个驱动程序:总线驱动程序和功能驱动程序。总线驱动程序由操作系统实现,它在最底层直接与设备打交道,负责管理硬件与计算机的连接;负责发现总线上所有的设备,并检测设备何时添加到总线上或何时从总线上删除。设备功能驱动程序在上层通过与低层驱动程序打交道,进行硬件操作,以实现PCI设备的功能。中间还可以有类过滤驱动程序或设备过滤驱动程序用于修改和监视IRP(I/O请求包),实现数据的过滤或转换。一般在特殊的情况下才需要编写。在实际开发中,只需要开发一个设备功能驱动程序即可。WDM还引入了功能设备对象(Functional DeviceObject,FDO)与物理设备对象

基于PCI总线的实时测频卡WDM驱动程序设计,标签:接口技术,微机原理与接口技术,http://www.88dzw.com


  在WDM模型中,每个硬件设备至少有两个驱动程序:总线驱动程序和功能驱动程序。总线驱动程序由操作系统实现,它在最底层直接与设备打交道,负责管理硬件与计算机的连接;负责发现总线上所有的设备,并检测设备何时添加到总线上或何时从总线上删除。设备功能驱动程序在上层通过与低层驱动程序打交道,进行硬件操作,以实现PCI设备的功能。中间还可以有类过滤驱动程序或设备过滤驱动程序用于修改和监视IRP(I/O请求包),实现数据的过滤或转换。一般在特殊的情况下才需要编写。在实际开发中,只需要开发一个设备功能驱动程序即可。

  WDM还引入了功能设备对象(Functional DeviceObject,FDO)与物理设备对象(Physical Device Object,PDO)来描述硬件。一个PDO对应一个真实的硬件,一个硬件只允许有一个PDO,却可以有多个FDO。在驱动程序中直接操作的不是硬件而是相应的PDO与FDO。当应用程序与WDM驱动程序进行通信时,系统为每一个用户请求打包,形成一个I/O请求包(IRP)结构,将其发送到驱动程序,并通过识别IRP中的PDO来区别是发送给哪一个设备。IRP从驱动程序堆栈栈顶进入,每层驱动再把I/O请求划分成更简单的请求,以传给更下层的驱动执行,最底层的驱动程序在收到IRP后,通过硬件抽象层HAL与硬件发生作用,从而完成I/O请求工作。内核通常通过发送IRP来运行驱动程序中的代码。

  4测频卡WDM驱动程序实现

  在微软公司DDK工具的支持下,Compuware Nu-Mega公司提供Driver Studio工具包中的DriverWorks将WDM驱动程序编写所需的对内核及对硬件的访问封装成类库,加上驱动程序代码生成向导DriverlWizard,极大地简化了驱动程序的开发难度。本文选择DriverWorks作为WDM驱动程序的开发工具。

  测频卡驱动程序的主要功能是为用户读取所测信号的频率参数,包括载频、调制方式、码元速率等。同时用户还能通过驱动程序发送命令对测频卡的工作方式进行控制。由此可知,驱动程序要重点处理好硬件访问和中断处理工作。

  4.1I/O访问

  类KIoRange封装了对I/O端口的操作。本卡中PCI配置寄存器中的Base 2基地址寄存器定义了I/O空间。在OnstartDevice例程中取得I/O资源,并初始化,其函数实现如下:



  完成初始化后,可以用成员函数inb,inw,ind从I/O端口读一个(多个)字节、字、双字的数据;outb,outw,outd向I/O端口写一个(多个)字节、字、双字的数据。

  4.2内存访问

  在Windows系统中,内存分为分页内存和非分页内存。在WDM驱动程序中,对于硬件的内存映射一般需要用非分页内存。因为在一些较高级别的例程中,使用分页内存会造成系统产生缺页中断,从而引起死锁。使用非分页内存无需太多的转换,非常安全,效率也高。类KMemoryRange封装了对PCI设备映射内存的操作。类KMemoryRange成员函数的读/写操作同类KIoRange。由PCI配置寄存器中的Base 0和Base 1基地址寄存器分别定义了两个内存空间。在OnstartDevice例程中取得内存资源并初始化,其函数实现如下:

  Status=m_MemoryRange0.Initialize(pResListTranslated,pResListRaw,PciConfig.BaseAddresslndexToOrdinal(0));

  Status=m_MemoryRangel.Initialize(pResListTranslated,pResListRaw,PeiConfig.BaseAddresslndexToOrdinal(1));

  4.3中断处理

  中断处理一般需要声明两种类实例:Klnterrupt和KDeferredCall。Kinterrupt类用于实现硬件中断处理;KDeferredCall类用于实现延时过程调用。首先创建一个Klnterrupt类实例m_Irq,将此实例作为设备类的成员变量,然后创建一个KDeferredCall类实例m_DpcFor_Irq。m_Irq对应的中断服务例程和m_DpcFor_Irq对应的延时过程调用例程也需要在实例中声明。这两个实例m_Irq和m_DpcFor_Irq都是在OnstartDevice例程中初始化的,代码如下:

上一页  [1] [2] [3]  下一页


Tag:接口定义接口技术,微机原理与接口技术接口定义
分类导航
最新更新
热门排行