网站首页 | 技术文章 | 解决方案 | 电子书籍 | 下载中心 | 电子商城 | 技术论坛 | 电子博客 | 商务信息  
联系站长
加入收藏
会员登陆
交易首页 最新信息 - 推荐信息 - 热门信息 - 免费发布 - 行业新闻 - 行业资讯 - 行业知识 - 积分说明 - 信息分类 - 企业展示 - 帮助
 您的位置: 中国电子设计 >> 技术文章 >> 接口电路 >> 正文 商务信息栏目开通公告  [2008-05-19 11:47:00]
   □  基于WDM的专用USB设备的驱动程序开发   
基于WDM的专用USB设备的驱动程序开发
[作者:王志强 孙书鹰 孙世宇    转贴自:微计算机信息    点击数:    更新时间:2008-10-10
【字体:

Research of Development Technology of USB Apparatus Drivers
Abstract: It is need to develop special drivers in order to develop client(special) apparatus based on USB. This paper introduces drivers model of Win32 and drivers interface of Windows USB, and expounds the method of using DDK to develop USB drivers and development flow based on WDM.
Key words: USB Apparatus; Drivers;  Development 摘要:开发基于USB的客户化(专用)设备,需要开发专用的驱动程序。本文在介绍Win32驱动程序模型和Windows USB驱动程序接口的基础上,重点研究了采用DDK开发基于WDM(Win32 Driver Model)USB驱动程序的方法及开发流程。
关键词:USB设备;驱动程序;开发

1引言
目前对于诸如USB鼠标、键盘等这样的计算机标准外设,Windows系统已经提供了标准的驱动程序,用户无需再进行任何开发工作。而开发专用USB设备,需要开发专用的驱动程序。
Windows2000/XP操作系统不允许用户程序直接访问硬件设备。为了实现对硬件设备的访问和控制,必须通过操作系统所认可的驱动程序对硬件设备实现间接访问和控制。驱动程序通常被认为是操作系统的组成部分,所以,开发驱动程序有严格的规范,被认为是“计算机高手”的工作。而利用DDK进行基于WDM(Win32 Driver Model)驱动程序开发,使驱动程序的开发变成了一项比较简单的工作。
2 Win32驱动程序模型
USB设备驱动程序必须符合由Microsoft为Windows 98及其后版本所定义的Win32驱动程序模型(Win32 Driver Model,WDM)规格。这些驱动程序称为WDM驱动程序,扩展名为.sys。
WDM定义了一个基本模型,处理所有类型的数据。例如,USB类驱动程序为所有USB 设备提供了一个抽象的模型,并具有由所有客户驱动程序使用的定义好的接口。有了对所有设备类型共同的核心驱动程序模型,使驱动程序开发人员更容易从一种类型的设备移动到另外一种类型的设备上去。而且它也意味着驱动程序模型的内核实现尽可能是固定的。
USB是使用标准Windows系统USB类驱动程序访问USBDI(Windows USB驱动程序接口)的USB设备驱动程序。USBD.sys就是Windows系统中的USB类驱动程序,它使用UHCD.sys来访问通用的主控制器接口设备,或者使用OpenHCI.sys访问开放式主控制器接口设备。USBHUB.sys是根集线器和外部集线器的USB驱动程序。在PCI枚举器发现了USB主控制器之后,它会自动装入相关的驱动程序。
3 Windows USB驱动程序接口
大多数客户化的USB设备需要由用户来编写设备驱动程序,以响应内核态或用户应用程序的请求。在内核级,命令由客户驱动程序使用内部IOCTL发送给USB系统,例如IOCTL-INTERNAL-USB-SUBMIT-URB允许发出USB请求块(URB)给系统USB驱动程序。URB允许发出几个功能调用给USB系统。用户态USB实用程序也可以发出几个普通IOCTL给USB设备,目的仅仅是得到连接设备的信息。
3.1函数驱动程序
函数驱动程序(function driver)让应用程序与USB设备,通过API函数来沟通。这些API函数属于Windows的Win32子系统,Win32子系统同时也管理着执行应用程序。函数驱动程序与较低级的总线驱动程序沟通,总线驱动程序控制着硬件。
图1是应用程序与各个驱动程序,如何一起完成USB通信的结构图。当设备或子类别的要求超过类别驱动程序的能力时,会有辅助的过滤器驱动程序来类别驱动程序的能力。一个上层的过滤驱动程序位于类别驱动程序的上方。这样,从客户应用程序传来的要求,会先经过上层的过滤驱动程序,然后才传给类别函数驱动程序。一个下层的过滤驱动程序位于类别驱动程序和总线驱动程序之间,如图1。类别驱动程序会将要求传给下层的过滤驱动程序,然后再传给总线驱动程序。
 
图1应用程序与驱动程序完成USB通信的结构
通用串行总线驱动程序(USBD.SYS)是USB系统中负责管理通用串行总线的工作,位于主机上的一个软件。USBD负责控制所有的USB协议操作和高层的中断处理控制。在Windows98及以上版本中,Microsoft定义了一个新的设备驱动程序模型,称之为Windows设备驱动程序模型(WindowsDriver Model或WDM)。
USB客户应用程序也是一种设备驱动程序,通过定义的一个称之为USB接口的层间接口来访问其下方的USB软件。应用程序正是通过这些USB客户软件来实现与USB设备之间的通信。
针对USB客户应用程序的开发,相应版本的Windows操作系统的设备驱动程序开发包(Device Driver Developer’s Kit,即DDK)给出了相应的USB接口函数。并提供了对于这些函数具体使用的参考文档。
3.2 USBDI的IOCTL
为了编写USB设备驱动程序,通常还要在源代码中包含DDK所提供的几个头文件。这些头文件在Windows98下存放在\98DDK\inc\win98目录中,在Windows 2000下存放在\NTDDK\inc\win2000目录中。这些头文件的用途可以总结如下:
usb100.h  定义了在USB设备驱动程序设计中所要用到的各种常量和数据结构。
Usbdi.h   USBDI例程,其中包括对USBD和USB设备驱动程序通用的数据结构,适用于内核和用户模式。
Usbdlib.h  URB构造和各种例程,定义了USBD所输出的服务,适用于内核和用户模式。
Usbioctl.h  给出了对IOCTL的定义,其中包括对USBD和USB设备驱动程序通用的数据结构,适用于内核和用户模式。
USB类驱动程序主要通过USB驱动程序接口(USBDI)的内部IOCTL使用。因为它们都是内部IOCTL,所以只能用于内核的调用但却不能用于用户态的应用程序。DDK usbioctl.h头文件源代码说明了如何定义和使用这些IOCTL,这些内部IOCTL实际上是利用Windows系统提供的ICO-CODE宏而由驱动程序开发人员新定义的I/O控制代码。
4 USB设备驱动程序的实现
4.1驱动程序的开发环境
Microsoft公司提供的驱动程序开发包(DDK)提供了许多工具、函数及实例,还有详细的开发文档,使用起来比较方便,尤其在Win32驱动程序模型(WDM)出现以后,使用DDK开发驱动程序变得更加简化。本文就是在Windows 2000下使用DDK来进行相应驱动程序的开发。并且使用Visual C++作为编程工具。
4.2驱动程序的组成及各部分主要功能
一个WDM设备驱动程序通常可以完成下面这些工作:⑴初始化;⑵创建、删除设备;⑶即插即用处理;⑷访问硬件;⑸处理电源管理;⑹使用WMI;⑺处理Win32 I/O及控制请求等等。除WMI外,本文涉及到了以上的所有其它设备,并将这些功能划分为不同设备,借助Visual C++予以实现。表1列出了开发的驱动程序主要功能。其中,初始化设备“Init.cpp”是必不可少的。它包含有一个驱动程序的初始化入口点:具有标准函数原型的DriverEntry例程。当驱动程序被装入时,内核调用这个例程。DriverEntry例程的主要工作是在传递的驱动程序对象(DriverObject)中存储一系列回调例程的指针,以便于在分发例程中调用对应的例程来处理IRP。在即插即用管理设备“PnP.cpp” 中有一个AddDevice 例程,它是PnP管理器在用户插入新设备时调用来创建WDM设备对象的例程。

 

4.3 驱动程序的设计
一般来讲,软件下载可以通过用户层应用程序来进行,也可以由驱动程序来完成。对于没有采用外部ROM硬件设计,设备的固件需要由USB芯片中的内部RAM来存储,软件采用由驱动程序下载的方式。这样一来,驱动程序不但要提供主机与设备间的通信功能,而且要具有软件下载的功能。因此,每个设备需要两个驱动程序文件和一个INF文件。可将多个设备硬件描述信息放在一个INF文件中;多个设备使用同一个通用驱动程序;固件下载驱动程序随设备不同而异。
固件下载驱动程序只具有下载固件的功能,设备与主机间的通信功能由通用驱动程序来完成。当设备插入主机时,由设备上EEPROM中存储的相关设备标识按照INF文件中的指令,首先安装固件下载驱动程序,将固件下载至EZ-USB芯片的内部RAM。然后通过重新枚举,由固件中包含的设备标识按照INF文件中的指令安装通用驱动程序。这样就完成了整个驱动程序的安装,主机即可对设备进行读写,实现与USB设备的通信。
驱动程序文件应安装在操作系统指定指定文件夹。在Windows 2000操作系统下,固件下载驱动程序和通用驱动程序安装在\WINNT\system32\drivers文件夹,INF文件安装在\WINNT\inf文件夹;在Windows 98/me/XP操作系统下, 固件下载驱动程序和通用驱动程序安装在\Windows\system32\drivers文件夹,INF文件安装在\ Windows \inf文件夹。
5 USB驱动程序装载
5.1 INF文件
INF文件是一个文本文件,它含有安装一个设备驱动程序需要的所有必需的信息,包括要复制的文件列表、要创建的注册表项等,用以告诉Windows使用哪一个驱动程序。即一旦Windows检测到一个新的USB设备时,设备管理器会将所有的系统 INF文件,与从设备读取的描述符信息相比较,然后决定加载哪一个驱动程序。在Windows 98和Windows 2000上均有相应的快速检测机制,用于加速检测。
INF文件由若干区段(section)组成,用于帮助Windows识别设备,寻找合适的驱动程序,以及将设备信息储存在系统的注册表内。下面列出几个区段及其功用:
 Version区段:是 INF文件的表头;
 ClassInstall区段:安装注册表内的Class区段的一个新类别;
 Manufacture区段:用来识别设备,并为每一个设备定义一个安装区段;
 DestinationDirs区段:定义CopyFile,ReadFile和DelFile项目所使用的文件夹;
 Strings区段:定义其他区段内所指定的字符串。
值得注意的是,EEPROM中包含的产品ID(PID)和厂商ID(VID)和固件代码程序中所包含的PID和VID分别对应INF文件中的两组ID,由一个INF文件根据这两组ID进行两次枚举,即完成驱动程序的安装。以UM-2002IO型USB通用数字IO设备的.inf为例,两组ID号如下定义:
[Manufacturer]
%Cypress%=Cypress
[Cypress]
%USB\VID_04B4&PID_0366.DeviceDesc%=EZUSBDIGIT.Dev,USB\VID_04B4&PID_0366
%USB\VID_04B4&PID_0306.DeviceDesc%=EZUSBDI.Dev, USB\VID_04B4&PID_0306
第一组为EEPROM中包含的ID号,第二组为固件代码程序中包含的ID号。
5.2 WDM驱动程序的安装过程
驱动程序是根据INF文件中的指令来进行安装的。首先,Windows使用 Device 或 Interface描述符中的值来选择装入哪个驱动程序。Windows一开始使用描述符的厂商和产品域(idVendor、idProduct 和 bcdDevice)形成硬件ID 。如果找不到与硬件ID型号匹配的安装INF文件,Windows 将从 Interface的类型域bInterfaceCIass、bInterfaceSubCIass 和 bInterfaceProtocoI形成兼容ID.。然后,Windows会搜索处理这些兼容ID中某一个的安装文件。如果没有找到安装文件,它会提示用户安装新的设备驱动程序。选择的安装文件会指定要装入的设备驱动程序。并在Windows内部的注册表中注册。
插入USB设备后,如果操作系统找到了匹配设备硬件的INF文件,则会自动完成驱动程序的装载。如果没有找到匹配的INF文件,则在系统的提示下通过手工选择安装文件同样可以完成驱动程序的加载,而且,使用后的INF文件会自动复制到Windows下的INF子目录,这样,在下次插入USB设备时,系统无需提示会自动完成安装过程。
6 驱动程序的开发过程
基于EZ-USB系列芯片的设备驱动程序开发分为如下主要工作。
 完成设备固件程序编写;
 建立下载固件驱动程序;
 建立通用设备驱动程序;
 编写INF文件
 制作打包分发程序。
下面以Windows 2000操作系统为例,详细介绍采用NTDDK和Visual C++ 6.0工具,建立USB设备驱动程序的方法:
6.1固件代码的设计
6.2下载固件驱动程序的建立
建立下载固件驱动程序可分以下7步进行:
a  将CYPRESS开发包内的EZLORADER目录下的文件拷贝到自己建立的目录下(如:D:\USBDR\RELDDR)。
b  将C:\CYPRESS\USB\BIN中的HEX2C.EXE和C:\NTDDK\BIN中的BUILD.EXE文件拷贝到D:\USBDR\RELDDR目录下。
c  将自己开发的固件程序的十六位制文件(如PORTC.C)拷贝到D:\USBDR\RELDDR目录下。
d  将D:\USBDR\RELDDR目录的SOURCES文件中的TARGETNAME=EZUSB行改为自己的文件名如:TARGETNAME=“driveroffirm”。
e  在Dos操作符下,用HEX2C.EXE将编译好的固件十六位制文件形式,转换为C文件。即:HEX2C PORTC.HEX PORTC.C用PORTC.C中的INTEL_HEX_RECODE结构数组代替FIRMWARE.C中的INTEL_HEX_RECODE结构数组。
f用BUILD.EXE编译,即在命令行方式下键入BUILD –c。正常情况下,应在D:\USBDR\RELDDR\lib\j386目录中生成RELDDR.SYS文件。(若不能生成RELDDR.SYS文件,进入C:\NTDDK\BIN目录,在命令行方式下键入SETENV C:\NTDDK回车,此时显示设置环境完成,在返回运行BUILD –c。注:系统必须装VC++5.0以上的版本)
g将生成的驱动程序文件放到  \\SYSTEM32\DRIVER目录中。
6.3 通用驱动程序的建立
建立驱动程序也可象建立下载固件驱动程序一样分为若干步,但是如果没有特殊要求,Cypress公司提供的通用驱动程序可满足大多数应用需要,可以采用改写通用驱动程序名字的方法,将通用驱动程序重命名为自己的固件文件名,或者直接用通用驱动程序。并将该驱动程序文件放到  \\SYSTEM32\DRIVER目录中。
6.4 建立INF文件
上面详细介绍了INF文件结构,建立INF文件最好的方法是用实例INF文件改写,即拷贝一个INF实例文件的复本,将这个复本改写为符合自己要求的INF文件。具体操作如下步骤所列。
 将实例INF文件另存为自己的INF文件,如yunio.inf;
 在自己的INF文件中,规划好两组PID和VID号,前一组为EEPROM中的ID号,后一组ID要与固件程序中的ID一致;
 用自己建立的两个驱动程序文件名替代实例INF文件中使用的驱动程序文件名;
 将[...File.Inf]区段实例INF文件名更换为自己的INF文件名。
 在最后的[String] 区段可以添加开发者的信息和该设备的名称。
7 驱动程序的打包
建立生成了上述驱动程序文件之后,需要将其打包制作安装盘,以便于分发使用。但驱动程序的打包应该包含以下内容:
下载固件驱动程序;
通用驱动程序;
INF文件。
8 结束语
应用上述的专用USB设备驱动程序的开发方法及步骤,开发了USB通用数据采集器及USB任意波形发生器等设备,通过实践表明应用DDK进行基于WDM(Win32 Driver Model)的专用USB设备的驱动程序开发,使驱动程序的开发变成了一项比较简单易行的工作。可以大大提高开发效率、缩短开发周期。使开发者可将主要精力集中于实现设备功能上,而不需要重复一些底层的工作。为USB技术在系统检测、诊断领域提供了一个很好的借鉴。
参考文献:
[1] 孙书鹰,等,EZ-USB接口芯片在雷达仿真训练系统中的应用,2003年全国系统仿真学术年会。
[2] 颜荣江,等,EZ-USB2100系列单片机原理、编程及应用,北京航空航天大学出版社,2003。

作者简介:王志强,男,汉,1970年生,讲师。主要研究方向:火力控制工程。
Email:wangzhiqiangsxl@yahoo.com.cn
孙书鹰,男,汉,1962年生,副教授。研究方向:火力控制工程。孙世宇,男,汉,1965年生,教授,研究方向:武器系统性能检测与评估。
通讯地址:050003 河北石家庄军械工程学院二系火控教研室

  • 上一篇文章:基于PDIUSBD12芯片的USB设备接口的设计
  • 下一篇文章:没有了
  • Google
     
    Web www.cediy.com
    发表评论 □告诉好友 □打印此文 □关闭窗口
     最新热点文章
     基于ARM及蓝牙技术的无线测试系统设...
     基于DSP实现对SAA7111A初始化配置的...
     基于Mega8单片机和DS18B20的单总线...
     一种交错双相临界导电模式PFC控制器...
     一种低纹波高精度数字电流源的设计...
     基于数字PWM信号的超声波功率电源的...
     
     最新推荐文章
     基于TMS320C6713与PC机的PCI总线高...
     基于TMS320VC5409和Cygnal单片机构...
     基于ARM控制器S3C44B0x的给煤机控制...
     基于USB 2.0的高速数据采集卡在虚拟...
     大功率谐振过渡软开关技术变频器研...
     大功率谐振过渡软开关技术变频器研...
     
     相 关 文 章
      ◇  网友评论:(只显示最新5条。评论内容只代表网友观点,与本站立场无关!)
     设为首页  加入收藏  关于本站  版权申明   联系站长   宣传赚点   友情链接
    如果我在线,不用加为好友,立刻与我交谈。 业务咨询QQ:342488946
    Copyright© 2004-2010 CEDIY.COM .All Rights Reserved
    粤ICP备05119258号
    “安网”备案标志 网上报警