USB驱动程序的编写采用WDM驱动程序
基于WDM模型的USB驱动构建

N S A U i r nr ( D I E — B E T D vr T T T SDr eE ty I P R V R O J C r e- v N i
添 加一个设备 . 者从系统删 除设备 P P管理器使 或 n 用 安装的 I F文件查 找新设备 的正确驱动 程序 : N 而其
U B软 件 系 统 中 的 HC 和 U B 是 W idw 系 S D SD no s
D1 2
一
O J C e i O je =N L ; B E T dv e b t u L e e Die bet r e b c r r j =Di r j t vO c v O e;
D v r b e > r eU l d i O e一 v r e j t Di r n a =D 2 U l d 一 1 o 1_ n a ; 一 o < Dl r b c > r eE tni 一 A d e i r eO j t D vr x s n > d D v e=D 2 v e一 i e o c 1_
Pn Ad De ie P d vc ;
现
统 自带 的驱 动程 序 .它 主要 功能是 为客户 软件 访 问 U B IU B驱动程序接 口) S D (S 提供接 口 客 户软件位于
/ 置 各 个 I P 的 处 理 函 数 .这 3个 I , 设 R RP是 每 一 个 W D 驱 动 程 序 必 须 处 理 的 M
代 负责处理 特定 U B设备 驱动器 S 计 软件结构 的最高层 . 算 在 开 发 的驱 动 过 程 中并 不 需 要 了 解 HC 和 U B D S D的 机 内部操作 . 软件的各层都是 通过一个 消息的传递 来进
USB接口通信(驱动)的设计与实现

引言WDM是“Windows驱动程序模型”的简称,即“Windows Driver Model”。
实际上它是一系列集成在操作系统之中的常规系统服务集,用于简化硬件驱动程序的编写,并保证它们在Windows 98/Me/2000中的二进制兼容,WDM(Windows Driver Model)模型是从WinNT3.51和WinNT4的内核模式设备驱动程序发展而来的。
WDM主要的变化是增加了对即插即用、电源管理、Windows Management Interface(WMI)、设备接口的支持。
WDM模型的主要目标,是实现能够跨平台使用、更安全、更灵活、编制更简单的Windows 设备驱动程序。
WDM采用了“基于对象”的技术,建立了一个分层的驱动程序结构。
WDM 首先在Windows98中实现,在Windows2000中得到了进一步的完善,并在后续开发的Windows操作系统中都将存在,比如Windows Me和Windows XP。
微软在通过WDM 模型的引入,希望减轻设备驱动程序的开发难度和周期,逐渐规范设备驱动程序的开发,应该说,WDM将成为以后设备驱动程序的主流。
USB技术的全称是通用串行总线,是英文Universal Serial Bus的缩写。
它是一种应用在PC领域的新型接口技术,虽然USB2.0已经被广泛应用,但是初始的Windows 2000是支持USB1.0协议的,如果希望支持USB2.0协议,需要在微软网站上下载升级包。
实际上,对于键盘或者鼠标来说,传输的速度非常小,使用USB1.0或者是USB2.0的区别并不大。
闪存盘之类的存储设备,则需要重视传输速度。
USB1.0版本主要应用在鼠标,键盘等HID设备上,这就是本驱动程序中引用的头文件版本是USB1.0的原因。
本毕业设计的目的是希望对Windows 2000操作系统体系结构和驱动程序开发以及调试等方面的问题有一个比较深入的了解,对USB协议和USB体系有做一个比较深入的了解。
开发WDM型USB设备客户驱动程序

_ _
AI P
Coe a d l H nl s e
说明
关闭设备
COE LS
I RP M j
_ _ e i i Fl t e
从设备读取数据
向设 备发送数据
圉 2 S 设备逻辑结构圉 U B
I RP MJ WRT IE
R E C O T O ei I C nr O缓 冲控制 P MJD VIE C N R L D v eO ot lI c o
般 在驱 动程 序栈 最顶 层 , 它通 过 l O管理 器 与 Wi3 n2 应 用 程 序 联 系 , 同 时又 通 过 U B驱 动 程 序 接 口 S
设备驱动程序与应用程 序不 同 ,它没有 m i a n () Wi a () 或 n i 函数 , 向操作 系统暴露一个名 M n 它 叫 Di rn y的人 口函数 , re i vEa 当设备驱动程序被加载 时 ,操作 系统调用这个 人 口,这点 与动态 链接 库 ( L 很相似 。 r e n y D L) Di r t 除了做一些必要 的初始 vE r 化外 , 还初始化一些 Dsa h i t 例程人 口。 pc 当应用程序 用 Wi 2 A 1 n P 函数对设备进行 打开 / 3 关闭或读/ 写
(SD ) U B 1 与下层驱动程序通信 。 S U B客户驱动程序 的基本 任 务是 传递 控制 命令 与 读 写数 据 ,实 现
57
一
串lt 瞢萱 蕾
撇
・ i
--
1 i
— 趸 』 匿 霜疆露—— ’ 甄
》{
维普资讯
操作时 , 这些 A I P 都将触发各 自 对应的分发例程调 用。例如 调用 Cet i 打开设备时 , r el a Fe 操作系统最终
基于WDM模型USB驱动程序的设计与研究

般 有一些过 滤器 设备对 象( l rdvc bet ie ft e i ojc 。在 e )
WD 驱动程序模 型 中,大多数硬件设备一般只包含 M
两个驱动程序 。 中一个驱 动程序称为功 能驱动程序 , 其
接 口进入到 内核模式下的 I / O管理器, 由管理器根据用 户的相应需求, 通过使用 IP I R ( O请求包) 内核模 式的 / 与 WD 驱动程序通 信, 对驱动程序 的调用, M 完成 最终实
现应 用程序对硬件设备 的调用及控 制。图中左边 是一 个设备对象堆栈 。一个物理硬件可 以有 多个这样 的数 据 结构。处于堆栈最底层 的设备对象称为物理设备对 象(h s a D vc bet,或简称为 P P yi l eie jc c O ) DO。位于设备 对 象 堆 栈 中部 的对 象 称 为 功 能设 备对 象 (u c o a F nt nl i D vc bet eieO jc) ,或简称 F DO。在 F O 的上面和下面 D
3 S 驱动概述 U B
31 S . U B驱动程序分层结构 US 设备驱动程序是基于 WDM 结构之上 的。 B WDM 的分层 驱动 程序 结构在 U B设备上体现在驱动 S 程序分为 U B 总线驱动程序 和 US S B功 能驱 动程序两
I 6 经验 交流 E prne xhn e 8 xei cs cag e E
Ke r s r) d i e d l US d v r To l fDrv r t d o y wo d : 【M rv rmo e; B r e ; o so i i e S i u
1 引 言
US ,是 U iesl e aB s 用 串行总线) B nvra S r l u( i 通 的简
基于DriverStudio的WDM型USB设备驱动的开发

为 了一 种趋 势 , 在开 发 U B设备 的过 程 中 , S S UB
驱 动 的编写 是一项重 要 的技 术环 节 。本文介 绍 了如何 用 D i ru i 写 一 个 WD 型 U B r es d v t o编 M S
驱 动 程序 。
应 的 F O和 P O。WD D D M驱 动程 序采用 了分 成
式 。它源 于 Widw T的分 层 3 设备 驱动 no s N 2位
程序 模型 , 持更 多 的特性 , 能在 WI 8和 支 并 N9 WI2 0 N 0 0间实 现 源 代 码 级 兼 容 , 为 Wi o s 它 n w d
之后 PP管 理 器 参 照 注册 表 中 的信 息 载 人 与 n
中图分 类 号 : T 1 P32 文献标识码 : A 文 章 编 号 : 0 5 - 3 (0 10 - 3 -3 2 8 9 4 2 1 )20 20 0 2
通 用 串行 总线 U B( n eslSr l u) S U i ra ei s v aB 是 一 种基 于令牌 的、 高速 的 串行 总线标 准 , 是微 机领 域里 的新型接 口技术 。它解 决 了串行设 备 和并 行设 备 连 接 的复杂 性 , 大 简化 了计 算 机 大 和外设 的连 接 过 程 , 安 装 简 单 , 持 即 插 即 它 支 用, 占用资源 少 , 独立 供 电同时具 有较 高 的传 输
第3卷 1 21年 01
第 2期 2月 核 电源自 学与探 测技术 Nu l a e to i s & De e t n T c n lg ce r Elcr n c tc i e h o o y o
V0. No 2 131 .
F b 2 1 e. 0 1
基于WDM模型的USB设备驱动程序开发

通 用串 行总 线 US ( i r l ea B s是 C m a、B 等 B Un es rl u) v a S i o pqIM
P C大 厂商 联合 开发 的一种 新型 的 、 于令 牌 的 、 速 的串 行 总线 基 高
标准 。它具 有许 多其 他 总 线 无 法 比拟 的 优 点 。由 于 其 能够 以较
动程 序模 式 。它 源于 Wi o s T 的 分层 3 设备 驱 动 程序 模 n w d N 2位
型, 支持更多的特性 , 如即插即用( n , l n l )电源管理 P P Pu adP y 、 g a
( M。 o e Maae n) Wi o s管 理 诊 断 ( P P w T ngmet、 n w d WMI Wi o s , n w d
前的 U B20协议 速 度高 达 40 p。c S . 8 Mbs .易 于扩 展 。通 过 使 用
WI 20 N 0 0间实现源 代码 级 兼容 , 为 Wi o s 它 n w 操作 系统的 设备 驱 d
动 程序 提供 了统 一的框 架 , Wi o s 台上 , M 将 成 为主流 在 n w平 d WD
象( uc0aD v eO j tF O 。在 FX 的上 面 和下 面 还会 有 F ntnl ei b c,1 ) i c e ) I)
一
些 过滤 器设 备 对象 ( ie D v e i t。位 于 F O上 面 的 过 Flr i e ) t c Ob e e D
Maae I tls u ettn 和 N 事 件 。 并 能 在 WI 9 ngI n nt m nao ) T r e i T N 8和
U B是把低 速 或 中 速 外 部 设 备 连 接 到 计 算 用 方 便 。支 持 热 拔插 , 涉 及 中 断 请 求 a 不 (R ) I Q 冲突 等 问题 , 真正 做到 。 能 即插 即用 ’ b 。 .传输 速 率 高 。目
基于WDM的USB驱动程序研究与设计

WD M模 型采 用 了 图 1 示 的层 次 结构 。 所
程序模 型 , Mi oo 力 推 的全 新 驱 动 程 序 模 式 , 是 c sf r t 旨在 通过 提供 一种 灵 活 的 方 式来 简化 驱 动 程 序 的 开发 , 在实 现对 新硬 件支 持 的基础 上减 少并 降低 所
动程 序管理计 算 机与 P O( h s a D vc bet D P yi l ei O jc) c e
般在 驱 动程序 栈最 顶 层 , 通 过 1 理 器 与应 用 它 0管 程序 联 系 , 时 又 通 过 U B驱 动 程 序 接 口 ( S — 同 S U B D ) 下 层 驱 动 程 序 通 信 。U B客 户 驱 动 程 序 的 I与 S 基 本 任务是 使用 各种 IC L传递 包 含 控 制命 令 与 OT 读 写数 据 的 U B, 现应 用 程 序 对 底 层 硬 件 的 操 R 实
WD Widw r e o e) 即 Wi3 M( n o sD i rM d 1 , v n 2驱 动
序 ( u ci r e , 通 常 所 说 的硬 件 设 备 驱 动 FntnD i ) 即 o v
程序 , 责初 始化 IO操 作 , 理 IO操作 完成 时 负 / 处 /
产生 的 中断事 件 , 并为 用户 提供 一种 适 当的设 备控 制方 式 ; 另一 驱动 程序 为 总 线驱 动 程 序 ( U r . B SD i v e) 负责 管理 硬件 与计 算机 的连 接 。 r,
关键 词
中 图分 类 号
T 32 P 1
1 引言
U B U i ra S r l u ) 即通 用 串行 总 线 , S ( nv sl ei s , e aB 是 为实 现计算 机 和 通信 的集 成 而 提 出的 一 种用 于 扩充 P C体 系结 构 的 工业 标 准 。它提 供 一 种快 速 、 双 向 、 价并 支持 即插 即用 ( n ) 廉 P P 的串行 接 口。 随 着计算 机及 通信 技术 的不 断 发展 及 U B设 S 备 的迅 速普及 和 日益增 多 , 计 和开 发相关 驱 动程 设 序 的需求 也越 来越 大 , 而且 驱动程 序 质量 的高 低不 仅直 接影 响 到 U B设 备 性 能 的发 挥 , 关 系 到整 S 还 个 系统 的稳 定 。 因此 设 备 驱 动 程 序 的设 计 研 究 显 得尤 其重 要 。
基于WDM的USB键盘驱动程序开发

_
开发 U B接 口驱动程序 , S 实现 了 U B键盘 驱动程序 的开 发、 S
安装 及测试。
1 WDM 驱动 程序模 型
在 WD M驱动程序模型 中, 每个 硬件设备 包括两个 驱动 程序 。一个驱动程序是硬件设备驱动程序 , 也称 功能驱动程 序, 主要 为用户 提供适合 的控 制方式。它了解硬 件工作 的所 有细节 , 责初 始化 IO操作 , 理 IO操 作 完成时所 带来 负 / 处 / 的 中断事件 。通常 由两 个分离 的执行 文件 组成 。一 个文 件 是类驱动程 序 , 了解 如何 处 理操 作 系 统使 用 的 WD 协 它 M 议, 以及 如何管 理整个设备 的基本 特征 】 。另一个文 件称 为 微小驱动程序 , 它包含类 驱动用于管理设备实例的厂商专 有 特征例程 。类驱动程序 和微小 驱动程 序合在 一起 才成 为一 个完整 的功 能驱 动程序 。 另一个驱 动程序称 为总 线( U ) B S 驱动程序 , 负责管理 硬
件与计算机 的连接 。
一
O eB lf cp O eB lt ep包 含 O e B lt fc p n y .p : pn yn .p n f pn yn r e函 ea
数 , pn yne ae函数用 G I O eB ltr c f U D接 口方式 与 WD 进行 通 M 信。
Te t s
山西 电子 技术 21 0 2年 第 3期
文章 编号 :64 47 (0 2 0 -0 2 0 17 .5 8 2 1 )30 6 -2
软 件 技 术
基 于 WD 的 U B键 盘 驱动 程 序 开发 M S
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
U S B驱动程序的编写采用W D M驱动程序Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】USB驱动程序的编写采用WDM 驱动程序。
WDM 驱动程序是一些例程的集合,它们被动地存在,等待主机系统软件(PnP 管理器、I/O 管理器、电源管理器等)来调用或激活它们。
具体驱动程序不同,其所包含的例程也不同。
一个WDM 驱动程序的基本组成包括以下5个例程:(1)驱动程序入口例程:处理驱动程序的初始化。
(2)即插即用例程:处理PnP 设备的添加、删除和停止。
(3)分发例程:处理用户应用程序发出的各种 I/O 请求。
(4)电源管理例程:处理电源管理请求。
(5)卸载例程:处理驱动程序的卸载。
包含文件:, ,, , , makefile,sources)在文件中,包含了上述五个例程:中定义了各种数据结构还有各种IOCTL控制码,用于不同数据的读写。
中实现了各种驱动例程。
包含了上述五个所说例程外还包含了其他例程,课程从下面的驱动程序入口例程得出一些信息。
驱动程序入口例程:NTSTATUSDriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){NTSTATUS ntStatus = STATUS_SUCCESS;PDEVICE_OBJECT deviceObject = NULL;DriverObject->MajorFunction[IRP_MJ_CREATE] = Ezusb_Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Ezusb_Close; ources. If you want to add a new source # file to thiscomponent. This file merely indirects to the real make file # that is shared by all thedriver components of the Windows NT DDK # !INCLUDE $(NTMAKEENV) 不要编辑这个文件。
事实上每个WDM程序所需要的makefile的内容都是一样的,只需要简单地copy一个makefile到新的项目中就可以了2、SourcesTARGETNAME= TARGETTYPE=DRIVER DRIVERTYPE=WDM TARGETPATH=lib INCLUDES=$(BASEDIR)inc; $(BASEDIR)incddk; TARGETLIBS=$(BASEDIR)lib*SOURCES= \这个文件指定了驱动程序目标名是,是一个WDM驱动程序,生成的文件存放在lib目录中。
值得注意的是,“=”前后不能有空格,否则编译的时候会出错。
开始编译:“开始”->“程序”->“Development Kits”->“Windows 2000 DDK”->“Checked Build Environment”屏幕将显示:(有“回车”的那行是需要读者你亲自打进去的)New or updated MSVC detected. Updating DDK envi ronment…. Setting environment for usingMicrosoft Visual C++ tools. Starting dirs creation…Completed. D:NTDDK>cd jtag_usb (回车)D:HelloWDM>build (回车)如果源代码没有错误的话,生成的将存放在lib目录中。
安装驱动程序:利用INF文件实现驱动的安装。
我们一般是采用INF文件,inf文件如下所示::[Version] Signature = "$CHICAGO$" Class = USB DriverVer = 11/11/2007,1.00.00 ClassGUID ={36FC9E60-C465-11CF-40000} provider = %ECICT% [SourceDisksNames] 1=%CYUSB_INSTALL%,,, [SourceDisksFiles] = 1 [Manufacturer] %MfgName%=ECICT[Ecict] %VID_0547&%=CyUsb, USB\VID_0547&PID_1002 [DestinationDirs]= 10,System32\Drivers [] AddReg= []CopyFiles= AddReg= [ AddReg= Addservice = CyUsb, 0x00000002, [] DisplayName = %% ServiceType = 1 ; SERVICE_KERNEL_DRIVER StartType = 3 ;SERVICE_DEMAND_START ErrorControl = 1 ; SERVICE_ERROR_NORMAL ServiceBinary = %10%\System32\Drivers\ LoadOrderGroup = Base [] HKR,,DevLoader,,*ntkern HKR,,NTMPDriver,, [ [ ;---------------------------------------------------------------; [Strings] CYUSB_INSTALL = "Your Device Installation Disk" ECICT = "ECICT" MfgName ="ECICT" VID_0547& = "USB_Jtag Controler" ;------------Replace GUID belowwith custom GUID-------------; = "{07BBF83D-D0B2-4915-870C-FC5B0B049DFC}" 准备好这个文件后,插入控制器,然后跳出设备驱动安装的对话框。
我想从列表选择硬件”->“其它设备”->“从磁盘安装”,选择所在的路径,然后安装。
当安装完成后,系统就会添加上你写好的驱动程序了。
(可以在“设备管理器”中查看到),这个驱动程序就投入使用。
驱动程序与应用程序的接口对用户来说,所用的应用程序都通过I/O控制来访问设备驱动程序。
用户的应用程序首先通过调用Win32函数CreateFile()来取得访问设备驱动的句柄。
然后,用户程序使用Win32函数DeviceIoControl()来提交I/O控制码,并为 CreateFile 函数返回的设备句柄设置I/O缓冲区。
下面的例程验证所获取的EZ-USB设备的句柄:HANDLE DeviceHandle;DeviceH andle=CreateFile( “\\\\.\\ezusb-0”,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);随后,用户的应用程序通过调用Win32函数DeviceIoControl()来向设备驱动程序发送请求。
下面显示的是DeviceIoControl()函数的原型。
EZ-USB设备驱动程序IOCTL使用相同的函数参数名。
BOOL DeviceIoControl() {HANDLEhDevice, //外设句柄DWORDdwIoControlCode, //I/O操作控制代码LPVOIDlpInBuffer, //输入缓冲区指针DWORDnInBufferSize, //输入缓冲区大小LPVOIDlpOutBufferSize, //输出缓冲区指针DWORDnOutBufferSize, //输出缓冲区大小LPDWORDlpBytesReturned, //实际返回的字节数LPOVRLAPPERlpOverLapper //用于异步操作的重叠指针}其中I/O操作控制代码是在USB设备驱动程序中定义和实施实际数据操作的,如在驱动程序中定义的:IOCTL_EZUSB_GET_DEVICE_DESCRIPTOR, IOCTL_EZUSB_BULK_READ, IOCTL_EZUSB_BULK_WRITE 等控制代码。
例如:(1)通过红色标注的ioctl控制码写入一个地址值。
//******************************************************* VENDOR_OR_CLASS_REQUEST_CONTROL myRequest; //在中定义的数据结构ULONG nBytes;WORD pvBuffer[1]; //temp for data and addresspvBuffer[0]=Addr; //地址//------------写地址--------------------------=0x00;//0-HOST T0 DEVICE,1-DEVICE TO HOST=2;//1-class,2-vendor=0;//0-device,1-interface,2-endpoint,3-ot her=0xb4;=0x00;//在这里不起作用=0x00;DeviceIoControl (hDevice,IOCTL_EZUSB_VENDOR_OR_CLASS_REQUEST, //ioctl控制码&myRequest, sizeof(VENDOR_OR_CLASS_REQUEST_CONTROL),pvBuffer,2,&nBytes,**********************************************************//(2)大块数据的写//******************************************************* BULK_TRANSFER_CONTROL bulkControl; // pipe type selected PWORD pData=0; //通道0用于写,通道1用于读。
pData=(PWORD)malloc(lenth*2);DeviceIoControl (hDevice,IOCTL_EZUSB_BULK_WRITE, //数据块的写IOCTL码&bulkControl,sizeof(BULK_TRANSFER_CONTROL),pData,length*2,&nBytes,**********************************************************//(2)大块数据的读//******************************************************* BULK_TRANSFER_CONTROL bulkControl; // pipe type selected PWORD pData=1; //通道0用于写,通道1用于读。