Cypress提供的通用驱动程序是CyUSB.sys,对应的驱动信息文件是CyUSB.inf。通过CyUSB.inf文件安装通用驱动后,插入FX2LP开发板,计算机设备管理器和Cypress USB Console都可以正常识别出开发板设备,在设备管理器的显示为"Cypress EZ-USB FX2LP No EEPROM",在Console中读出来的VendorID为0x04B4, ProductID为0x8613,这正是.inf文件中描述的FX2LP默认VID&PID,以及该默认VID&PID所对应的设备描述,该默认描述在.inf文件的[Strings]节,其中有这样一句代码:
VID_04B4&PID_8613.DeviceDesc="Cypress EZ-USB FX2LP No EEPROM"
为了能够自定义USB设备在设备管理器中的显示,我想根据Cypress USB Console User's Guide中的Device Driver对.inf文件修改的说明,改成自己预想的设置。这里先对CyUSB.inf文件简单说明一下。
; Installation INF for the Cypress Generic USB Driver for Windows 98ME/2000/XP
;
[Version] //版本段
Signature="$CHICAGO$" //Signature一般必须为此值
Class=USB //驱动程序的类别,说明此为USB设备
ClassGUID={36FC9E60-C465-11CF-8056-444553540000} //对应USB设备的GUID值。不同设备的GUID值不同
provider=%PROVIDER% //INF文件的提供者,%PROVIDER%是一个字符串标记,在[String]段可以看到它所指的字符串
[SourceDisksNames] //定义安装源文件所在磁盘
1=%CYPRESS_INSTALL%,,, //表示安装在磁盘1
[SourceDisksFiles] //待安装的源文件,即待安装的驱动程序
CyUSBME.sys = 1 //表示要安装到哪个目录,具体那个目录在[DestinationDirs]段说明
CyUSB.sys = 1
CyUSB.spd = 1
[Manufacturer] //此节用来指定设备供应商的名称,这个名称同时也是Model段
%MFGNAME%=Cypress //Cypress为Model段
[Cypress] //此为[Model]段,并列出相应的安装段,可以列写多个设备的PID,VID。用来表示响应不同的固件
; Cypress FX2LP default ID
%VID_04B4&PID_8613.DeviceDesc%=CYUSB, USB\VID_04B4&PID_8613 //CyUSB被设置为安装段
; Cypress FX1 default ID
%VID_04B4&PID_6473.DeviceDesc%=CYUSB, USB\VID_04B4&PID_6473
; Cypress FX2LP Example Device. DVK firmware examples use this VID/PID
%VID_04B4&PID_1004.DeviceDesc%=CYUSB, USB\VID_04B4&PID_1004
[DestinationDirs]
CyUSBME.Files.Ext = 10,System32\Drivers //意思是把CyUSBMe.Files.Ext,CyUSB.Files.Ext里的东西指定了方向,即右边的路径。这里没有操作,10,表示C盘下的windows目录
CyUSB.Files.Ext = 10,System32\Drivers //CyUSBMe.Files.Ext ,CyUSB.Files.Ext是两个段,在后面定义了,可以看到这两个段代表了两个驱动文件SunwodaUSB.sys
[CyUSB] //此为安装段,开始向[DestinationDirs]所示路径安装文件
CopyFiles=CyUSB.Files.Ext //CopyFiles是个指令,即将=后面的文件CyUSB.Files.Ext安装到[DestinationDirs]所示的路径
AddReg=CyUSB.AddReg //在注册表中添加相应的新的子键,进行相应操作,操作[CyUSB.AddReg]段中放着
[CyUSB.HW]
AddReg=CYUSB.AddReg.Guid //在HW下的注册
[CYUSB.NT] //在NT(大于win98的平台)平台下的安装及注册
CopyFiles=CyUsb.Files.Ext
AddReg=CyUsb.AddReg
[CYUSB.NT.HW]
AddReg=CyUsb.AddReg.Guid
[CYUSB.NT.Services] //添加安装文件的服务信息
Addservice = CyUsb, 0x00000002, CyUsb.AddService //Addservice是个操作指令格式:Addservice=需要服务的安装段名,0x00000002是固定值,安装服务信息段名
[CYUSB.AddService] //安装服务信息段名
DisplayName = %CYUSB.SvcDesc%
ServiceType = 1 ; SERVICE_KERNEL_DRIVER
StartType = 3 ; SERVICE_DEMAND_START
ErrorControl = 1 ; SERVICE_ERROR_NORMAL
ServiceBinary = %10%\System32\Drivers\CyUSB.sys //这个表示驱动所在的路径,最终可在设备管理器中看到
LoadOrderGroup = Base
[CYUSBME.AddReg] //不同安装段的注册表操作
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,CYUSBME.sys
[CYUSB.AddReg] //不同安装段的注册表操作
HKR,,DevLoader,,*ntkern
HKR,,NTMPDriver,,CYUSB.sys
[CYUSBME.Files.Ext] //待安装的驱动程序文件
CYUSBME.sys
[CYUSB.Files.Ext] //待安装的驱动程序文件
CYUSB.sys
[CYUSB.AddReg.Guid]
;HKR,,DriverGUID,,%CYUSB.GUID%
;---------------------------------------------------------------;
[Strings] //一些显示的字符串,在设备管理器中可以看到
PROVIDER="CyPress"
MFGNAME="Cypress"
CYPRESS_INSTALL="Cypress Generic USB Driver Installation Disk"
VID_04B4&PID_8613.DeviceDesc="Cypress EZ-USB FX2LP No EEPROM"
VID_04B4&PID_6473.DeviceDesc="Cypress EZ-USB FX1 - EEPROM missing"
VID_04B4&PID_1004.DeviceDesc="Cypress EZ-USB Example Device"
CypressUSB.SvcDesc="Cypress Generic USB Driver"
CYUSB.GUID="{02841D59-0003-441A-A625-5D0B1473F2DC}"
我在.inf文件里面基本把Cypress 的信息都改成了自己的信息,然后用Visual Studio中的GUID生成工工具生成了一个新的GUID放到CYUSB.GUID处;
之后,我重新安装了驱动程序,插入FX2LP开发板之后,选择更新设备驱动程序,但提示为你的设备是最佳驱动程序已安装,如下图所示,而设备的显示名称并没有变为我想要的样子。
也就是说,虽然点击了更新设备驱动程序,但由于系统检测到系统中已经安装好了CyUSB.sys驱动,所以就不再更新了。为了解决这个问题,我卸载了设备,然后重新安装驱动,这次选择我已经修改好了的.inf文件,成功安装后,设备还是原来的显示。在C:\Windows\INF中,找到了好很多个oemx.inf文件,从oem1.inf到oem42.inf,其中ome38.inf, oem39.inf, oem40.inf, oem41.inf,oem42.inf都是这几天自己调试FX2LP开发板时安装的,每个.inf文件都有一些地方不一样,系统把所有安装.sys驱动时的.inf文件全部重命名为oemx.inf了。而我最后自定义修改的.inf文件就是oem42.inf文件了。但当前FX2LP开发板绑定的还是oem39.inf文件,如下图所示。
自然而然我就想到一个问题了,即然多个oemx.inf文件都同时存在于C:\Windows\INF中,怎么样在这些文件中切换,以能够使设备绑定自己想要的.inf文件。试了好久都没成功,最后在更新驱动程序中,发现了“让我从计算机上的可用驱动程序列表中选取”,如下图所示,点击之后,在里面找到了与FX2LP兼容的所有驱动,即从oem38-oem42所对应的驱动的设备显示名。
然后选择了与oem42.inf对应的名称,更新好驱动后,终于在计算机设备管理器中能够识别出开发板,并且用自定义的名称显示,如下图所示:
这个时候心情很激动,毕竟插入的设备可以显示自己想要的名称,也算是一点点成就感。但很快又有新的问题出现了,在Cypress USB Console中识别不出该设备,没有任何显示,如下图所示:
既然已经知道了怎么样让设备绑定不同的.inf文件,于是自然就想切换成其他的驱动,看看能不能在Console中显示。结果是选择Cypress默认的oem38.inf,设备能够马上在Console上得到显示,而其他不同的oemx对应的驱动,则不一定能够识别与显示。这里说不一定的意义是有的可以识别出来,而有的确不能识别,有的在切换几次又能够识别出来,没有任何规律可循。很是气恼,在各种USB驱动开发群以及论坛上提问,也没人来回答。只能自己找问题,一切还得回到最基本的技术文档。我把Cypress USB Console User's Guide又通读了一遍,看看能不能的找到什么突破口。终于,在最后一节Using Custom Drivers中找到了这样一段话:
Device drivers can be accessed / identified in the Windows operating system by a unique number called their Global Unique IDentifier (or GUID). Two drivers with the same GUID would not play well together on a system. (The Unique part of GUID would have been violated.)
The CyUSB.sys driver provides a mechanism to allow customers to register the driver with a new GUID that they create. Any application that desires to access devices via that new driver GUID would also need to know the GUID.
CyConsole was designed with provision for connecting to other CyUSB.sys drivers that have different GUIDs. On the Misc. tab sheet you will notice a drop-down list labelled Access devices attached to this driver . The drop-down list is populated with the file names of all copies of CyUSB.sys that are installed in the system. (It gathers the list from the Windows registry.) |
其中第一段的意思是说每一个驱动都必须有一个自己的GUID,如果两个驱动有相同的GUID,在系统中将产生混乱。第二段的意思是CyUSB.sys提供了一个用户能够用自己的GUID来注册驱动的机制。想要通过GUID来与设备进行通讯的任何应用程序都必须知道这个GUID。第三段的意思是CyConsole提供了与拥有不同GUID的CyUSB.sys连接的办法,这个办法就是Misc.选项卡,在其中的下拉列表中可以选择系统中已经安装好的不同的CyUSB.sys的副本。
到这里终于明白了,CyConsole之所以不能识别出更新的设备,是因为在这里没有选择对的CyUSB.sys驱动,选择不同的驱动后,果然在设备列表栏里就识别出了设备,如下图所示:
与设备管理器中显示的名称一致,到这里就算把问题解决了。
PS:
为了能够让设备绑定新的驱动,我试过了很多方法,首先是把C:\Windows\INF中与Cypress USB有关的.inf都删除,便后续又全部重新都有了;然后我想在.inf文件中有注册表的操作,应该是注册表中有驱动的相关信息,所以到注册表中去寻找,注册表中与USB有关的子键有三个位置:
第一个是硬件子键:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum
第二个是服务子键:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services
第三个是类子键:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class
很多在CyUSB.inf中注册表操作段的信息都可以这些地方找到。
我把注册表中这些项都删除了,但后来发现C:\Windows\INF中这些oemx.inf文件还是出现了,这里我还是没搞懂是怎么回事?
如果有大佬知道,请不吝赐教!!!