Windows 10 - 清除 USB 枚举/驱动程序碎片

cp.*_*ngr 8 windows usb driver stm32 winusb

概括

我正在使用STM32F072 探索板为自定义 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 设备固件的最佳实践是什么?是否有可能避免咀嚼 PID 只是为了避免 Windows 缓存?

细节

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

现在,我已将该设备作为 WinUSB 设备在 Windows 7、8 和 10 PC 上成功枚举,并且已建立通信。但是,当我将固件改回使用我开始使用的 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 - 没有兼容的驱动程序

设备驱动程序属性

Dav*_*son 5

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

HLKM\SYSTEM\CurrentControlSet\Control\UsbFlags\vvvvpppprrrrr
Run Code Online (Sandbox Code Playgroud)

MSDN 文章Microsoft OS Descriptors for USB Devices说:

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


小智 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