2013-07-16 85 views
4

我試圖設置USB設備,以便在連接到Windows 8機器時自動使用WinUSB作爲驅動程序,如概述here在設備固件中支持WinUSB

它說:

爲了使USB驅動程序堆棧,以瞭解該設備支持擴展的特徵描述,該設備必須定義存儲在字符串索引0xEE的OS字符串描述符。

我認爲我需要在內存位置0xEE創建一個包含描述符的結構體。我會怎麼去解決C?

這裏是我的嘗試:

// The struct definition 
typedef struct { 
    uint8_t bLength; 
    uint8_t bDescriptorType; 
    uint8_t qwSignature[14]; 
    uint8_t bMS_VendorCode; 
    uint8_t bPad; 
} usb_os_str_desc_t; 

// Create a pointer to a struct located at 0xEE 
volatile usb_os_str_desc_t* const extended_feature_support = (usb_os_str_desc_t*) 0xEE; 

// Create a new struct at the location specified in "extended_feature_support" 
(*extended_feature_support) = { 
    .bLength = 0x12, 
    .bDescriptorType = 0x03, 
    .qwSignature = "MSFT100", 
    .bMS_VendorCode = 0x04, 
    .bPad = 0x00 
}; 

但是編譯器不喜歡這個,抱怨那個數據定義沒有類型。 有沒有辦法在C中做到這一點?我是否正確理解文章?

任何幫助將被apprciated。

回答

3

這不是它所說的。您必須響應USB請求,而不是將結構放置在嵌入式系統內存的特定位置。

Windows將在第一次看到VID:PID:Serial時請求索引爲0xee的OS字符串描述符。設備必須以與您顯示的結構格式匹配的數據包進行響應。如果返回的描述符中的所有內容都正確(您的示例看起來不錯),則Windows將發出設備供應商請求,並將bReq設置爲您在字符串描述符響應中提供的MS_VendorCode(在您的示例中爲0x04)。

如果您的設備使用正確的操作系統功能描述符進行響應,則會發生奇蹟。人們通常需要的魔法是讓他們的設備在不提供.inf文件的情況下使用winusb驅動程序。

請注意,此請求只發生一次。如果你正在開發一個設備,你通常會多次這麼做。要做到這一點,您必須從設備管理器中卸載設備,然後在註冊表中,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags下查找您的VIDPIDRELEASE並將其刪除。現在,當您再次插入設備時,它將再次執行此操作系統字符串描述符請求。

有關更多信息,請參閱https://github.com/pbatard/libwdi/wiki/WCID-Devices,這比MS提供的文檔要清晰得多。

+0

這github鏈接看起來像我之後。謝謝! –