开发WDM型的USB设备驱动程序.docx
- 文档编号:23342522
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:9
- 大小:29.44KB
开发WDM型的USB设备驱动程序.docx
《开发WDM型的USB设备驱动程序.docx》由会员分享,可在线阅读,更多相关《开发WDM型的USB设备驱动程序.docx(9页珍藏版)》请在冰豆网上搜索。
开发WDM型的USB设备驱动程序
开发WDM型的USB设备驱动程序
作者:
鲜征征杨皓发布时间:
2004-11-2112:
57:
25摘要:
文章介绍了USB和WDM驱动程序的基本概念和结构,结合实例阐述了用NuMega公司的DriverStudio工具包开发Windows2000环境下WDMUSB设备驱动程序的方法,并给出关键例程主要代码。
关键词:
USBWDM设备驱动程序DriverStudio
引言
随着微机技术水平的日益提高,传统的计算接口已经不能满足当前计算机高速发展的需求,计算机业界迫切需要新的通用型、高速总线接口。
通用外设接口标准USB应运而生。
USB,全称为通用串行总线(UniversalSerialBus),它是Compaq、IBM等PC大厂商联合开发的一种新型的、基于令牌的、高速的串行总线标准。
开发者要设计USB设备接口,就必须首先了解USB协议,在此基础上有针对性的开发USB设备驱动程序。
USB简介
在众多的PC机总线中,USB以其突出的优点独树一帜:
①使用方便。
支持热拔插,不涉及中断请求(IRQ)冲突等问题,能真正做到“即插即用”。
②传输速率高。
目前的USB2.0协议速度高达480Mbps。
③易于扩展。
通过使用Hub扩展可连接多达127个外设。
④使用灵活。
USB共有4种传输模式:
控制(control)、同步(Synchronization)、中断(interrupt)、批量(bulk),以适应不同设备的需要。
⑤独立供电。
正由于上述优点,开发USB接口的设备已成为一种发展趋势。
一个完整的USB系统包括主机系统和USB设备。
所有的传输事务都是由主机发起的。
一个主机系统又可以分为以下几个层次结构,如图1所示:
图1USB互连通信模型
USB总线接口包括USB主控制器和根集线器,其中USB主控制器负责处理主机与设备之间电气和协议层的互连,根集线器提供USB设备连接点。
USB系统使用USB主控制器来管理主机和USB设备之间的数据传输,另外它也负责管理USB资源,如带宽等。
应用软件不能直接访问USB设备硬件,而通过USB系统和USB总线接口与USB设备进行交互。
USB设备包含一些向主机软件提供一系列USB设备的特征和能力的信息的设备描述符,用来配置设备和定位USB设备驱动程序。
这些信息确保了主机以正确的方式访问设备。
通常,一个设备有一个或多个配置(Configuration)来控制其行为。
配置是接口(Interface)的集合,接口指出软件应该如何访问硬件。
接口又是端点(endpoint)的集合,每一个与USB交换数据的硬件就为端点,它是作为通信管道的一个终点。
图1显示了一个多层次结构的通信模型,它表明了端点和管道所扮演的角色。
WDM驱动程序和USB驱动程序的分层结构
设备驱动程序实际上是指一系列控制硬件设备的函数,是操作系统中控制和连接硬件的关键模块。
它提供连接到计算机的硬件设备的软件接口。
1、WDM驱动程序介绍
WDM(Win32DriverModel)是Microsoft公司力推的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。
它源于WindowsNT的分层32位设备驱动程序模型,它支持更多的特性,如即插即用(PnP,PlugandPlay)、电源管理(PM,PowerManagement)、Windows管理诊断(WMI,WindowsManagementInstrumentation)和NT事件。
它为Windows操作系统的设备驱动程序提供了统一的框架,在Windows平台上,WDM将成为主流的驱动模式。
WDM引入了功能设备对象FDO(FunctionDeviceObject)与物理设备对象PDO(PhysicalDeviceObject)两个新类来描述硬件,一个PDO对应一个真实的硬件。
一个硬件只允许有一个PDO,却可以拥有多个FDO,在驱动程序中直接操作的不是硬件而是相应的PDO和FDO。
WDM是通过一个128位的全局唯一标识符(GUID)实现驱动程序的识别。
应用程序与WDM驱动程序通信时,应用程序将每用户请求形成I/O请求包(IRP)发送到驱动程序。
驱动程序识别出IRP请求后指挥硬件执行相应操作。
2、开发WDM驱动程序的方法
目前开发WDM驱动程序的方法有三种:
①使用Microsoft的Windows2000DDK工具开发。
②使用KRFTech公司的WinDriver。
③使用NuMega公司的DriverStudio。
3、WDM型的USB驱动程序结构
对于USB设备来说,其WDM驱动程序分为USB底层(总线)驱动程序和USB功能(设备)驱动程序。
USB驱动程序符合Windows2000下的内核模式驱动程序的分层体系结构,如图2所示:
图2WDM型的USB驱动程序体系结构
USB底层驱动程序由操作系统提供,负责与实际的硬件打交道,实现烦琐的底层通信。
USB功能驱动程序由设备开发者编写,不对实际的硬件进行操作,而是通过向USB底层驱动程序发送包含URB(USBRequestBlock,请求块)的IRP,来实现对USB设备信息的发送和接收。
采用这种分层驱动程序的设计方法有两个优点:
(1)多个USB设备可以通过USB底层驱动程序来协调它们的工作。
(2)编写分层驱动程序较之编写单一驱动程序相对简单,且可以节省内存和资源,不易出错。
USB驱动程序工作简述如下:
当应用程序想对USB设备进行I/O操作,它需调用WindowsAPI函数,I/O管理器将此请求构造成一个合适的I/O请求包(IRP)并把它传递给USB功能驱动程序。
USB功能驱动程序接收到这个IRP后,根据IPR中包含的具体操作代码构造相应USB请求块(URB),并把此URB放到一个新的IRP中,然后把它传递给USB底层驱动程序。
USB底层驱动程序根据IRP中所含的URB执行相应的操作,并把操作的结果返回给USB功能驱动程序。
USB功能驱动程序接收到此返回的IRP后,将操作结果通过IRP返还给I/O管理器,最后I/O管理器将此IRP操作结果传回给应用程序,至此应用程序对设备的一次I/O操作完成。
用DriverStudio工具包开发WDM型的USB设备驱动程序
前文所提及的WDM驱动程序开发方法,笔者都曾尝试过。
个人认为用DriverStudio开发工具包来开发USB驱动程序行之有效。
其中的DriverWizard是创建WDM驱动程序框架的一个很好的工具,后文将介绍用它来创建USB设备驱动程序的基本框架。
1、搭建开发平台
由于利用DriverStudio开发WDM驱动程序在搭建开发平台的过程中对软件的安装顺序要求颇高,在开发过程中我也曾因为安装顺序的颠倒而失败。
在实践中总结了以下的安装步骤,有必要在此作以介绍。
①在已装了Windows2000操作系统的机子上安装MicrosoftVisualC++6.0。
②安装Win2000DDK。
③安装NuMegaDriverStudio2.0(or2.6)驱动程序开发工具包。
它包含DriverWorks(用于开发内核模式WDM驱动程序)、SoftICE(用于调试WDM驱动程序)等开发工具。
④由于DriverWorks所用的类库是对DDK函数的封装,必须在VC中编译,创建自己的库文件。
⑤设置DDK路径。
2、利用DriverStudio的DriverWorks生成USB设备驱动程序框架
驱动程序开发平台搭建成功后,我们可利用驱动程序生成向导DriverWizard,根据硬件设置较为容易的生成USB设备驱动程序的大体框架。
本人的设置如下:
①选择WDM的驱动程序类型和Windows2000运行平台。
②选择USB总线类型,系统选择的USB芯片是Philip公司的ISP1581,填写它的VID(供应商ID)和PID(设备ID),这些信息由芯片的供应商提供。
③增加端点1和端点2,它们分别具有IN和OUT属性。
④根据需要选择对设备的操作有:
Read、Write、DeviceControl和CleanUp。
⑤选择给端点2产生BULKRead和Write的代码,向导会自动产生一套对端点2进行读、写的代码。
⑥设置驱动程序的属性,采用WDM接口;在选取读写方式时应遵循一条原则:
需要快速传送大量数据时,用DirectI/O,反之用BufferI/O,这里选择BufferI/O;由于无特殊的电源需求,故选用系统默认的ManagePowerForThisDevice。
⑧增加IOCTL接口,在其生成的代码框架中加入自己的操作,以实现一个完整的USB设备驱动程序。
最后就生成了一个WDM型的USB设备驱动程序框架和一个测试该驱动程序的测试程序大体框架。
然后在其中添加需要的功能代码。
3、USB设备驱动程序中的关键例程代码实现
下面以我们的驱动程序为例,介绍USB驱动程序开发中的几个关键例程的实现。
本驱动程序的主要功能是控制USB设备上LED灯通断并且对设备进行读写。
1)初始化例程DriverEntry()
设备驱动程序与应用程序不同,它没有main()或WinMain()函数,而是有一个名为DriverEntry()的入口函数,它通常完成一些初始化工作。
当设备驱动程序被加载时,操作系统调用这个入口。
在使用DriverWizard创建的驱动程序基本框架中,DriverEntry()函数已经写好了,无需添写代码。
在该例程中,驱动程序要向操作系统登记并注册一些消息处理器,通过RegistryPath来找到位于注册表中的驱动程序参数,当驱动程序正确安装后,在注册表KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service下可以找到MyUSB项。
而用DDK编写该入口函数还需初始化Dispatch(分派)例程入口。
2)创建设备例程AddDevice()
大多数的PDO都是在PnP管理器调用该程序入口点时被创建的。
插入新设备后,系统启动时,总线枚举器会发现总线上的所有设备,会自动寻找并安装设备的驱动程序,并由驱动程序中的处理PnP功能模块自动处理AddDevice()例程及其他PnP消息。
此例程使用IoCreateDevice()函数创建设备对象,再使用IoRegisterDeviceInterface()函数将设备组成为一个特定的设备接口,然后使用IoAttachDeviceToDeviceStack()函数关联设备栈。
NTSTATUSMyUSBDevice:
:
AddDevice(PDEVICE_OBJECTPdo)
{
//产生一个DDK中KDevice类新的设备对象
MyUSBDevice*pDevice=new(staticcast
FILE_DEVICE_UNKNOWN,//设备类型
NULL,//指针链接名
0,//设备特征标志位
DO_BUFFERED_IO|DO_POWER_PAGABLE);//I/O传输方式
MyUSBDevice(Pdo,m_Unit);
if(pDevice==NULL)
{
returnSTATUS_INSUFFICIENT_RESOURCES;
}
NTSTATUSstatus=devices->ConstructorStatus();
if(!
NT_SUCCESS(status))//不成功,返回错误状态并删除指针
{
deletepDevice;
}
else//如果成功,向系统报考设备的电源状态变化为PowerDeviceD0
{
m_Unit++;
pDevice->ReportNewDevicePowerState(PowerDeviceD0);
}
returnstatus;
}
3)LED控制处理例程MyUSB_IOCTL_LED_Handler()
该例程是实现本驱动程序功能的关键例程,它是用来控制设备上的LED灯通断,主要利用USBVendorRequest来向设备传送。
其中,request=1的时候表示让LED亮,request=0的时候让LED灭。
它是通过DeviceControl由上层应用程序传下来。
实现代码如下:
NTSTATUSMyUSBDevice:
:
MyUSB_IOCTL_LED_Handler(KIrpI)
{
NTSTATUSstatus=STATUS_INVALID_PARAMETER;
//检查输入参数是否正确,如果不正确,返回STATUS_INVALID_PARAMETER
if(I.IoctlOutputBufferSize()||!
I.IoctlBuffer()||(I.IoctlInputBufferSize()!
=sizeof(UCHAR)))
returnstatus;
//处理MyUSB_IOCTL_LED_ON请求
PURBpUrb=m_Lower.BuildVendorRequest(NULL,//传输缓冲区
0,//传输缓冲区大小
0,//请求保留位
(UCHAR)(*(PUCHAR)I.IoctlBuffer()),//请求1=LED_ON,0=LED_OFF
0);//值
//向下传送URB
status=m_Lower.SubmitUrb(pUrb,NULL,NULL,5000L);
//若请求在此处理,设置I.Information指示多少数据拷贝回用户
I.Information()=0;
I.Status()=status;
returnstatus;
}
4)访问硬件例程DeviceControl()
上层应用软件程序就是通过此例程来将IRP传到下层。
NTSTATUSMyUSBDevice:
:
DeviceControl(KIrpI)
{
NTSTATUSstatus;
switch(I.IoctlCode())
{
caseMyUSB_IOCTL_LED:
status=MyUSB_IOCTL_LED_Handler(I);
break;
default:
//未被声明的I/O控制请求
status=STATUS_INVALID_PARAMETER;
break;
}
}
限于篇幅,这里仅介绍本驱动程序中的部分例程实现代码。
编写完驱动程序后,首先在VisualC++中编译通过,然后连接硬件,用DriverStudio工具包中的SoftICE调试器调试该驱动程序,并且修改编译DriverStudio产生的该驱动程序的测试程序,就通过命令行来测试我们的驱动程序。
最后对于LED的控制,我们可以直观的在设备上看到。
结束语
USB技术的不断发展和完善,已经使其逐渐成为先进总线接口技术的标志和方向,如今USBOTG标准已经发布,那么USB的应用领域也将越发的广泛。
开发一些特定功能的USB接口并设计其设备驱动程序也将成为应用USB技术的关键。
通过对USB的学习和Windows2000下的WDM驱动程序的研究,本文已经给出了编写WDM型USB设备驱动程序的一般方法,读者可以在实际应用中逐步提高对USB和驱动程序的认识,取得事半功倍的效果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 开发 WDM USB 设备 驱动程序
![提示](https://static.bdocx.com/images/bang_tan.gif)