视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
WDM型USB驱动程序开发
2025-09-29 17:14:10 责编:小OO
文档
WDM型USB设备驱动程序开发

网站首页社区首页新闻首页书籍教程视频教程JAVA技术.NET开发C/C++数据库WEB开发linux软件测试在线试题博 客进入论坛

网站开发VBScriptASPAsp.netJspphpXMLCGI-Perl搜索引擎ajax用户名: 

密  码:  

验证码: 

    JAVA J2EE J2ME J2SE JSP C/C++ C语言 C++ VC MFC Web前台 Html css JavaScript 软件测试 软件测试入门 LoadRunner Windows Win2008 Win2003 WinXP .NET ASP.NET VB.NET MVC Linux/Unix Linux Unix Shell Web开发 PHP ASP Ajax IIS Apache 编程语言 C VB Delphi 汇编 数据库 MSSQL Mysql Oracle·.Net视频教程DVD 7张 26G 120元·尚学堂+j2ee+赛迪+传智播客 23 DVD ·达内培训视频教学光盘DVD 6张 90元·Oracle视频教程9i 4 DVD 50元DIY部落 >> .net >> Asp.net系列教程 >> 正文 WDM型USB设备驱动程序开发

www.diybl.com 时间:2008-09-25 作者:佚名 编辑:本站 点击: 206 [评论]

-

-

  

  

摘要 本文介绍WDM型USB设备驱动程序的基本概念、结构和特性,并说明了利用Driverworks进行开发的方法。

关键词 WDM;USB设备驱动程序;Driverworks 

  导言

  通用串行总线USB是1995年康柏、微软、IBM、DEC等公司推广的一种新型的通信标准,该总线接口具有安装方便、高带宽、易于扩展等优点,已逐渐成为现代数据传输的发展趋势。而在开发USB设备时,设备驱动程序的设计是其中一项重要的技术环节,它直接影响整个设备系统的性能。WDM支持USB协议,并为其提供了高效的开发平台。因此WDM已成为开发USB外设驱动程序所必须而有效的技术。

  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的驱动程序极为相似,但是它却有了本质上的提高,

         更重要的是,WDM是一种通用的驱动模式,提供了包括USB、IEEEl394和HID等在内的一系列驱动程序类。

  1、WDM驱动程序的分层结构

  WDM体系结构实行分层处理,即设备驱动被分成了若干层,在这样的架构下,上面的驱动层就不需要对每个操作系统都要开发一遍了。如图1所示 

  WDM还引入了功能设备对象FDO(Functional Device Object)与物理设备对象PDO(Physical Device Object)两个新类来描述硬件,一个PDO对应一个真实硬件。一个硬件只允许有一个PDO,但却可以拥有多个FDO,而在驱动程序中我们不是直接操作硬件而是操作相应的PDO与FDO。驱动程序和设备对象的分层情况如图2所示。

  

图3

 

  在USB设备可用之前,必须对其进行配置和接口选择,然后所选择的接口的各个管道才是可用的。

  大多数的WDM设备对象都是在即插即用管理器调用AddDevice例程入口点时被创建的。插入新设备后,当系统找到由安装信息文件所批示的驱动程序时,这个例程被调用。在此之后,一系列即插即用IRP被发送到驱动程序,设备驱动程序可进行相应的功能处理。

USB设备驱动程序开发工具

  开发USB设备驱动程序需要专门的开发工具,目前应用广泛的工具主要有两大类。

  由于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个双向端点,每个端点的配置如下:

端点 类型 地址 缓冲区(字节) 

0 IN/OUT 控制(Control) 0x80/0x00 16/16 

1 IN/OUT 块(Bulk) 0x81/0x01 16/16 

2 IN/OUT  块(Bulk) 0x82/0x02 / 

  驱动程序需要实现的功能就是控制设备上的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灯的亮灭。代码如下:

NTSTATUS TESTDevice::TEST_IOCTL_LED_Handler(KIrp I)

{

 NTSTATUS status = STATUS_SUCCESS;

 t << "Entering TESTDevice::TEST_IOCTL_LED_Handler, " << I << EOL;

 // TODO: Verify that the input parameters are correct

 // If not, return STATUS_INVALID_PARAMETER

 if(I.IoctlOutputBufferSize()||!I.IoctlBuffer()||(I.IoctlInputBufferSizer()!=sizeof(UCHAR)))

  // TODO: Handle the the TEST_IOCTL_LED request, or 

  // defer the processing of the IRP (i.e. by queuing) and set

  // status to STATUS_PENDING.

  PURB pUrb=m_Lower.BuildVendorRequest(NULL,//transfer buffer

   0, //transfer buffer size

   0, //request reserved bits

   (UCHAR)(*PUCHAR)I.IoctlBuffer()), //request. 1=LED_ON, 0=LED_OFF

   0 // Value

  );

  //transmit

  status=m_Lower.SubmitUrb(pUrb,NULL,Null,5000L);

 }

 // TODO: Assuming that the request was handled here. Set I.Information

 // to indicate how much data to copy back to the user.

 I.Information() = 0;

 I.Status()=status;

 return status;

  这个函数控制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设备驱动程序,简单方便

 下载本文

显示全文
专题