时间:2010-04-11 点击: 次 来源:本站原创 作者:佚名 - 小 + 大
| 摘要 本文介绍WDM型USB设备驱动程序的基本概念、结构和特性,并说明了利用Driverworks进行开发的方法。 关键词 WDM;USB设备驱动程序;Driverworks 导言 通用串行总线USB是1995年康柏、微软、IBM、DEC等公司推广的一种新型的通信标准,该总线接口具有安装方便、高带宽、易于扩展等优点,已逐渐成为现代数据传输的发展趋势。而 Windows驱动程序模型(WDM) Windows环境下驱动程序共有三类,一类是VxD( Virtual Device Driver,虚拟设备驱动程序),起源于Windows 3.1 时代,用于Windows 95/98/Me操作系统中;一类是KMD( Kernel Mode Driver,内核模式驱动程序),用于Windows NT下;还有一类就是WDM(Win32 Driver Mode,Win32驱动程序模型),是微软从Windows 98开始,推出的一个新的驱动类型,它是一个跨平台的驱动程序模型,不仅如此WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行,毫不夸张地讲,WDM算得上是21世纪的驱动程序框架。 WDM是在NT4.0驱动程序结构上发展起来的,所以它与NT4.0的驱动程序极为相似,但是它却有了本质上的提高,增加了对即插即用(PnP)、高级电源管理(PowerManagement)、Windows管理接口(WMl)的支持。更重要的是,WDM是一种通用的驱动模式,提供了包括USB、IEEEl394和HID等在内的一系列驱动程序类。 1、WDM驱动程序的分层结构 WDM体系结构实行分层处理,即设备驱动被分成了若干层,典型地分成:高层驱动程序、中间层驱动程序、底层驱动程序。每层驱动再把I/O请求划分成更简单的请求,以传给更下层的驱动执行。最底层的驱动程序在收到I/O请求后,通过硬件抽象层,与硬件发生作用,从而完成I/O请求工作。在这样的架构下,上面的驱动层就不需要对每个操作系统都要开发一遍了。如图1所示
USB设备驱动程序开发工具 另一类是NuMega公司提供的DriverStudio,它是一个大的开发工具包,包含VtoolsD、SoftICE和DriverWorks等开发工具。 VtoolsD开发包提供了对VxD编程的C/C++类库支持,利用VtoolsD中的QuickVxD工具可以快速生成VxD的C/C++代码框架,开发者可以在此基础上根据各自的需要添加自己的代码。DriverWorks用于开发KMD和WDM驱动程序,并且对DDK函数进行了类的封装,从而为开发Windows NT、Windows 2000和Widnwos98 WDM设备驱动程序提供了一个自动化的方法。 DriverWorks,提供了VC++下的开发向导Driver Wizard,按照它的提示可以迅速地生成驱动程序的框架。这个框架结构提供可以正确执行WDM动态环境中IRP的请求,而且,也包含用于简化系统提供的标准类驱动程序(如HID、流)和总线驱动程序(如PCI和USB)接口的类等。 总之,利用DriverWorks开发WDM驱动程序,可以大大简化开发人员的工作量、缩短开发周期以及降低开发驱动程序的难度。[1] 用DriverWorks开发WDM型USB设备驱动程序 要想使用DriverWorks,必须先安装以下软件:DriverStudio2.5,VisualStudio6.0,以及Windows2000DDK。由于DriverWorks所用的类库是对DDK的库函数的封装,还必须在Visual C++中编译需要的库文件[3],下面介绍怎样在VC环境中创建自己的库文件。 (1) 启动Visual C++。 (2) 选择菜单File\Open Workspace。打开位于DriverStudio\DriverWorks\Source\vdwlibs.dsw的工作空间文件。 (3) 选择菜单Build\Batch Build,在弹出的对话框架中选择你想编译的库。 (4) 点击对话框中的Build即可编译你选择的库。 下面就通过一个例子来说明利用DriverWorks开发USB设备驱动程序的方法。 这个USB设备有3个双向端点,每个端点的配置如下:
驱动程序需要实现的功能就是控制设备上的LED灯的亮和灭,以及通过端点2对设备进行读写。 (1) 首先,通过快捷方式“Setup DDK and Start MSVC”来启动VC IDE。这个快捷方式所指向的程序,会进行一些必要的设置,然后再启动VC IDE,这样我们的程序就可以使用DDK和DW的头文件和库了。 (2) 从VC IDE的菜单“DriverStudio”中选择“DriverWizard”,之后按对话框的提示填写项目名称及所在目录。并按向导选择驱动程序类型为WDM,总线类型为USB。 (3) 按端点的配置表进行端点的设置。由于在USB中规定端点0是必须存在的,所以我们只需对端点1和端点2进行定义即可。 (4) 选择端点2产生BULK Read及BULK Write 的代码,DriverWorks会自动产生对端点2的读写代码,不用修改,就可以直接使用。 (5) 增加一个IOCTL来控制USB设备的LED灯。IOCTL代码名称取为TEST_IOCTL_LED,其他值默认。 (6) 最后按下“ Finish”按钮,就结束了Wizard。 在此过程中只针对需要修改的步骤进行了说明,未加说明的部分均可直接按“Next”按钮。 到此,我们已经创建好了一个基本的驱动程序,其中的块读写代码都由DriverWorks自动生成,无需另外加代码,只有厂商请求通过Ioctl来进行,控制LED灯的亮灭。代码如下:
这个函数控制LED灯,它是通过USB Vendor Request来向设备传送的。其中request=1的时候表示让L ED亮,request=0的时候让LED来。它通过DeviceIoControl由上层应用程序传下来。 现在,驱动程序完成了,为确保最后生成的USB驱动程序能编译成功,一定要注意设置DriverWorks中的Driver Build Setting(在VC++6.0的菜单中)中的[basedir]和[CPU]等项。设置好后,选择“Build/Batch Build”,在弹出的对话框中进行正确的选择,之后按下”Rebuild”按钮,稍等片刻即可生成最终的.sys驱动程序。 结束语 WDM作为一种设备驱动程序模型,自Windows 2000以来已成为一种统一的模式。同时USB技术得到广泛应用,进行USB设备驱动程序的开发成为必不可少的技术环节,而使用DriverWorks开发USB设备驱动程序,简单方便。 出处: 计算机与信息技术 |