分类: WINDOWS
2008-01-16 14:47:31
Windows XP具有运行可靠、稳定且速度快的特点,操作人性化,且使用比较普及。USB(UniversalSerial Bus,通用串行总线)具有连接单一化、即插即用、支持热插拔等特点,简化了PC和外围设备的连接过程。
在开发采用USB接口与PC连接的外围设备时,大都涉及到开发接口器件驱动程序的问题。本文以实现数据采集功能为例,借助驱动开发工具DriverStudio3.1开发出USB设备的驱动程序。
2 WindOWS XP系统及其WDM结构
Windows XP运行平台支持两种模式:用户模式和内核模式。用户模式下,应用程序接口调用函数在一些例程的帮助下可完成向设备读写数据功能。操作系统创建一个称为 I/O请求包(IRP)的数据结构,并将IRP送入设备驱动的一个入口点。而在内核模式下,设备驱动执行IRP并最终完成与硬件的数据访问。驱动程序工作 于内核模式,既可以直接访问硬件,也可以通过硬件抽象层提供的一些功能实现对硬件的访问。
WDM(Windows Driver Mode,Windows驱动程序模型)是Microsoft推出的一种驱动程序模型,由运行于内核模式的系统级代码组成,在应用程序和设备之间采用分层 驱动的方法,其中包含三种类型的驱动程序,其可能的一种结构如图1所示。
总线驱动程序负责驱动I/O总线,处理总线上的全部事务,控制对其总线所有设备的访问。
功能驱动程序用于驱动一个单独的设备,控制并实现该设备的主要功能。
过滤驱动程序用于过滤向设备、设备类或总线I/O发送请求,可服务于多个设备,还可进一步划分,这部分是可选的。
3 USB的驱动结构
USB设备所采用的驱动程序是一种典型的WDM驱动程序。在WDM驱动程序中,即插即用(PnP)管理器负责通知操作系统何时添加(或删除)设备,并使用INF文件来查找新设备的驱动程序。驱动程序基本组成结构如图2所示,包括以下部分:
驱动入口程序例程DriverEntry():处理驱动程序的初始化;
即插即用例程AddDevice()和IRP_MJ_PNP处理例程:处理PnP设备的添加、删除和停止;
分发例程Creat()、Read()、IOCTL()等:处理用户程序发出的各种I/O请求;
电源管理例程:处理电源管理请求;
卸载例程:处理驱动程序的卸载。
另外,在驱动程序的加载方面,WDM不是通过驱动程序的名称来识别的,而是通过一个符号链接名或一个128 bit的GUID(全局惟一标识符)来识别。
USB设备的接口可以有若干个端点(endpiont),端点作为通信管道的终点,有四种类型:批量(Bulk),控制 (Contro1),中断(Interrupt)和同步(Isochronous)。这些类型都需要在驱动程序中进行描述。USB设备的端点0默认为控制 方式,可以初始化系统,设备并加电并收到一个总线复位命令后,端点0就可以访问。与端点类型对应的是定义了四种数据传输方式,根据开发系统也对其在驱动程 序中进行定义,具体包括:
控制方式:用于发送和接收USB定义的结构化信息;
批量方式:用于发送或接收小块无结构数据;
中断方式:与批量管道相似,但包括一个最大延迟;
同步方式:用于发送或接收有周期保证的大块无数据结构。
4 利用DriverStudio3.1开发驱动程序
4.1 开发环境介绍
首先,依次安装Microsoft Visual C++6.0,Win-dows XP DDK(驱动开发工具包)和NuMega Driver-Studio3.1。其中DDK是Microsoft公司提供的一个开发Windows驱动程序的工具包,是开发设备驱动程序所必须的软件 组件。
DriverStudio中的DriverWorks工具为开发WDM设备驱动程序提供了一个自动化的方法,其中的类库将常用的操作封装 起来,大大减少了编码工作量。该产品中的DriverWizard引导完成设备驱动程序开发的全过程,并能根据硬件种类自动生成设备驱动程序源代码。
4.2 开发过程
以完成数据采集为例,介绍USB设备驱动程序的开发。
建立WDM编程环境,利用Visual C++打开DriverStudio中的DDK Build Settings,设置DDK所在目录,在Target OS中选择Windows XP。
在DriverStudio中的DriverWizard引导下,依次完成以下步骤:
1) 选择驱动类型、功能驱动程序为WDM型。
2) 选择硬件所支持的总线类型为USB(WDMonly),并填写供应商ID(Vendor ID)和产品ID(Product ID),这些数据是由所选器件的供应商提供,如Philips公司的VID为0471。
3) 定义所用到的端口,根据数据采集的特性,该设备用到两个Bulk端口,可通过Add按钮添加。第一个端口定义为IN端口,用于数据输入,类型为Bulk, 命名为Endpoint1IN;第二个端口定义为OUT端口,用于数据输出,类型也为Bulk,命名为End-point2OUT。Driver Class和File Name采用默认值。
4) 选择驱动程序响应请求,选择Read、Write、Cleanup,本系统不需要其他接口。
5) 定义应用程序调用的DeviceIoControl函数对WDM驱动程序通信的控制命令,选择为布尔类型。
6) 选择生成一个Win32Console应用程序。
在生成文件中,USBDrv.cpp包含驱动程序入口例程DriverEntry()和PnP中的例程AddDevice()。在USBDrvDevice.cpp程序中,数据采集的读端口1程序如下:
Driverstudio自动生成相应的驱动程序INF(Device Information File,设备信息文件)。其中记录了驱动程序安装的所有操作,包括复制文件的指定路径、添加或修改注册表、加载系统服务等,而实际的驱动程序存放在. sys,.dll,.vxd文件中。安装该驱动程序可将该.inf文件复制到“…\sys\objchk\i386”目录下,打开Compuware DriverStudio中Test->Ez-DriverInstall,加载该.inf文件即可。
5 结束语
通过对Windows XP系统的认识,明确了与PC接口设备开发过程中开发驱动程序的作用,它连接应用程序可对硬件进行访问。在开发驱动程序的过程中,借助了DriverStudio开发工具,从而简化了开发进程,提高了工作效率。