8

概括

我正在使用STM32F072 Discovery board为自定义 USB 设备开发固件和 PC 测试应用程序。该设备包括 Microsoft Windows 兼容 ID (WCID),可在 PC 上自动安装 WinUSB 驱动程序。

该设备在其他 Windows 10 主机上被正确枚举,但在我的 Windows 10 开发 PC 上却没有。我的开发 PC 之前曾尝试枚举具有相同 VID/PID 组合但具有不同描述符/元数据的设备。如果我将 PID 更改为其他数字(对我的开发 PC 来说是新的),它确实可以正确枚举。

问题

  1. 我怎样才能让它在我的开发 PC 上与我想要的 VID/PID 组合一起工作?
  2. Windows 缓存 USB 元数据是否是这台 PC 上枚举失败的原因?
  3. 在设备描述符和元数据不断变化的阶段,(Windows)PC 端测试/开发 USB 设备固件的最佳实践是什么?是否可以避免仅仅为了避免 Windows 缓存而咀嚼 PID?

细节

由于 Windows 从以前的枚举中缓存 USB 描述符等的方式,在固件开发期间,每次我进行其他更改后,我都会在固件中增加设备产品 ID (PID),以确保 Windows 不会缓存来自描述符的先前迭代,并弄乱了本来可以工作的东西。

现在我已经让设备在 Windows 7、8 和 10 PC 上作为 WinUSB 设备成功枚举,并且我已经建立了通信。但是当我将固件改回使用我开始使用的 VID/PID,然后将设备连接到我的开发 PC时,它会显示在设备管理器中的“其他设备”下,并带有一个错误图标。我认为这是因为我的(Windows 10)开发 PC 之前已经看到这个 VID/PID 组合具有不同的描述符,所以它被一些糟糕的缓存内容弄糊涂了。

我尝试使用regedit删除设备的注册表项HKLM\SYSTEM\CurrentControlSet\Enum\USB\VID_xxxx&PID_yyyy,但问题仍然存在。(另外,我收到一个错误,因为它无法删除VID_xxxx&PID_yyyy\zzzzzzzzzzzzz\Properties子文件夹。)我还尝试使用USBDeview卸载设备的旧版本,但这也没有任何区别。

另外值得注意的是,我无法再将设备传递给 Virtual Box 虚拟机。我不确定那里发生了什么。

设备管理器中显示的错误枚举

设备管理器代码 28 - 没有兼容的驱动程序

设备驱动程序属性

4

5 回答 5

5

尝试删除表单的任何相关注册表项:

HLKM\SYSTEM\CurrentControlSet\Control\UsbFlags\vvvvpppprrrrr

MSDN 文章Microsoft OS Descriptors for USB Devices说:

操作系统在此注册表项下创建一个名为 osvc 的注册表项,指示设备是否支持 Microsoft OS 描述符。如果设备在操作系统第一次向其查询 Microsoft OS 字符串描述符时未提供有效响应,则操作系统将不再对该描述符进行请求。

于 2017-01-18T00:52:12.390 回答
5

我知道 OP 已经解决了他的问题,但供其他遇到此问题的人将来参考:我在开发具有供应商特定类的 USB 设备时遇到了类似的问题。具体来说,(类似于您的经验)我无法从:中删除密钥
HKLM\SYSTEM\CurrentControlSet\Enum\USB\VID_xxxx&PID_yyyy
因此每次修改设备代码时都必须增加 PID。

无法删除这些键的原因是Properties注册表子文件夹归 拥有System user,因此即使以管理员身份运行,您也无法删除此子文件夹,也无法更改其权限。

从提升的命令提示符下通过PsExec (Mark Russinovich 的SysInternals 套件的一部分)运行Regedit :以系统用户身份运行 regedit,这意味着您可以删除讨厌的Properties子文件夹和父键。psexec -s -i regedit.exeVID_xxxx&PID_yyyy

于 2018-05-03T22:50:21.433 回答
2

我遇到了同样的问题,卸载设备没有帮助。弄乱注册表让我感到不安。我仍然没有看到问题 #3 的真正答案。在我的情况下有效:打开设备管理器,选择非工作设备并执行“更新驱动程序”。从本地可用 (Microsoft) 驱动程序列表中手动选择驱动程序。这并没有解决我所有的问题,但至少 Windows 不再忽略我的设备,我可以继续开发。

编辑:我在 Pete Batard 的名为 WCID Devices 的 github 项目上找到了一个非常有用的描述。我强烈建议阅读本页WCID 设备上的实施部分和以下内容

于 2021-04-02T23:21:04.637 回答
1

删除 TrustedInstaller 拥有的注册表项

不幸的是,运行 RegEdit 的旧PsExec技巧并不总是有效。在这种情况下,尝试使用:

  • ExecTI-作为 TrustedInstaller
    运行 运行它以打开ExecTI GUI 并输入:C:\Windows\regedit.exe

修复文件和注册表权限

您也可以尝试使用非常旧的工具:示例subinacl.exe

subinacl.exe /subkeyreg HKEY_LOCAL_MACHINE\SYSTEM\ControlSet\Enum\USB\VID_0000&PID_0002\

此处进一步说明。并且已被证明仍然可以在 Win10 上运行。

于 2019-01-24T12:30:34.270 回答
1

有一些工具可以删除 USB 设备的隐藏痕迹,例如USBOblivion http://www.thewindowsclub.com/usboblivion-remove-usb-traces-windowsUSBDeview,...

USBOblivion的来源在这里:https://sourceforge.net/projects/usboblivion/ ( https://www.openhub.net/p/usboblivion )

http://www.techerator.com/2010/05/how-to-remove-hidden-duplicate-copies-of-usb-device-drivers-in-windows/

于 2017-01-14T23:26:55.987 回答