自动测试仪器硬件板卡识别技术研究

2011-04-26 02:31钱光弟
中国测试 2011年3期
关键词:驱动程序板卡调用

田 娜,钱光弟,李 力

(电子科技大学自动化工程学院,四川 成都 611731)

0 引 言

自动测试系统中,因同一个系统的不同板卡有不同的PID和VID,所以设备驱动通常使用PID和VID来识别设备。但这种方法会导致硬件使用过程复杂化,同时也不利于硬件升级。该文提出了一种通过对板卡的位置信息来识别同类硬件设备的识别技术。同类设备具有相同的PID和VID,可以在设备管理器中查询硬件的位置信息(如总线号、功能号和设备号等)。通过这3个位置信息可以区分同类板卡,这种方法利于硬件的升级和简化了板卡使用的过程。以PCI板卡为例说明硬件在PC机的加载识别过程,介绍软件识别的概念及驱动和应用程序的编写。

1 PCI板卡加载过程

以PCI板卡设备为例,对硬件在PC机的加载识别过程加以说明。PCI板卡设备插入机箱后,CPU在系统初始化阶段(POST)为各个PCI设备进行资源分配。资源分配完毕后,PCI设备的驱动程序根据PCI Vendor Id和 Device Id以及 Revison Id进行PCI总线搜索,查看是否存在符合本驱动的设备。找到设备后,驱动程序根据板卡的硬件设计情况,进行相应的寄存器初始化和中断挂载工作。

因为PCI总线的资源分配是在POST过程中动态分配的,所以根据系统配置不同,各板卡所分配的资源也不相同(即所谓PnP-即插即用)。

PCI总线搜索通常是按深度优先的顺序进行搜索。如果有同种型号的PCI设备存在于PCI总线上,设备驱动应依次对板卡设备进行初始化。而当多个板卡实例采用同一驱动时,驱动程序对各个板卡的区分仅仅是对其总线位置信息的区分。通过驱动程序可以获取以下信息:(1)驱动程序可以驱动的PCI设备数量(在总线上找Id符合的PCI设备数量);(2)PCI设备占用的系统资源(包括IO,MEM地址,IRQ及这些设备所在的总线位置信息-PCI总线x,Device y,Function z)。由此可见,虽然系统资源分配不固定,但是PCI设备位置固定。该文所述驱动通过PCI板卡的位置信息来访问同类板卡设备。

2 识别

识别就是获得硬件的设备句柄。设备句柄是用于标识设备的一个标识符,是在Windows操作系统中用来标识被应用程序所建立或使用的硬件对象的唯一整数。

应用程序通过调用一个API函数CreateFile来获得一个设备句柄,之后其他的函数就可以使用该设备句柄来访问设备。

由于同一个PC机每个硬件的句柄不同,在Windows操作系统中,用户需要获得硬件设备的句柄,才能调用驱动程序。驱动程序是一个独立的黑盒,在操作系统中扮演着特殊的角色,它是应用程序和硬件之间通信的桥梁。

3 WDM驱动模型

该驱动基于微软提出全新的WDM驱动模型开发,支持即插即用、电源管理和WMI驱动。WDM驱动主要例程如图1所示。

图1 WDM主要例程

WDM驱动程序就是一些例程的集合体,它们被动地存在,等待主机系统软件来调用或激活。不同的驱动程序完成的功能不同,其所包含的例程也不同,下面介绍WDM驱动程序中常用的6个例程[1]:

(1)入口例程。内核模式驱动程序入口点,I/O管理程序在驱动程序首次装入时调用该例程。入口例程执行所有的第1次初始化任务。

(2)即插即用例程。处理PnP设备的添加、删除和停止,它将自动在系统中找到一个未被占用或没有冲突的中断地址分配给新添加的硬件设备,而不需要人工干预。

(3)AddDevice例程。对于参与即插即用的WDM驱动程序来讲,完成硬件分配。

(4)分发例程。处理用户应用程序发出的各种I/O请求,分发例程处理IRP,或者通过判断IRP来调用相应的例程。

(5)电源管理例程。处理电源管理请求。

(6)Unload卸载例程。处理驱动程序的卸载。

4 多卡识别驱动编写

4.1 AddDevice例程

在WDM的驱动中,每个硬件板卡对应一个设备实例,PnP管理器为每个设备实例调用AddDevice例程,并创建一个设备对象把它连接到以Pdo为(物理设备)底的设备堆栈中[2]。

AddDevice例程有一个输入参数Pdo,是由底层驱动创建的的物理设备对象。在这个例程中调用DDK函数IoGetDeviceProperty,通过改变此函数的第2个参数,即可返回设备的总线号、设备号和功能号。典型代码如下:

将得到的板卡设备、功能号,保存在m_ulUINumber变量中,其中高16位是设备号,低16位是功能号。将 IoGetDeviceProperty(Pdo,

得到板卡的总线号,保存在m_ulUINumber变量中。把读回来的设备号、功能号和总线号放在全局变量中,以便以后识别使用。

4.2 分发例程

分发例程主要指“打开”、“创建”、“读”、“写”、“IOCTL”、“关闭”等处理程序,它可以执行对IRP的初始化,并检查参数的合法性。模块中内核模式驱动程序需要处理的IRP主要有写例程向硬件发送命令、读例程读取硬件寄存器、IOCTL例程用作多卡识别。

在驱动层创建一个控制码为READ_SLOT的IOCTL例程,专门用于传递板卡的位置信息。驱动层通过应用层发下来的控制码来识别上层需要进行的操作。在控制码为READ_SLOT的IOCTL例程中,把AddDevice读取的放在全局变量中的板卡总线号、设备号和功能号,通过METHOD_BUFFERED的方式传给应用层。

5 多卡识别应用层编写

5.1 驱动层与应用层的接口

用户模式驱动程序通过Win32应用程序与内核进行通信,为保护知识产权和方便程序的升级与维护,用户模式驱动程序通常用“DLL”的方式实现。由于运行在用户态,它和内核模式驱动程序的通信过程实质上是应用程序和WDM驱动程序的通信过程[3]。

在Windows系统中,应用程序实现与WDM驱动程序的通信过程如下:首先应用程序用CreateFile函数打开设备,然后调用ReadFile从驱动程序中读数据或用WriteFile写数据给驱动程序,也可以用DeviceIoControl和驱动程序进行通信。当应用程序退出时,调用CloseHandle关闭设备[4]。这将产生对应于此设备对象相应的IRP,见表1所示。

表1 Win32函数与IRP的对应关系

5.2 多卡设备句柄的获得

Win32API对设备进行“打开”和“关闭”操作,在其打开设备时,必须先获得设备句柄。

在Windows系统中,使用对象管理器集中管理系统中大量的内部数据结构,包括驱动程序对象和设备对象。因对象的名称不同,为了便于区别对象,对象管理器通过一个层次化的命名空间来管理这些对象名称。通常设备对象都把自己的名字放到Device目录中。在DriverWorks工程创建时可以指定应用程序打开设备的方式为GUID接口或符号链接名,获得设备句柄。

5.2.1 GUID接口

这是微软在设计WDM框架时引入的一个新的命名方案,该方案与任何自然语言无关,且易于扩展和归档。一个设备接口由唯一的128位的GUID标识。由于采用了独特的生成算法,永远也不用担心重复出现GUID的情况,这样一个GUID就唯一标识了一种设备接口。但这种操作方式增加了代码量,同时操作比较复杂,不易采用这种方式[5]。

5.2.2 符号链接

应用程序要访问该设备必须事先知道它的名字,否则不能访问。这在测试用的设备或私有设备上是可以的。这种方式操作简单,只适合特定的平台[6]。

用连接名在应用层用CreateFile打开设备时,每个连接名的后缀从零开始表示打开某类设备的第几个实例,一个实例代表一个板卡。例如,板卡的符号连接为xxxDevice,第1个实例叫xxxDevice0,第2个实例叫xxxDevice1,以此类推,典型代码如下:

第0个例程后缀为0:

hDevice是返回的硬件设备句柄。柄之后通过句参数hDevice调用控制码为READ_SLOT的IOCTL例程,获得硬件位置信息,主要代码如下:

图2 获取句柄流程图

把驱动加载过程中得到总线号、设备号和功能号来传给应用层,返回的值放在BufOutput中。在应用层与用户所指定的板卡参数相比较,确定板卡的位置,如果符合就返回句柄,不符合关闭句柄继续往下找,直到找到指定的板卡为止,流程如图2所示。得到每个板卡的句柄以后,就可以分别对板卡进行操作,之间不会相互影响。

6 调 试

编写驱动,调试是一个棘手的问题。因为驱动程序运行在内核模式下,很难像一般有集成的开发环境的Win32程序一样进行单步调试。一般来说,驱动的调试主要有2个途径:(1)在关键的地方打印出调试信息,用DriverMoniter来查看;(2)内核调试工具。在该文中采用第(1)种方法调试[7]。

7 结束语

该文介绍的板卡识别方法,在原有PID和VID识别的基础上,改进了硬件识别方法,通过位置信息寻找硬件,简化了硬件的操作过程,在驱动和应用程序方面做了改进,开发出适合多板卡公用的驱动程序,为硬件和驱动的设计带来了很大的方便。

[1] 杨军.DriverStudio开发WDM设备驱动程序入门[M].北京:电子工业出版社,2004:34-40.

[2]武安河.Windows2000/XP WDM设备驱动程序开发[M].北京:电子工业出版社,2005:1-65.

[3]Foltz F.Microsft Windows驱动程序模型设计[M].马少华,译.北京:清华大学出版社,2004:45-120.

[4] 吴宏钢,尹爱军,秦树人.基于WDM模型的PCI数据采集卡驱动程序设计[J].中国测试技术,2008,34(4):52-55.

[5] 武安河.Windows设备驱动程序[M].北京:电子工业出版社,2001:42-148.

[6]孙毅.Windows WDM设备驱动程序开发指南[M].北京:电子工业出版社,2001:1-100.

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

猜你喜欢
驱动程序板卡调用
车载控制器CVRE板卡显红故障分析及处理
核电项目物项调用管理的应用研究
阻止Windows Update更新驱动程序
系统虚拟化环境下客户机系统调用信息捕获与分析①
计算机硬件设备驱动程序分析
基于组态王软件和泓格PIO-D64 板卡的流水灯控制
一种基于光纤数据传输的多板卡软件程序烧写技术
一种通用模拟量及开关量信号采集板卡的设计
利用RFC技术实现SAP系统接口通信
妙用鼠标驱动