Windows平台下PCI9054的驱动程序的研究

时间:2022-10-01 08:03:13

Windows平台下PCI9054的驱动程序的研究

[摘 要] 研究了使用DriverStudio在windowsXP平台下pci9054芯片的驱动开发,从几个关键方面入手,从而编写驱动程序。

[关键词] 驱动程序;PCI总线;DriverStudio;DMA;配置空间

PCI的含义为外设部件互联,它支持64位数据传送,多总线主控和线性突发方式,其数据传输率最大可大528Mb/s.

在PCI设备插入PCI插槽上电后,总线配置机构自动根据PCI设备的要求实现配置。在WindowXP系统中,为了保证系统运行的安全性和可移植性,对应用程序在硬件上的操作做了限制。不支持直接对系统硬件资源的操作。

DriverStudio是用于Windows设备驱动程序的开发和应用程序开发的软件,它包括DriverAgent,VtoolsD,Driverworks等功能强大的模块。DriverAgent用于快速生成硬件测试的驱动程序。VtoolsD提供了VxD编程全线C++类库支持;DriverWorks能自动生成设备驱动程序源框架。总之,DriverStudio的强大性能使得驱动程序的编写不再困难。

1、驱动开发环境

驱动开发环境的安装顺序:先安装VC++,再安装DDK,最后安装DriverStudio在Windows下开发驱动程序需要安装DDK(Driver Development Kit)。DriverStudio集成开发环境对DDK提供的函数进行封装,以类的形式提供方便的接口,同时提供方便编程的程序生成向导,提高开发效率,因此,该集成开发环境被广泛应用。

2、DMA传输

使用DMA的目的是最小化CPU介入数据传输操作,要做到这一点,DMA设备使用了一个辅助处理器,叫作DMA控制器,用来在内存和设备之间传输数据。这样就允许CPU在进行I/0操作的同时继续做其他有益的工作。

DriverWorks为我们提供了三个类:KDmaAdapter、KDmaTransfer和KCommonDmaBuffer,用于实现DMA操作。KdmaAdapter类用于建立一个DMA适配器,它标明一个DMA通道的特性和提供串行化访问的服务。KdmaTransfer类用于控制DMA的传输,启动一个DMA传输、DMA传输数据缓冲区物理地址和传输字节数、以及DMA传输结束后数据由公用缓冲区拷贝到应用程序数据缓冲区,这些工作都是由KdmaTransfer类实现的。KCommonDmaBuffer类用于申请系统提供的公用缓冲区,对于DMA操作,系统提供了一个特殊的内存,即物理上连续的内存,称为公用缓冲区。对于支持分散,聚集DMA的设备,因其并不要求在物理上连续的内存,可以不使用公用缓冲区。

3、中断管理

PCI设备的中断是可以共享的,电瓶触发,在指定中断引脚寄存器指定INTA#给PCI板卡,即给INTPIN赋值为1.中断线寄存器INTLN是PCI板卡用来向主机系统声明自己希望申请的系统终端资源IRQ号。Plx9054_IntEnable(hPlx9054,AddressOfPlx9054_IntHandlerRoutine)是实现中断的关键库函数,在Plx9054_IntEnable中封装了InterruptThreadEnable中断使能函数,Plx9054_IntHandlerRoutine是中断处理例程,在中断服务程序中完成充电和逆变控制。

4、访问PCI配置空间

遵循PCI标准的设备为其配置信息提供了一个独立的地址空间,每个PCI卡都有1到8个函数,并且每个函数都有自己配置信息的存储空间,空间为256个字节,其中前64个字节是头信息。PCI协议定义了多种头信息格式,通常头信息是通过结构体PCI_CONFIG_HEADER_0来定义的。

驱动程序通过类KPciConfiguration可以访问一个PCI设备配置信息。在使用这个类之前,首先要了解PCI设备的信息,如VenderID等。按照下列步骤可以建立访问PCI设备的配置信息的驱动程序:(1)声明一个类KPciConfiguration型对象,这个对象通常在构造体中接受参数VenderID和DeviceID。如:#define VENDOR_ID 0x7CE0#define DEVICE_ID 0X1000KPciConfiguration MyPciCFG(VENDOR_ID,DEVICE_ID);(2)测试构建是否正确,如果为真,则对这个PCI设备正确定位;(3)申请设备需要资源。一般通过类KResourceRequest和KResourceAssignment来进行资源申请及分配。当然KResourceAssignment一般只能使用一次;(4)对于支持多个PCI设备系统主板来说,驱动程序必须列举这些设备并且产生相应的设备对象。

5、PLX9054驱动程序

PLX9054芯片是PLX公司推出的PCI桥接芯片,该芯片符合PCI规范2.2标准,它带有两个独立的DMA控制器,支持32位/33MHz、内部有6种可编程FIFO存储器。应用较广泛。

程序的入口函数DriverEntry中,主要的逻辑功能是指定该驱动程序的各个功能函数的入口:

pDriverObject->DriverUnload = DriverUnload;

pDriverObject->MajorFunction[IRP_MJ_CREATE] = Dispatch_Create;

pDriverObject->MajorFunction[IRP_MJ_CLOSE] = Dispatch_Close;

pDriverObject->MajorFunction[IRP_MJ_READ] = Dispatch_Read;

pDriverObject->MajorFunction[IRP_MJ_WRITE] = Dispatch_Write;

pDriverObject->MajorFunction[IRP_MJ_CLEANUP] = Dispatch_Cleanup;

pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Dispatch_IoControl;

pDriverObject->MajorFunction[IRP_MJ_PNP] = Dispatch_Pnp;

pDriverObject->MajorFunction[IRP_MJ_POWER] = Dispatch_Power;

pDriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = Dispatch_SystemControl;

pDriverObject->DriverExtension->AddDevice = AddDevice;

根据这些指定的函数入口,操作系统对该驱动的各种操作都在这些函数中响应。比如,函数AddDevice在驱动程序启动的时候调用,功能是创建一个设备对象,并将其安装到设备堆栈中。IRP_MJ_READ命令对应函数Dispatch_Read,在设备需要向系统传递数据时执行该函数。

6、驱动程序的调试

编写设备驱动程序需要对操作系统底层有一定的了解,并且需要程序员有一定的硬件知识背景。而且驱动程序工作在具有最高权限的Ring0层,程序行为处在无保护状态,不当的驱动程序可能使设备工作不正常,干扰其他设备,严重的可以引起系统崩溃。所以程序员必须保证驱动程序可靠。驱动程序的调试成为了开发难点之一。本设计采用了NuMega公司开发的SoftIce作为调试工具,SoftIce功能强大,可以在单片机上运行。本设计的驱动程序调试过程如下:(1)首先用SoftIce产生IO读写信号以确认硬件设备正常运行;(2)使用SoftIce产生断点或调试宏跟踪驱动程序。确认驱动程序正常装载;(3)使硬件发送有规律的数据,通过查看内存数据,以确认数据传输的正确;(4)对于最核心的中断响应代码,可以用SoftIce的Genint命令产生虚拟中断,单步跟踪中断响应函数;(5)测试在各种工作条件下驱动程序的可靠性与实时性。

参考文献:

[1]杨波,柳征,姜文利.WindowsXP环境下的PCI设备驱动程序设计[J].科技信息,2007.(1):9-10.

[2]张宏超.Windows平台下PCI设备驱动程序开发[J].信息化研究,2010.36(2):41-44.

[3]王峰,张文军,余松煜.PCI设备驱动程序中几个关键问题的设计与实现[J].测控技术.2003.21(8):58-60.

作者简介:金 鹏,重庆交通大学。

上一篇:对“中职”计算机教学方法的探讨 下一篇:关于选煤厂计算机集成监控系统的开发研究