基于PCI总线的实时测频卡WDM驱动程序设计方案
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例程中初始化的,代码如下:
status=m_Irq.InifializeAndConnect(pResListTranslated,LinkTo(Isr_Irq),This);
m_DpcFor_Irq.Setup(LinkTo(DpeFor_Irq),this);
中断服务例程的处理时间应尽量短,对于一些耗时,但不需要立即处理的任务,中断服务程序会调用一个低于中断服务程序DIRQL级别的延迟过程调用程序DPC,在DISPATCH_LEVEL上完成处理,这个级别上的限制较少,函数调用也相对比较方便。在中断服务例程中,首先判断中断是否是自己设备产生的,若不是,返回FALSE;若是,进行必要的处理,请求一个DPC(延时过程调用),然后返回TRUE。关键代码如下:
在延时过程调用例程DpcFor_Irq中,读取所测信号的频率参数:
5驱动程序与应用程序之间的通信
虽然驱动程序是为设备的硬件层编程服务的,但同样需要提供和应用程序进行通信的能力,从而最终达到应用程序控制设备的目的。应用程序与驱动程序之间的通信通过调用Win32 API来实现,应用程序用Creatfile函数通过已经定义的设备接口来获取驱动程序文件句柄,然后将文件句柄作为其他Win32 API函数的一个参数,对驱动程序的进行数据操作。调用DeviceloControl进行数据量较小的,如控制指令传输或端口、寄存器访问;调用ReadFile,WriteFile等函数进行数据量较大的传输,如内存读/写等。驱动程序与应用程序的通信有DeviceControl异步完成、共享Win32事件通知两种方式。Win32事件通知是由应用程序创建了一个事件后,设置事件的状态为Unsignal,然后直接将该事件句柄传递给驱动程序,等待驱动程序发送事件通知。驱动程序通过类Kevent获取这个事件的一个对象指针后,在IRQL≤DISPATCH_LEVEL级别的例程中设置事件信号状态为Signal来通知应用程序进行后续处理。
6结语
基于上述的硬件结构和驱动程序设计方法,成功开发了一款实时测频卡,在实际中得到了很好的应用,板卡工作正常,达到了预期效果。实践证明,DriverWorks是一款功能强大,使用方便的驱动程序开发工具,利用它可以方便快捷地构造PCI设备的驱动程序框架,大大加快了开发周期,提高了开发效率。
驱动 程序设计 方案 WDM 实时 PCI 总线 基于 相关文章:
- 声卡安装向导中文版(11-12)
- VxWorks实时操作系统下MPC8260ATM驱动的实现(11-11)
- Linux内核解读入门(11-09)
- Linux操作系统网络驱动程序编写(04-11)
- Linux系统下USB摄像头驱动程序开发(04-25)
- Linux系统中如何正确安装摄像头驱动(04-25)