您现在的位置: USB开发网 > USB开源项目 > Easy USB 51 Programer Plus
- Easy USB 51 Programer Plus

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实例,内容如下:

  1. ;  
  2. ;  
  3. ; Installs WinUsb  
  4. ;  
  5.   
  6. [Version]  
  7. Signature = "$Windows NT$"  
  8. Class     = USBDevice  
  9. ClassGUID = {88BAE032-5A81-49f0-BC3D-A4FF138216D6}  
  10. Provider  = %ManufacturerName%  
  11. CatalogFile = WinUSBInstallation.cat  
  12. DriverVer=09/04/2012,13.54.20.543  
  13.   
  14. ; ========== Manufacturer/Models sections ===========  
  15.   
  16. [Manufacturer]  
  17. %ManufacturerName% = Standard,NTamd64  
  18.   
  19. [Standard.NTamd64]  
  20. %DeviceName% =USB_Install, USB\VID_0547&PID_1002  
  21.   
  22. ; ========== Class definition ===========  
  23.   
  24. [ClassInstall32]  
  25. AddReg = ClassInstall_AddReg  
  26.   
  27. [ClassInstall_AddReg]  
  28. HKR,,,,%ClassName%  
  29. HKR,,NoInstallClass,,1  
  30. HKR,,IconPath,%REG_MULTI_SZ%,"%systemroot%\system32\setupapi.dll,-20"  
  31. HKR,,LowerLogoVersion,,5.2  
  32.   
  33. ; =================== Installation ===================  
  34.   
  35. [USB_Install]  
  36. Include = winusb.inf  
  37. Needs   = WINUSB.NT  
  38.   
  39. [USB_Install.Services]  
  40. Include =winusb.inf  
  41. Needs   = WINUSB.NT.Services  
  42.   
  43. [USB_Install.HW]  
  44. AddReg=Dev_AddReg  
  45.   
  46. [Dev_AddReg]  
  47. HKR,,DeviceInterfaceGUIDs,0x10000,"{9f543223-cede-4fa3-b376-a25ce9a30e74}"  
  48.   
  49. [USB_Install.CoInstallers]  
  50. AddReg=CoInstallers_AddReg  
  51. CopyFiles=CoInstallers_CopyFiles  
  52.   
  53. [CoInstallers_AddReg]  
  54. HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01011.dll,WdfCoInstaller","WinUsbCoInstaller2.dll"  
  55.   
  56. [CoInstallers_CopyFiles]  
  57. WinUsbCoInstaller2.dll  
  58. WdfCoInstaller01011.dll  
  59.   
  60. [DestinationDirs]  
  61. ; If your INF needs to copy files, you must not use the DefaultDestDir directive here.    
  62. CoInstallers_CopyFiles=11  
  63. ; ================= Source Media Section =====================  
  64.   
  65. [SourceDisksNames]  
  66. 1 = %DiskName%  
  67.   
  68. [SourceDisksFiles]  
  69. WinUsbCoInstaller2.dll=1  
  70. WdfCoInstaller01011.dll=1  
  71.   
  72.   
  73. ; =================== Strings ===================  
  74.   
  75. [Strings]  
  76. ManufacturerName=""  
  77. ClassName="Universal Serial Bus devices"  
  78. DeviceName="Fx2 Learning Kit Device"  
  79. REG_MULTI_SZ = 0x00010000  

   启用辅助安装程序关键在于[USB_Install.CoInstallers]节到[SourceDisksFiles] 节,如下所示:

  1. [USB_Install.CoInstallers]   
  2. AddReg=CoInstallers_AddReg   
  3. CopyFiles=CoInstallers_CopyFiles   
  4.    
  5. [CoInstallers_AddReg]   
  6. HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01011.dll,WdfCoInstaller","WinUsbCoInstaller2.dll"   
  7.    
  8. [CoInstallers_CopyFiles]   
  9. WinUsbCoInstaller2.dll   
  10. WdfCoInstaller01011.dll   
  11.    
  12. [DestinationDirs]   
  13. ; If your INF needs to copy files, you must not use the DefaultDestDir directive here.     
  14. CoInstallers_CopyFiles=11   
  15. ; ================= Source Media Section =====================   
  16.    
  17. [SourceDisksNames]   
  18. 1 = %DiskName%   
  19.    
  20. [SourceDisksFiles]   
  21. WinUsbCoInstaller2.dll=1   
  22. WdfCoInstaller01011.dll=1   

  因为我们提取出来的WdfcoinstallerXXX.dll文件实际文件名是:Wdfcoinstaller01009.dll,所以我们需要修改一下上面那段,修改后内容如下:

  1. [USB_Install.CoInstallers]    
  2. AddReg=CoInstallers_AddReg    
  3. CopyFiles=CoInstallers_CopyFiles    
  4.     
  5. [CoInstallers_AddReg]    
  6. HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01009.dll,WdfCoInstaller","WinUsbCoInstaller2.dll"    
  7.     
  8. [CoInstallers_CopyFiles]    
  9. WinUsbCoInstaller2.dll    
  10. WdfCoInstaller01009.dll    
  11.     
  12. [DestinationDirs]    
  13. ; If your INF needs to copy files, you must not use the DefaultDestDir directive here.      
  14. CoInstallers_CopyFiles=11    
  15. ; ================= Source Media Section =====================    
  16.     
  17. [SourceDisksNames]    
  18. 1 = %DiskName%    
  19.     
  20. [SourceDisksFiles]    
  21. WinUsbCoInstaller2.dll=1    
  22. WdfCoInstaller01009.dll=1  

  

  另外,根据学习DriverStudio时候的知识,我们还应该修改INF文件里的设备PID和VID,这两个值应该和要安装的设备固件里的PID和VID一致,这里我们仍使用DriverStudio驱动实例里的设备固件为例,这里再一次提供下载链接:

 

设备固件源码

   解压后,里面有个hex文件是已经编译好后的程序固件,直接烧录到单片机里。现在我们来修改INF文件里的PID和VID,这个值位于[Standard.NTamd64]节里,修改后内容如下: 

  1. [Standard.NTamd64
  2. %DeviceName% =USB_Install, USB\VID_0471&PID_0666 

  最后我们再修改一下产品描述信息,位于INF的最后,修改好的内容如下:

  1. ; =================== Strings =================== 
  2.  
  3. [Strings] 
  4. ManufacturerName="baiheee electronic studio" 
  5. ClassName="Universal Serial Bus devices" 
  6. DeviceName="Easy USB 51 Programer WinUSB Test" 
  7. REG_MULTI_SZ = 0x00010000 

  好了,我们现在来测试一下,下面是修改好的安装包:

WinUSB驱动安装包(01)

  但是,你自己测试没有?安装驱动时根本就没反应,问题在于这个INF文件,微软的技术文档里明确说明的是基于X64系统上的,所以还要再改一下,应该修改[Manufacturer]节,并在这个节后面增加一个节,修改后内容如下:

  1. ; ========== Manufacturer/Models sections =========== 
  2.  
  3. [Manufacturer] 
  4. %ManufacturerName% = Standard,NTx86,NTamd64 
  5.  
  6. [Standard.NTx86] 
  7. %DeviceName% =USB_Install, USB\VID_0471&PID_0666 
  8.  
  9. [Standard.NTamd64] 
  10. %DeviceName% =USB_Install, USB\VID_0471&PID_0666 

  这里再放上修改后的INF文件,测试是要替换上面那个安装包里INF文件:  

修改后的INF文件

  再次测试,有进步了,最后一步提示在INF中找不所需的段落,证明这个INF文件还缺少一些必须的节,本来这个INF文件是基于64位系统的,所也缺节是很有可能的。缺哪些节呢,可以查看C:\Windows\setupact.log这个文件,里面记录了安装设备时的一些信息,内容如下:

  1. WdfCoInstaller: [09/03/2015 17:55.55.296] DIF_INSTALLDEVICE: Pre-Processing 
  2.  
  3. WdfCoInstaller: [09/03/2015 17:55.55.359] error locating section [USB_Install.Wdf] in inf c:\documents and settings\administrator\桌面\winusb_driver\mywinusb.inf - status(E0000101)  

  这两句都是辅助安装程序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]节前加入如下内容:

  1. [USB_Install.Wdf] 
  2. KmdfService = WINUSB, WinUSB_Install 
  3.  
  4. [WinUSB_Install] 
  5. KmdfLibraryVersion=1.9 

  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节如下:

  1. [USB_Install.Services] 
  2. Include =winusb.inf 
  3. Needs   = WINUSB.NT.Services 
  4. AddService = WinUSB,0x00000002,WinUSB_ServiceInstall 
  5.  
  6. [WinUSB_ServiceInstall] 
  7. DisplayName=%WinUSB_SvcDesc% 
  8. ServiceType=1 
  9. StartType=3 
  10. ErrorControl=1 
  11. ServiceBinary=%12%\winusb.sys 

  经过测试,在WinXP已经可以正常安装驱动了,下面再次放上最终的驱动安装包: 

WinUSB驱动安装包(02)

   你发现没有,在设备管理器里查看安装了的设备,怎么是出现在“Universal Serial Bus devices”下呢,如下所示:

WINUSB驱动安装
 

  那想要安装后的设备出现在”通用串行总线控制器“里怎么办呢,关键在于[Version]节里的ClassGUID项的值,如果改成{36FC9E60-C465-11CF-8056-444553540000}就可以了。有兴趣的朋友可以自己试试,但在WIN7和WIN8里,则显示为“通用串行总线设备”,这其实就是”Universal Serial Bus devices“的中文翻译,其GUID值是{88BAE032-5A81-49f0-BC3D-A4FF138216D6},在微软的技术文档里也建议用后者,在下一节里将介绍在WIN7和WIN8系统下的安装。

------分隔线----------------------------
联系我们
  • Q Q: 1148374829 点击这里给我发消息
  • 旺旺:jhoneqhsieh 点击这里给我发消息
  • 电话:(0)15923141204
  • 淘宝网店