APP下载

超声相控阵系统中PCI驱动开发研究

2015-09-08施成龙师芳芳孔超张碧星

声学技术 2015年3期
关键词:驱动程序相控阵中断

施成龙,师芳芳,孔超,张碧星



超声相控阵系统中PCI驱动开发研究

施成龙,师芳芳,孔超,张碧星

(中国科学院声学研究所声场声信息国家重点实验室,北京100190)

超声相控阵系统的数据传输速率很大程度上决定着其检测速度,因而在PCI总线的超声相控阵系统中,PCI驱动执行效率至关重要。详细阐述了利用WinDriver、DriverStudio和WDK(Windows Driver Kit)三种工具开发PCI驱动程序的方法及实现。在驱动效率和兼容性等方面上比较这三种不同的驱动开发方案。分析及测试结果表明,使用DriverStudio开发的驱动能够高速稳定地工作,满足超声相控阵系统对于数据传输速率和稳定性的要求。由于不同的应用有着不同的开发需求,提出根据特定的开发需求选择不同的开发方案,从而得到需要的驱动及其应用程序。

相控阵;PCI总线;驱动程序

0 引言

超声相控阵检测技术是近年发展起来的一种超声无损检测技术,这种技术能方便控制声束焦点和方向,提高检测信号的信噪比,具有灵活、快速、可靠、准确等特点。超声相控阵技术最主要的特点是采用超声阵列发射和阵列接收的方式,通过控制阵列上各个阵元激励信号的延时和幅度,实现动态聚焦和偏转。超声相控阵技术的出现在提高了在线检测精度的同时大大提高了检测速度[1]。

由于超声探伤要求的不断提高,超声相控阵检测系统的独立通道数随之增加,国外的超声相控阵检测系统Dynary独立通道数达到了256个,TOPAZ的独立通道数也达到了256个。独立通道数的增加导致数据量的激增,由此产生了高速实时数据传输的需求。在众多的高速实时数据传输解决方案中, USB2.0传输速率可达60 MB/s,PCI总线数据传输速率达133MB/s[2],PCI-Express总线数据传输速率达16GB/s。USB2.0的CPU占用率较高,不适用于超声相控阵系统,PCI及PCI-Express均满足超声相控阵系统数据传输速率的要求,但PCI-Express的通用性没有PCI好,而PCI总线接口则是目前计算机中使用最为广泛的接口[3-5],因此本文选择PCI总线作为开发超声相控阵系统的数据总线。

为了能够正常使用PCI总线进行高速数据传输,必须开发相应平台下的设备驱动程序。在Windows平台下,存在着WDM(Windows Driver Model)和WDF(Windows Driver Foundation)这两种模型的驱动程序,后者以前者为基础进行了建模和封装,降低了开发难度。

本文根据笔者编写PCI9656驱动的实际经验,阐述了开发PCI设备WDM和WDF驱动程序的方法流程和实现,并通过对于不同驱动的性能进行比较,得到在不同开发条件下的最优方案。

1 超声相控阵系统

本文所涉及开发的超声相控阵系统结构如图1所示:

主机板通过PCI总线从多个数据采集板获得超声回波数据,对得到的数据进行处理并进行成像显示和分析,如图2所示。

在这样的结构中,若主机板没有及时通过PCI接口芯片将数据采集板中的回波数据取出,那么数据会由于不断堆叠而造成溢出,从而导致主机板得到的传输数据错位、解析错误等一系列问题,因此系统中设备PCI驱动的执行效率至关重要。

2 WDM驱动开发

2.1 WDM驱动模型介绍

WDM(Windows Driver Model)是微软公司开发出的一种驱动程序开发模型,属于操作系统的内核模式。WDM驱动基于分层的模式实现,不同层上的驱动程序有着不同的优先级[6]。其中与系统连接最紧密的是底层总线,总线驱动也是最为复杂的部分。目前总线驱动通常由操作系统提供,驱动开发者只需开发设备驱动以及可能需要的过滤驱动[7]。图3所示为WDM驱动模型层次结构图。

WDM驱动程序开发工具主要有三种[8]:DDK(Device Development Kit)、WinDriver与DriverStudio。DDK是微软提供的一套用于开发Windows下设备驱动程序的工具包,虽然用其开发的程序执行效率高,但由于采用DDK开发驱动程序需要阅读大量的DDK文档,深入了解操作系统的内核工作方式和驱动程序的工作细节,开发难度大,开发周期长;WinDriver是Jungo公司出版的驱动程序开发组件,采用其开发驱动难度较低,花费的时间很少,它不需要开发者了解操作系统的内核和驱动程序的内部机制,事实上开发者只需定制和调用它提供的通用驱动而已,因此程序的执行效率不高;DriverStudio是一套NuMega公司为简化Windows设备驱动程序和应用程序的开发而提供的集编写、编译和调试为一体的软件工具包,它的函数库封装了针对驱动程序的各种通用操作,大大减少了驱动程序的代码长度,而由于它开发的驱动程序本质上是在调用DDK库函数,所以执行效率与DDK相当。

综上所述,由于DDK开发WDM驱动无论在开发时间和代码效率上都没有明显优势,因此通常采用其他两种开发工具来开发WDM驱动。

2.2 WinDriver开发工具

WinDriver可以方便Windows程序员快速开发出PCI/ISA设备的Windows驱动程序。它的体系架构分为两种模式:用户模式和核心模式。对硬件进行操作时,开发者调用用户模式的库函数,用户模式的库函数再调用核心模式完成对硬件的最终访问[9]。其与硬件设备、用户驱动程序、用户应用程序之间的关系即体系结构如图4所示。

使用WinDriver开发驱动大致为三个步骤:

(1) 选择硬件

从开始菜单里,选择WinDriver|DriverWizard,运行DriverWizard程序。DriverWizard将会显示机器上的所有即插即用设备,在列表中选择需要开发驱动的硬件设备。

(2) 产生驱动程序代码

使用DriverWizard产生驱动程序代码,程序操作硬件的内核级API函数,对设备进行读写操作。

(3) 根据实际需求修改驱动程序代码

本文需要对多块超声回波信号数据采集板进行寄存器读写和DMA读写,因此需要开发的应用程序框架如图5所示。

其中各个步骤所涉及到的WinDriver API函数为:

(a) 初始化设备

首先使用PLX_LibInit函数初始化WinDriver的库,然后使用WDC_PciScanDevices函数扫描硬件并获取驱动句柄。

(b) 打开设备

使用PLX_DeviceOpenBySlot函数根据设备的ID号寻找并打开设备。

(c) 访问设备资源

使用WDC_WriteAddr32函数写寄存器,使用WDC_ReadAddr32读寄存器。

通过PLX_DMAOpen、PLX_DMAStart、PLX_DMAPollCompletion和PLX_DMAClose这四个函数来进行DMA读写。

(d) 关闭设备

使用PLX_DeviceClose函数关闭打开的设备。

(e) 关闭WinDriver处理接口

使用PLX_LibUninit函数卸载库并关闭WinDriver处理接口。

2.3 DriverStudio开发工具

DriverStudio以面向对象的方式,将驱动程序编写所需的与内核访问及对硬件的访问封装成类,加上设计的驱动程序代码生成向导,大大简化了驱动程序开发的难度,减少了工作量。同时,DriverStudio被嵌入到VC中,方便了开发[10]。

使用DriverStudio开发PCI驱动主要有三个步骤:

(1) 利用DriverWizard生成PCI设备驱动程序框架

DriverWizard是DriverStudio创建框架程序的工具,它能够生成驱动程序的基本框架和用户自定义信息,虽然没有实现设备的具体功能,但对于功能的实现设置了框架,方便用户添加功能代码。创建程序框架共有11个步骤,一般采用默认设置,关键步骤如下:

(a) 第4步,选择设备的总线类型并填写硬件类型。

本文开发的是PCI9656的驱动,因此这里选择PCI总线。PCI Vendor ID是厂商标识符,为10B5;PCI Device ID是设备标识符,为9656;PCI Subsystem ID为子系统ID号,为965610B5;PCI Revision ID是修订号,为BA。

(b) 第7步,选择IRP串行处理类型。

当多个应用程序同时对PCI设备进行I/O操作时,需要对这些请求进行串行化处理,通常选择系统处理。

(c) 第9步,选择设备文件类名和接口。

在Resources项中,选择需要被使用的硬件资源如:存储空间,I/O空间,中断和DMA等。在本例中需要用到的资源有:基地址为0的存储空间、基地址为2的存储空间、中断和DMA。

在Interface中,可以选择应用程序打开设备的方式:用GUID接口或符号链接名。GUID是一种说明软件访问硬件过程的命名方案,一个128位GUID唯一标识一个设备接口。若使用GUID接口方式的话必须每一个数字板都对应一个唯一GUID标识的驱动,这代表了驱动无法复用。而符号链接名(symbolic link name)的主要用途是把DOS的名称连接到设备上。当多块相同配置的PCI板卡插入PCI插槽时,可以使用同一个PCI驱动,因此选择符号链接名的方式。Interface配置如图6所示。

(d) 第10步,定义驱动与应用程序之间通信的DeviceIoControl控制代码。

需要使用驱动来完成对于硬件设备寄存器与DMA读写的操作,而DMA读写只需调用Windows API函数Readfile和Writefile即可,因此定义的功能为:读写寄存器、读写DMA地址。配置如图7所示。

最后一步选择生成与驱动通信的应用程序,单击Finish完成驱动程序框架。

(2) 在已完成的驱动框架中添加功能代码

(a) 内存的访问

KMemoryRange类封装了对于内存的操作,实现对内存映射芯片的访问。在生成的驱动框架中已经完成对于资源的定义、初始化及卸载,只需要在DeviceIoControl控制代码函数中加入对于资源的读写即可。

资源定义代码如下:

KMemoryRange m_MemoryRange0;

KMemoryRange m_MemoryRange2;

在使用资源前,需要对资源进行初始化,将WDM中得到的PCI总线配置机构分配的物理内存转换成系统可以访问的非分页内存,驱动框架中的OnStartDevice函数已经提供了该操作:

status = m_IoPortRange0.Initialize(

pResListTranslated,

pResListRaw,

PciConfig.BaseAddressIndexToOrdinal(0)

);

初始化后,就可以通过类中自带的硬件访问函数来设置内存:

m_MemoryRange0.outd(INTCSR,0);

m_MemoryRange2.ind(Offset,pOutBuffer,count);

在驱动停止运行之前,需要对于资源进行卸载操作,驱动框架已经在Invalidate函数中提供:

m_MemoryRange0.Invalidate();

m_MemoryRange2.Invalidate();

(b) 中断处理

KInterrupt类实现硬件中断处理。其成员函数包括中断的初始化,及将一个中断服务例程连接到一个中断和解除其连接的操作等。

中断服务例程不是KInterrupt类的成员函数,这样做的目的是减少中断延迟时间。

中断处理需要中断服务例程和延迟过程调用例程,需要声明,在驱动程序框架中已经提供:

MEMBER_ISR(PCIRegDevice, Isr_Irq);

MEMBER_DPC(PCIRegDevice, DpcFor_Irq);

BOOLEAN Isr_Irq(void);

VOID DpcFor_Irq(PVOID Arg1, PVOID Arg2);

KInterrupt m_Irq;

KDeferredCall m_DpcFor_Irq;

驱动程序框架在OnStartDevice函数中初始化中断变量并调用宏LinkTo连接中断例程:

status = m_Irq.InitializeAndConnect(

pResListTranslated,

LinkTo(Isr_Irq),

this

);

m_DpcFor_Irq.Setup(LinkTo(DpcFor_Irq), this);

在中断服务例程中,首先判断该中断是否为需要处理的中断,若不是,返回False;若是,进行必要的处理,请求一个DPC,然后返回True。这里需要处理的是DMA中断,因此Isr_Irq函数判断的是中断寄存器(PCI9656中为0x68[11])的某个特定位是否为1。

在驱动程序停止前,需要调用KInterrupt成员函数来断开中断并释放资源:

m_Irq.Disconnect();

Invalidate();

(c) DMA传输

DriverWorks提供了三个类:KDmaAdapter 、KDmaTransfer和KCommonDmaBuffer类,用于实现DMA操作。KDmaAdapter类用于建立一个DMA适配器,它说明DMA通道的特性。KDmaTransfer类用于DMA传输控制。KCommonDmaBuffer类用于申请系统提供的公用缓冲区。具体参数的定义与初始化在驱动框架中提供。

DMA传输编程通常涉及SerialRead/Serial Write、OnDmaReady、StartDMA、Isr_Irq和DqcFor_Irq例程。其中DMA准备就绪回调例程,至少会调用两次。

第一步在SerialRead/SerialWrite中启动DMA读写传输:

status = m_CurrentTransfer->Initiate(

this,

&m_Dma,

I.Mdl(),

(I.MajorFunction() == IRP_MJ_READ) ? FromDeviceToMemory : FromMemoryToDevice,

LinkTo(OnDmaReady),

&m_Buffer

); //此操作将使系统调用OnDmaReady例程

第二步,获取要传输的物理内存的地址和字节数,调用StartDMA例程:

StartDMA(ptd->td_PhysAddr.LowPart,ptd->td_Length, readTag);

第三步,DMA传输结束后,产生中断,Isr_Irq例程处理并清除中断后,请求DqcFor_Irq例程:

m_MemoryRange0.outd(DMAMODE0,0x20800);//先禁止中断

m_MemoryRange0.outb(DMACSR0,0x10);

//再清除中断

if (!m_DpcFor_Irq.Request(NULL, NULL))

{

}

第四步,DMA结束,完成IRP。

如此四步,完成DMA传输。

(3) 调用驱动程序完成所需功能

本文需要对于多块超声回波信号的数据采集板进行寄存器读写和DMA读写,而由于并不需要调用库函数,因此需要开发的应用程序框架如图8所示。

(a) 打开设备

由于驱动框架生成过程中选择的是通过符号链接名的方法打开设备,因此当所有数字板都装上生成的驱动后,板卡命名规律是“PCI9656Device+数字位”,其数字位自动+1,如第1块板卡的符号链接名是“PCI9656Device0”,第2块板卡就是“PCI9656Device1”,依此类推,第N块板卡是“PCI9656DeviceN-1”。通过CreateFile函数得到驱动句柄:

char *sLinkName[N] = {"\\.\PCIRegDevice0", "\\.\PCIRegDevice1", ..., "\\.\PCIRegDeviceN-1", "\\.\PCIRegDeviceN"};

CreateFile(sLinkName[itag],

GENERIC_READ | GENERIC_WRITE,

FILE_SHARE_READ,

NULL,

OPEN_EXISTING, 0, NULL);

通过修改itag参数来打开不同的板卡,在此基础上可以通过枚举识别插入板卡数目。

(b) 访问设备资源

通过DeviceIoControl函数与WDM驱动进行通信,对其进行设置寄存器和DMA地址的操作。

使用ReadFile和WriteFile函数进行读写DMA的操作,由于ReadFile/WriteFile有固定的输入参数,因此DMA地址如果不固定的话,需要由DeviceIoControl函数修改。

(c) 关闭设备

通过CloseHandle函数关闭设备。

3 WDF驱动开发

3.1 WDF驱动模型介绍

WDF(Windows Driver Foundation)是微软在WDM基础上改进而来的最新一代驱动程序模型。它采用基于对象的技术,精心设计了对象模型并进行了封装,为驱动程序设计人员提供了面向对象、事件驱动的驱动程序开发框架[12]。WDF改变了操作系统内核与驱动程序之间的关系,WDM驱动程序中,一方面要处理硬件,另一方面要处理驱动程序与操作系统内核的交互。而WDF则将驱动程序与操作系统内核之间进行了分离,驱动程序与操作系统交互工作交给框架内封装的方法完成[13],这样驱动开发者只需专注处理硬件的行为即可,避免了直接与操作系统内核交互,不仅大大简化了驱动程序的编程,还提高了整个系统的可靠性和稳定性。

WDF有KMDF(Kernel-Mode Driver Framework)和UMDF(User-Mode Driver Framework)两种模式,其中前者用于内核模式,后者用于用户模式。而需要开发的PCI9656驱动使用的是KMDF模式,代码效率较高。

3.2 WDF驱动开发步骤

与WDM驱动开发类似,WDF驱动开发也有三个步骤:

(1) 生成驱动框架

本文所用的开发环境为Microsoft Windows Driver Kit(WDK) 7.1.0.7600和Visual C++ 6.0。由于微软并没有提供创建KMDF框架驱动程序的工具,因此当要创建一个KMDF驱动程序时,需要按照以下步骤进行。

(a) 从已安装的WDK目录下src文件中拷贝一个KMDF实例驱动程序到自己创建的文件夹目录下。由于开发的是PLX公司的PCI9656的驱动,因此可以选择general文件夹下的PLX9x5x文件夹。

(b) 将dirs文件中内容修改为:DIRS=sys。

(c) 将该实例驱动程序中驱动程序文件名与安装程序文件名修改为自己需要的文件名。

(d) 利用GUIDGEN生成设备接口GUID,并根据需要定义设备IO命令。

(2) 在生成的驱动框架下添加功能代码

(a) 硬件访问

KMDF提供了访问存储器映射设备的函数,驱动程序需根据配置空间定义地址指针。驱动程序编写主要包括以下步骤:

(i) 根据配置定义地址指针。

typedef struct _DEVICE_EXTENSION {

PPCI9656_REGS Regs; // Registers address

PUCHAR RegsBase; // Registers base address

ULO RegsLength; // Registers base length

PUCHAR SRAMBase; // SRAM base address

ULONG SRAMLength; // SRAM base length

} DEVICE_EXTENSION, *PDEVICE_EXTENSION;

需要读写的为Bar0与Bar2的两块存储器空间。

(ii) 在PLxPrepareHardware例程中,初始化地址指针。

首先用WdfCmResourceListGetCount函数获取配置资源个数,用WdfCmResourceListGetDescriptor函数获取该资源描述符,其类型属性Type包括CmResoureTypePort(I/O端口)、CmResourceType Memory(存储器)等。对于存储器地址,要先用MmMapIoSpace函数将物理地址转换成系统内核模式地址,然后保存在之前定义的指针中。

(iii) 在PLxEvtDeviceReleaseHardware例程中,对于存储器地址,要用MmUnmIoSpace函数解除物理地址与系统内核模式地址的关联。

(iv) 当需要访问存储器空间时,可使用KMDF提供的函数。

WRITE_REGISTER_ULONG((PULONG)(pReg+n),value);

其中参数都是由应用程序设置并通过DeviceIoControl传输给驱动程序。

(b) 中断处理

DMA传输结束后会产生中断,需要对这个中断进行处理。KMDF中使用WDFINTERRUPT对象实现硬件中断的处理。

中断处理主要包括以下3个步骤:

(i) 在设备环境变量结构中声明中断对象。

WDFINTERRUPT Interrupt;

(ii) 在EvtDeviceAdd例程中,创建中断对象。

WDF_INTERRUPT_CONFIG_INIT( &InterruptConfig, PLxEvtInterruptIsr, PLxEvtInterruptDpc );

status = WdfInterruptCreate( DevExt->Device, &InterruptConfig, WDF_NO_OBJECT_ATTRIBUTES, &DevExt->Interrupt );

(iii) 中断服务例程编程。

在中断服务例程中,首先判断该中断是否是需要处理的中断,在本例中即为是否DMA结束,若不是,则返回FALSE;若是,则进行必要的处理,并返回TRUE。

(c) DMA传输

KMDF提供了三个对象实现DMA操作:WDFDMAENABLER、WDFDMATRANSACTION和WDFCOMMONBUFFER。WDFDMAENABLER对象用于建立一个DMA适配器,它说明DMA通道的特性;WDFDMATRANSACTION对象用于DMA传输控制;WDFCOMMONBUFFER对象用于申请系统提供的公用缓冲区。

DMA传输的具体步骤如下:

(i) 在设备环境变量结构中声明三个对象。

(ii) 在PLxEvtDeviceAdd例程中分别使用WdfDmaEnablerCreate、WdfCommonBufferCreate和WdfDmaTransactionCreate例程创建DMA的三个对象。

(iii) DMA传输编程。

当有I/O请求时,在PLxEvtIoRead/PLxEvtIoWrite

例程中,用WdfDmaTransactionInitializeUsingRequest

或WdfDmaTransactionInitialize函数初始化DMA传输,调用WdfDmaTransactionExecute函数,启动DMA传输。

在函数

PlxEvtProgramReadDma/PLxEvtProgramWriteDma中,对于硬件的DMA操作寄存器进行设置。

当DMA传输中断发生后,在PLxEvtInterruptDpc

例程中,判断DMA传输是否结束,没有则调用WdfDmaTransactionExecute函数,继续启动DMA传输;若DMA传输结束,则完成I/O请求。

(3) 调用驱动程序完成所需功能

本文需要对于多块超声回波信号数据采集板进行寄存器读写和DMA读写,因此需要开发的应用程序框架如图9所示。

(a) 打开设备

通过SetupDiEnumDeviceInterfaces函数中MemberIndex参数来设置板卡号,在GetDevicePath中得到设备路径并以此作为CreateFile函数的参数打开设备。

(b) 访问设备资源

与WDM类似,使用DeviceIoControl函数设置寄存器值与DMA地址,使用ReadFile/WriteFile读写DMA。

(c) 关闭设备

与WDM类似,使用CloseHandle函数关闭设备。

4 超声相控阵系统PCI驱动方式的选择

在本文所涉及的超声相控阵系统中测试开发的驱动,系统环境为Windows XP。

测试表明,采用WinDriver、DriverStudio和WDK开发的PCI9656驱动都能够正确的读写设备资源。

通过比较DMA读写的最大传输速率来间接判断驱动代码效率,见表1。

表1 DMA读写最大传输速率

通过表1可以看出,采用WinDriver开发的WDM驱动由于调用的是WinDriver本身提供库函数,代码效率较低,DMA最大传输速率为25 MB/s,在要求高速传输的条件下并不适用;采用DriverStudio开发的WDM驱动传输速率为121 MB/s,与WDK开发的WDF驱动相似,这是由于WDF驱动本质上只是对于WDM进行封装,并没有效率上的提高或降低。

由于超声相控阵系统需要高速实时传输,即对于PCI数据总线的驱动效率有一定的要求,排除了采用WinDriver的开发方案;并且我们开发的超声相控阵系统所采用的操作系统为Windows XP,而采用WDK开发的WDF驱动模型为Vista及其以后操作系统的驱动模型,为了保障系统与驱动的兼容性,排除了采用WDK的开发方案。因此,本文选择DriverStudio开发超声相控阵系统PCI驱动,能够稳定并且高速传输超声探伤数据。

5 结论

本文基于实验室自行开发的超声相控阵系统,详细阐述了采用WinDriver、DriverStudio和WDK这三种工具开发PCI数据总线驱动的方案。通过比较三种开发方案,并考虑超声相控阵系统对于驱动的要求,选择DriverStudio开发PCI数据总线驱动。实验表明,开发的驱动能够高速稳定地工作,满足系统要求。由于不同的应用有着不同的开发需求,可以根据特定的开发需求选择不同的开发方案,从而得到需要的驱动及其应用程序。

[1] 燕会明. 超声相控阵技术及其应用研究[D]. 太原: 中北大学, 2008: 14-15.

YAN Huiming. Research on technique and application in ultrasonic phased array[D]. Taiyuan: Zhongbei University, 2008: 14-15.

[2] 尹勇, 李宇. PCI总线设备开发宝典[M]. 北京: 北京航空航天大学出版社, 2005.

YIN Yong, LI Yu. PCI bus equipment development collections[M]. Beijing: Beijing University of Aeronautics and Astronautics, 2005.

[3] 毛清华. 基于PCI总线的超声检测系统研究[D]. 西安: 西安科技大学, 2010: 5-10.

MAO Qinghua. Research on ultrasonic testing system based on PCI bus[D]. Xi'an: Xi'an university of science and technology, 2010: 5-10.

[4] 刘伊威, 金明河, 樊绍巍, 等. 五指仿人机器人灵巧手DLR/HIT Hand II[J]. 机械工程学报, 2009, 45(11): 10-17.

LIU Yiwei, JIN Minghe, FAN Shaowei, et al. Five-finger dextrous robot hand DLR/HIT HAND II[J]. Journal of Mechanical Engineering, 2009, 45(11): 10-17.

[5] 张益东. 基于PCI总线的光传飞行控制系统研究[D]. 南京: 南京航空航天大学, 2007: 5-8.

ZHANG Yidong. Research on fly-by-light control system based on PCI bus[D]. Nanjing: Nanjing University of Aeronautics and Astronautics, 2007: 5-8.

[6] 张帆, 史彩成. Windows驱动开发技术详解[M]. 北京: 电子工业出版社, 2008.

ZHANG Fan, SHI Caicheng. Windows driver development internals[M]. Beijing: Electronic Industry Press, 2008.

[7] 何柳, 陈勇, 吴斌, 等. PCI/PCI-E高速实时DMA传输驱动设计[J]. 电子技术应用, 2012, 38(11): 143-145.

HE Liu, CHEN Yong, WU Bing, et al. Design a high speed and real time PCI/PCI-E DMA transmission driver[J]. Application of Electronic Technique, 2012, 38(11): 143-145.

[8] 杨波. 基于PCI总线的WDM驱动程序开发研究[D]. 长沙: 国防科学技术大学, 2007: 32-33.

YANG Bo. The research on developing WDM driver of PCI bus[D]. Changsha: National University of Defense Technology, 2007: 32-33.

[9] 王磊, 鲁新平, 李吉成. WinDriver在开发基于PLX9056芯片的PCI设备驱动程序中的应用[J]. 现代电子技术, 2006, 29(18): 77-79.

WANG Lei, LU Xinping, LI Jicheng. Application of WinDriver in developing PCI device driver based on PLX9056[J]. Modern Electronics Technique, 2006, 29(18): 77-79.

[10] 郑秀玉, 李晓明, 李畅, 等. 基于PCI总线的数据采集卡驱动程序设计与实现[J]. 电气应用, 2007, 26(1): 93-107.

ZHENG Xiuyu, LI Xiaoming, LI Chang, et al. The driver development and implement of data sample card based on PCI bus[J]. Electrotechnical Application, 2007, 26(1): 93-107.

[11] PLX Technology, Inc. PCI9656BA Data Book[EB/OL]. [2009-01]. http://www.plxtech.com.

[12] Orwick P, Smith G. Developing drivers with the Microsoft windows driver foundation[M]. Microsoft Press, 2007.

[13] 邹敬轩, 蔡皖东. 基于WDF过滤驱动的USB存储设备监控系统[J]. 计算机工程与科学, 2010, 32(3): 42-71.

ZOU Jingxuan, CAI Wandong. A USB storage device monitor and control system based on the WDF filter driver[J]. Computer Engineering & Science, 2010, 32(3): 42-71.

Research on PCI driver development in ultrasonic phased array system

SHI Cheng-long, SHI Fang-fang, KONG Chao, ZHANG Bi-xing

(State Key Laboratory of Acoustics, Institute of Acoustics, Chinese Academy of Sciences, Beijing 100190, China)

The data transmission rate of ultrasonic phased array system determines the detection speed to a great extent. As a result, the efficiency of PCI device driver is critical in the ultrasonic phased array system based on PCI local bus. The developing methods and implementations of PCI device drivers using three different development tools, WinDriver,DriverStudio and WDK(Windows Driver Kit), are expounded in detail. The efficiency and compatibility of drivers by adapting different solutions are compared. Experimental results show that both the stability and data transmission rate of the driver developed by DriverStudio can meet the requirements of the ultrasonic phased array system. There are different requirements in different applications. As so, one should choose the developing solution comprehensively according to the specific requests to obtain the proper device driver and application program.

phased array; PCI bus; device driver

TB51+7

A

1000-3630(2015)-03-0252-08

10.3969/j.issn1000-3630.2015.03.013

2015-02-14;

2015-05-20

国家自然科学基金资助项目(11374324、11174321)

施成龙(1988-), 男, 江苏南通人, 博士研究生, 研究方向为超声传播与成像。

师芳芳, E-mail: fangfangshi@mail.ioa.ac.cn

猜你喜欢

驱动程序相控阵中断
相控阵超声技术在PE管电熔焊接检测的应用
相控阵超声波检测技术认证
一种相控阵雷达的通讯处理器设计
相控阵雷达研究现状与发展趋势
跟踪导练(二)(5)
千里移防,卫勤保障不中断
AT89C51与中断有关的寄存器功能表解
FPGA内嵌PowerPC的中断响应分析
驱动程序更新与推荐
驱动程序更新与推荐