欢迎您访问长沙鹏翔电子科技有限公司官方网站

技术与应用

PCIE高速声发射仪/千兆网络声发射仪

技术与应用

PCI 总线高速数据采集卡WDM 驱动程序开发

发布日期:2015-06-15 09:15    浏览次数:

 杨纪伟,刘教民,冯瑶

(河北工业大学计算机科学与软件学院,天津300130)
摘要:介绍了PCI 总线的特性、系统结构,结合PCI 设备的具体特点,利用DriverWorks 和VisualC++ 开发Windows 2000 下的PCI 设备驱动程序及其与应用程序的接口,并概述了其实现,方法,给出了PCI 总线驱动程序开发的部分代码。
关键词: PCI 总线; DriverWorks; 设备驱动程序
中固分类号:TP274 文献标识码:A
WDM(Windows Driver Model)是一种便捷式的编程技术,它可以使开发人员写出的驱动程序跨平台运行,支持编写微软所支持的WDM 总线驱动程序。在WDM 中"总线(Bus)" 的概念是一种附加在其他设备(包括物理设备、逻辑设备、虚拟设备)上的设备协议。
PCI 总线体系结构是一种层次式的( Hierarchical)体系结构,其定义了32 位数据总线(可扩展到64 位) ;最高工作频率为33 MHz ,支持并发工作方式,使传输速度更高,在33 MHz 总线速度下,访问时间只需要60ns
 ;基于ISA , EISA , MAC 系统的PCI 扩展板,减少了用户的开发成本;对PCI 扩展卡及元件能够自动配置,实现设备的即插即用;处理器独立,不依赖任何CPU ,支持多种处理器及将来更高性能的处理器;PCI 是
一个低延迟、高速的I/ O 总线;PCI 提供数据和地址的奇偶校验功能,保证了数据的完整性和准确性问。
目前开发驱动程序的工具比较多,如DDK , DriverWorks 等。用DDK 开发驱动程序比较繁琐,难度较大,开发周期长。DriverWorks 把DDK 的函数封装成类,开发者根据自己驱动程序的需要,利用开发工具进
行简单操作就能很方便地生成驱动程序框架,让驱动开发者集中精力去完成驱动程序的基本功能,使WDM驱动程序的开发变得简单、方便,提高了开发效率凶。
1 PCI 总线数据采集卡的硬件设计
硬件系统结构框图见图1。
其中: FPGA 一方面实现PCI 总线接口的功能,另一方面作数据采集控制器。采用异步先进先出存储器(FIFO) 作中间缓存,解决了A/D 部分和PCI 总线速度不同步问题;采用高速模拟多路开关作模拟信号转换;采用高速ADC 芯片(AD5220) 作模拟数字转换。该电路板上电路还包括一些信号调理电路,其主要功能是对输入的模拟信号进行放大、滤波、隔离、衰减、多路复用等一系列处理,使调理以后的信号满足A/D的采样要求。
笔者设计的数据采集卡是基于PCI 总线,采用ALTERA 公司的EPIK50 实现PCI 协议。同时EPIK50 还集成了数据采集控制器,可以有效地简化电路设计。
2 PCI 总线的WDM 设备驱动程序
2.1 PCI 总线数据采集卡设备驱动程序的编制
在PCI 总线数据采集卡的设备驱动程序编制过程中,最重要的是核心组成结构凶。
1)本驱动程序的DriverEntry 例程用来初始化驱动程序范围的数据结构和资源。当l/O 管理器装人驱动程序时,它调用DriverEntry 例程。返回的状态号表明驱动程序是否成功装人并能接收和处理来自PnP 管理器的配置,是否增加及启动其他设备的请求。
2) 在驱动程序初始化之后.PnP 管理器调用驱动程序AddDevice 例程来初始化由该驱动程序所控制的设备。
3) 当一段IRQL 相当高的内核模式的代码正在执行的时候,其他相等或者较低IRQL 的程序就不会执行。但是,如果有太多拥有高的IRQL 的代码执行太长时间的话,就影响了整个系统的性能。时间紧急的事件被延迟处理,从而导致损失惨重。为了避免这个问题,执行大量的内核模式的代码必须分配最低的优先权,这个策略的重要部分是延迟过程调用(DPC) 。
2.2 识别总线上的PCI 设备
识别PCI 器件的方法是先向配置空间地址寄存器写入总线和设备号,在里面搜索PCI 器件时得到的寄存器号,再对配置空间数据寄存器进行读写。用C 语言描述如下:
BOOL search_pciO j j检验计算机上的PCI 设备的子程序
{
forCio_cf8 = Ox80000000; io_cf8< = Ox80ffffOO; io_cf8+ = Ox800;)
{
DWORD_OUTCOxOcf8 , io_cf8); //OxOcf8 为输出端口地址,向其输出有效控制宇
io_cfc=DWORD_INCOxcfc); //Oxcfc 为输入端口地址,从其读人返回值
ifCio_cfc! = Oxffffffff) //找到了PCI 设备
{
DWORD_OUTCOxOc侣, io_cf8) ;//读取VID
VID=DWORD_INCOxcfc) ;
ifCVID= =OxlOb5) //找到PCI 开发卡设备
{
PCI_BASE= io_cf8; //将基址赋值以便进行下一步的访问工作
Return (TURE);
     }
    }
 }
Return CFALSE);
}
2.3 读写配置空间取得配置信息
PCI 设备的许多参数,包括所用的中断号、端口地址的范围、l/O 方式、存储器的地址、存储器映射方式等,都可以从PCI 配置空间的各基址所对应的寻址空间中得到。读写配置空间可以调用BIOS 中断lAH ,也可以先向配置空间地址寄存器写入总线和设备号,在前面搜索PCI 器件时得到的寄存器号,再对配置空间数据寄存器进行读写。对设备驱动来说,最重要的是获得基址寄存器。不能认为PCI 器件资源总是设计设备时设置的初值,系统可能会根据硬件情况为PCI 设备分配新的资源。用C 语言描述如下
void read_pci()                   //读PCI 卡的配置寄存器
{
ifC search_pci() = =TURE)     //找到PCI 卡
{
int i;
i0_cf8= PCI_BASE;
DWORD_OUT( oxocf8, io_cf8) ;   //向输出端口输出有效控制宇
io_cfc= DWORD_IN (oxcfc) ;             //从输人端口读人返回值
for (i=O;i<=15 ;i+ +)  //从io_cf8 这个地址开始在oh-63h 地址范围内读取该设备PCI 配置寄存器的值
{
DWORD_OUT( oxocf8 , io_cf8 +4 *i);  //每次读双字节数据
buffer[i] = DWORD_IN ( oxcfc) ;  //读人PCI 配置寄存器的值
    }
}
2.4 驱动程序与应用程序的通信
在WindowsNTj2000jXP 中,应用程序与驱动程序间的通信通过调用Win32 API 实现,应用程序用CreatFileC) 通过巳经定义的设备接口获取驱动程序的文件句柄,然后将文件句柄作为其他Win32 API 函数的一个参数,对驱动程序进行数据操作,应用程序可以通过API 函数DeviceloControl 来实现对设备的访问,获取信息,发送命令,交换数据等。在应用程序中,加入以下函数,即可实现访问驱动程序所定义的缓冲区的操作,从而实现了驱动程序与应用程序的通信问题。
HANOLE hOevice;
hDevice = CreateFile ("\ \ \ \. \ \Onepci" ,GENERIC_REAO I GENERIC_ WRITE ,
FIL E_ SHARE_REAO I FIL E_ SHARE_ WRITE , NULL , OPEN_EXIST2ING,
FIL E_ ATTRIBUTENORMAL,NULL) ;
//获得驱动程序的句柄;
ULONG Test_ONEPCLIOCTL_806(ULONG sel)
KS_MAILBOX_MESSAG E message;
message. MessageMailBox = 0;
message. MessageValue = sel;
ULONG nOutput; / / Count written to bufOutput
if (! OeviceloControl(hOevice , / /设备句柄
ONEPCI_IOCTL_806 , / /应用程序调用驱动程序的控制命令
&message , / /应用程序传递给驱动程序数据缓冲区指针
sizeof(message) , / /应用程序传递给驱动程序数据字节数
&message , / /驱动程序返回数据的缓冲区指针
sizeof(message) , / /驱动程序返回数据的缓冲区字节数
&nOutput,
NULL) )
printf( "ERROR: OeviceloControl returns %Ox. ", GetLastErrorO);
Exìt(1); }
return message. MessageValue; / /返回输出缓冲区中的数据
3 结语
设备驱动程序的开发与通常的应用程序开发有很大的不同,由于驱动程序直接访问硬件资源,它在调试开发过程中的错误常会导致系统死机,出现蓝屏。因此,驱动程序的调试需要专门的软件,不能直接使用VC 的编译环境,最好给系统备份,以免每次重装系统。NuMega 公司的Softice 是一个理想的调试工具。
使用OriverWorks 可以快速产生一个驱动程序,然后只需在里面作一些小的改动就可以使用了。因此利用OriverWorks 开发PCI 设备驱动程序可以大大缩短开发周期,提高开发效率,是开发PCI 硬件设备驱动程序的良好工具。
文中编写的Onepci 驱动程序应用于PCI 数据采集卡,能够实现驱动程序的安装,并与应用程序通信,实现了实时要求及所要求的接口,驱动程序运行良好,实现了预期设想的目标。