Windows为什么不加载WINUSB驱动程序?

问题描述

我正在使用Windows提供的驱动程序来开发一个包含两个USB功能(目前为CDC-ACM和DFU)的USB设备。

设备描述符指示设备使用IAD(接口关联描述符),而配置描述符则反映该含义,其中包含CDC功能以及DFU功能的所有描述符。在非Windows平台上,该配置可以直接使用,并且正确分配了两个驱动程序。

由于WCID (Windows Compatible ID) requirements,我已经设置了以下描述符,指示Windows应该为DFU接口加载WINUSB。

USB_MicrosoftCompatibleDescriptor msft_compID = 
{
.dwLength =  sizeof(USB_MicrosoftCompatibleDescriptor) + (2 * sizeof(USB_MicrosoftCompatibleDescriptor_Interface)),.bcdVersion = 0x0100,.wIndex = 0x0004,.bCount = 2,.interfaces = {
  {
    .bFirstInterfaceNumber = 0,//CDC
    .compatibleID = {0,0},.subCompatibleID = {0,0}
  },{
    .bFirstInterfaceNumber = INTERFACE_DFU,.compatibleID = {0x57,0x49,0x4E,0x55,0x53,0x42,0x00,0x00},0}
  }
}
};

连接设备后,我观察到Windows请求0xEE字符串描述符,然后请求CompatibleID描述符。设备管理器确认此确认,如以下屏幕截图所示。但是,使用WINUSB API调用的主机端软件无法检测到设备。当我使用Zadig进行检查时,很明显Windows已加载libusb驱动程序,而不是我请求的winusb。

Screenshot of device manager showing WINUSB as the compatible ID

Screenshot of Zadig showing libusb driver

尽管存在此问题,但CDC-ACM功能可以与设备管理器中出现的可用虚拟串行端口一起正常工作。

我是否在ComaptibleID描述符配置中犯了任何错误,或者是否需要采取其他步骤来确保已加载正确的驱动程序?

解决方法

您无需使用Zadig即可查看Windows使用的驱动程序。双击设备并转到“驱动程序”选项卡,将在设备管理器中显示SYS文件列表。

有时,可能已经通过Zadig之类的软件在计算机上加载了一个INF文件,该文件告诉它在设备上使用libusb0。您可以在“设备管理器”中检查您的设备,然后查看“信息名称”字段,以找出造成此问题的INF文件。

我建议您右键单击设备,然后选择“卸载设备...”以删除设备与libusb0的关联。在执行此操作时,还应单击“卸载驱动程序软件”复选框,以删除不需要的INF文件(如果存在)。

,

在阅读Microsoft Descriptor文档之后,我找到了解决方案。为了使Windows能够加载WINUSB驱动程序,仅MicrosoftComaptibleID描述符是不够的。 Windows要求设备在另一个Microsoft特定的描述符的帮助下添加DeviceGUID注册表项。 可以在Microsoft描述符规范1下完成此操作,但是在此excellent guide by google.

的帮助下,我将整个设备更新为支持版本2.0。

因此,我当前的描述符结构如下所示。

BOS descriptor 
    Bos header 
    WEBusb capability
    Microsoft capability
        Microsoft descriptor set header

BOS描述符是2.0到3.0之间发布的官方USB规范的一部分。 Windows读取Microsoft描述符集标头时,它将通过供应商请求来请求Microsoft描述符集。

MSFTDesc
USB_MSFTDescriptorHeader            
    USB_MSFTConfigurationSubsetHeader   
    USB_MSFTFunctionSubsetHeader        
    USB_MSFTCompatibleIDFeatureDescriptor   
    USB_MSFTRegPropertyDescriptor 

Microsoft描述符集包含兼容的ID以及GUID的注册表属性描述符。