參考鏈接:
https://github.com/xtoolbox/TeenyUSB
https://github.com/pbatard/libwdi/wiki/WCID-Devices
https://www.amobbs.com/thread-5530162-1-1.html
https://github.com/MichaelTien8901/STM32WINUSB
上位機參考:https://github.com/xtoolbox/qtlua/tree/master/src/qlibusb
總結一下,主要需要做三個工作:
1.添加存儲在字符串索引0xEE處的【OS字符串描述符】,其中包含bMS_VendorCode值,接下來的請求將使用該值。
2.在收到Vendor Request的 bRequest 等於bMS_VendorCode值的請求以后,若設置包的 wIndex == 0x0004,返回【WINUSB_ExtendedCompatId_Descritpor】。
3.在收到 Interface Request 的 bmRequestType 等於0xC1值的請求以后,若設置包的 wIndex == 0x0005,則返回【WINUSB_ExtendedProperty_InterfaceGUID_Descritpor】。
在調試1的過程中,win只會在第一次插入時請求0xEE,所以
0x00 關於如何對WINUSB進行DEBUG 請注意,Windows僅查詢OS字符串描述符一次,在開發過程中會造成麻煩。OS描述符存儲在注冊表中 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\UsbFlags\VVVVPPPPRRRR (VVVV - VID; PPPP - PID; RRRR - 版本號) 請刪除你USB設備對應的注冊表項,然后使用USBDeview卸載設備,以便始終獲得新的設備插入行為。
第一次插入:
第二次及以后插入:
可見只會在第一次查詢OS字符串描述符。
STM32F103C8T6 Demo:https://gitee.com/guanglunking/WINUSBF103Demo
如何從cubemx生成的USB CDC工程改為WINUSB工程可以看該次提交的diff:https://gitee.com/guanglunking/WINUSBF103Demo/commit/748cb59de2f920a92b7f5469e471eaa30cf356c6
測試上位機:https://gitee.com/guanglunking/WINUSB_PC_Test