WinUSB驱动程序的安装-WINXP
因为WinUSB不需要自己编写驱动,微软已经为我们准备好了,所以使用WinUSB的第一步就是驱动程序的安装问题(当然前提是已经完全硬件设计了),根据微软的说明,WinUSB在Windows 8.1 以上系统中可以使用内置INF文件,同时如果设备固件中包含Microsoft OS 描述符的话,系统可以自动为新设备安装WinUSB驱动。那么在Windows 8.1以下版本中就需要厂商提供INF文件了,所以安装WinUSB驱动的重点就是这个INF文件,有关INF文件的详细信息,可以到微软的技术支持站点查询(http://msdn.microsoft.com),也可以参考USB开发网《USB驱动之INF文件说明》一文。微软专门有一篇技术文档介绍了WinUSB驱动的安装问题:https://msdn.microsoft.com/zh-cn/library/ff540283.aspx
1、怎么在Windows XP下安装WinUSB驱动程序
根据微软《WinUSB (Winusb.sys) 安装》 https://msdn.microsoft.com/zh-cn/library/ff540283.aspx 一文中的介绍,Windows XP系统因为没有内置WinUSB驱动文件,需要一个叫辅助安装程序的东西,它是两个动态链接库文件,分别是:Winusbcoinstaller.dll和WdfcoinstallerXXX.dll,安装时需要将这两个文件打包到安装包中,安装包中除了这两个辅助安装文件外,还有一个INF文件,INF文件向操作系统提供安装驱动程序所必须的信息,操作系统将按INF文件描述的信息自动安装完设备驱动程序。
在哪里找到这两个辅助安装程序呢,微软技术文档里提到要在WDF里提取,WDF是微软在Win7以后推出的驱动程序开发模式。所以首先到 https://www.microsoft.com/whdc/devtools/wdk/WDKpkg.mspxWindows 下载驱动程序工具包WDF,因为现在研究适合Windows XP下的驱动,所以我现在的是WDK 7.1这个版本,根据描述,WDK可以开发适用于Winxp到Win8系统的驱动程序,但不知道WDK的更高版本里提取的辅助安装程序是否可以用在WinXP下,保险起见还是下载WDK 7.1这个版本。下载好后,到安装目录的WinDDK\BuildNumber\redist\winusb\x86提取Winusbcoinstaller2.dll这个程序,x86文件夹下是适用于32位操作系统的,如果要在64位操作系统下安装,应到ia64或amd64文件夹下提取,前者是基于intel Itanium处理器架构的,后者是基于AMD64处理器架构的(Intel也有许多用AMD64架构的CPU哟)。另外一个辅助安装程序WdfcoinstallerXXX.dll到WinDDK\BuildNumber\redist\wdf下提取,同理,32位操作系统应到x86文件夹下提取。我们把提取出来这两个文件放到一个名为WinUSB_Driver(名字可以随便取)的文件夹中。
准备好辅助安装程序后,我们来编写INF文件,辅助安装程序怎么和INF文件怎么配合来完成驱动程序安装过程呢,微软技术文档中为我们提供了一个INF实例,内容如下:
启用辅助安装程序关键在于[USB_Install.CoInstallers]节到[SourceDisksFiles] 节,如下所示:
因为我们提取出来的WdfcoinstallerXXX.dll文件实际文件名是:Wdfcoinstaller01009.dll,所以我们需要修改一下上面那段,修改后内容如下:
另外,根据学习DriverStudio时候的知识,我们还应该修改INF文件里的设备PID和VID,这两个值应该和要安装的设备固件里的PID和VID一致,这里我们仍使用DriverStudio驱动实例里的设备固件为例,这里再一次提供下载链接:
解压后,里面有个hex文件是已经编译好后的程序固件,直接烧录到单片机里。现在我们来修改INF文件里的PID和VID,这个值位于[Standard.NTamd64]节里,修改后内容如下:
最后我们再修改一下产品描述信息,位于INF的最后,修改好的内容如下:
好了,我们现在来测试一下,下面是修改好的安装包:
WinUSB驱动安装包(01) |
但是,你自己测试没有?安装驱动时根本就没反应,问题在于这个INF文件,微软的技术文档里明确说明的是基于X64系统上的,所以还要再改一下,应该修改[Manufacturer]节,并在这个节后面增加一个节,修改后内容如下:
这里再放上修改后的INF文件,测试是要替换上面那个安装包里INF文件:
修改后的INF文件 |
再次测试,有进步了,最后一步提示在INF中找不所需的段落,证明这个INF文件还缺少一些必须的节,本来这个INF文件是基于64位系统的,所也缺节是很有可能的。缺哪些节呢,可以查看C:\Windows\setupact.log这个文件,里面记录了安装设备时的一些信息,内容如下:
这两句都是辅助安装程序WdfCoInstaller输出的,第二条明确提示缺[USB_Install.Wdf]节,但是微软关于WinUSB的技术文档里根本就没有提到过[USB_Install.Wdf]相关信息,没法,在msdn.microsoft.com上搜索了一下,找到《安装框架的辅助安装程序》一文https://msdn.microsoft.com/zh-cn/library/ff544226(v=vs.85).aspx,明确提到驱动程序的 INF 文件必须包含 DDInstall.Wdf 节,据此,在[USB_Install]节前加入如下内容:
KmdfService后的第一个值(WINUSB)表示表示操作系统将分配给驱动程序的内核模式服务的名称,应该是随便取的吧,后面编写应用程序时应该与此有关。KmdfLibraryVersion代表库版本号,为什么这里是1.9呢,请看《WinUSB (Winusb.sys) 安装》一文,里面有张表,是关于辅助安装程序和库版本号的对应关系的:
WinUSB 辅助安装程序 | KMDF 库版本 | KMDF 辅助安装程序 |
---|---|---|
Winusbcoinstaller.dll | 要求 KMDF 1.5 或更高版本 |
Wdfcoinstaller01005.dll Wdfcoinstaller01007.dll Wdfcoinstaller01009.dll |
Winusbcoinstaller2.dll | 要求 KMDF 1.9 或更高版本 | Wdfcoinstaller01009.dll |
Winusbcoinstaller2.dll | 要求 KMDF 1.11 或更高版本 | WdfCoInstaller01011.dll |
好,再来测试,安装过程前面都一直正常,可最后一步提示无法启用此设备,此设备的配置不正确。这个问题困扰了我好久,最后在msdn.microsoft.com上以“winusb install windows xp”为关键词搜索了一下,发现一条标题为“WinUSB installation on XP”论坛帖子(地址:https://social.msdn.microsoft.com/Forums/windowsdesktop/zh-CN/f5ac8722-8d4d-4898-b26c-bfd5265a61dd/winusb-installation-on-xp?forum=wdk),楼主与我一样,都以微软那篇文章里给出INF例子作修改,到最后形成的INF文件和我也差不多,最终结果当然和我一样了,在winxp下到最后一步就挂了。后面的回复里有一条特别重要,内容如下:
Try this:
Windows XP SP3 does not seem to like the "Needs=WINUSB.NT.Services" line:
[USB_Install.Services]
Include=winusb.inf
Needs=WINUSB.NT.Services
Here's what you need to replace it with:
;[2]
[USB_Install.Services]
Include=winusb.inf
Needs=WINUSB.NT.Services
AddService = WinUSB,0x00000002,WinUSB_ServiceInstall
[WinUSB_ServiceInstall]
DisplayName=%WinUSB_SvcDesc%
ServiceType=1
StartType=3
ErrorControl=1
ServiceBinary=%12%\winusb.sys
Everything seems to work fine for me.
Can anybody confirm that I can use the WinUSB_ServiceInstall section even on Win7?
原来DDInstall.Services节里缺AddService项及AddService里指定的一个节,相关信息可参考USB开发网《USB驱动之INF文件说明》一文,现在我们来完成它,修改后的DDInstall.Services节如下:
经过测试,在WinXP已经可以正常安装驱动了,下面再次放上最终的驱动安装包:
WinUSB驱动安装包(02) |
你发现没有,在设备管理器里查看安装了的设备,怎么是出现在“Universal Serial Bus devices”下呢,如下所示:
那想要安装后的设备出现在”通用串行总线控制器“里怎么办呢,关键在于[Version]节里的ClassGUID项的值,如果改成{36FC9E60-C465-11CF-8056-444553540000}就可以了。有兴趣的朋友可以自己试试,但在WIN7和WIN8里,则显示为“通用串行总线设备”,这其实就是”Universal Serial Bus devices“的中文翻译,其GUID值是{88BAE032-5A81-49f0-BC3D-A4FF138216D6},在微软的技术文档里也建议用后者,在下一节里将介绍在WIN7和WIN8系统下的安装。
USB产品
EASY USB D12 是原EASY USB 51 PROGRAMER的升级版,是百合电子工作室历时一年精心设计的一款USB学习板/开发板,与老款相比,其实例更丰富,技术文档更详尽,更重要的是此款USB学习板还提供技术支持。......
|