簡體   English   中英

為什么 windows 不加載 WINUSB 驅動程序?

[英]Why isn't windows loading the WINUSB Driver?

我正在使用 Windows 提供的驅動程序開發一個包含幾個 USB 功能(截至目前的 CDC-ACM 和 DFU)的 USB 設備。

設備描述符指示設備使用 IAD(接口關聯描述符),配置描述符反映了這一點,包含 CDC 功能以及 DFU 功能的所有描述符。 此配置在非 Windows 平台上開箱即用,兩個驅動程序都正確分配。

由於WCID(Windows 兼容 ID)要求,我設置了以下描述符,指示 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, 0, 0, 0, 0, 0, 0},
    .subCompatibleID = {0, 0, 0, 0, 0, 0, 0, 0}
  },
  {
    .bFirstInterfaceNumber = INTERFACE_DFU,
    .compatibleID = {0x57, 0x49, 0x4E, 0x55, 0x53, 0x42, 0x00, 0x00},
    .subCompatibleID = {0, 0, 0, 0, 0, 0, 0, 0}
  }
}
};

當設備連接時,我觀察到窗口請求 0xEE 字符串描述符,然后請求 CompatibleID 描述符。 設備管理器確認這一點,如下面的屏幕截圖所示。 但是,使用 WINUSB API 調用的主機端軟件無法檢測到設備。 當我檢查Zadig 時,很明顯 windows 已經加載了 libusb 驅動程序,而不是我請求的 winusb。

顯示 WINUSB 作為兼容 ID 的設備管理器屏幕截圖 Zadig 的屏幕截圖顯示了 libusb 驅動程序

盡管存在此問題,CDC-ACM 功能仍可通過設備管理器中顯示的正常運行的虛擬串行端口按預期工作。

我是否在 CompaptibleID 描述符配置中犯了任何錯誤,或者是否需要采取任何其他步驟來確保加載了正確的驅動程序?

您不需要使用 Zadig 來查看 Windows 正在使用的驅動程序。 當您雙擊您的設備並轉到“驅動程序”選項卡時,SYS 文件列表將顯示在設備管理器中。

在某些時候,可能通過 Zadig 之類的軟件,您可能已經在您的計算機上加載了一個 INF 文件,該文件告訴它在您的設備上使用 libusb0。 如果是這種情況,您可以在設備管理器中檢查您的設備並查看“Inf 名稱”字段以找出對此負責的 INF 文件。

我建議您右鍵單擊您的設備並選擇“卸載設備...”以刪除您的設備與 libusb0 的關聯。 您還應該在執行此操作時單擊“卸載驅動程序軟件”復選框以刪除不需要的 INF 文件(如果存在)。

我在閱讀 Microsoft Descriptor 文檔的兩行之間找到了解決方案。 為了讓 Windows 加載 WINUSB 驅動程序,僅MicrosoftComaptibleID描述符是不夠的。 Windows 要求設備在另一個 Microsoft 特定描述符的幫助下添加 DeviceGUID 注冊表項。 這可以在 Microsoft Descriptor Specification 1 下完成,但我在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 的注冊表屬性描述符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM