- {
- 0x12, /* bLength */
- USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
- 'M', 0x00, /* wcChar0 */
- 'S', 0x00, /* wcChar1 */
- 'F', 0x00, /* wcChar2 */
- 'T', 0x00, /* wcChar3 */
- '1', 0x00, /* wcChar4 */
- '0', 0x00, /* wcChar5 */
- '0', 0x00, /* wcChar6 */
- 0x17, /* bVendorCode */
- 0x00, /* bReserved */
- }
这一步是为了让Windows将我们的设备识别为WCID设备,以便进行下一步操作
第二步
响应请求号为0x17并且index为4的厂商自定义请求,返回内容为:
- {
- 0x28, 0x00, 0x00, 0x00, /* dwLength */
- 0x00, 0x01, /* bcdVersion */
- 0x04, 0x00, /* wIndex */
- 0x01, /* bCount */
- 0,0,0,0,0,0,0, /* Reserved */
- /* WCID Function */
- 0x00, /* bFirstInterfaceNumber */
- 0x01, /* bReserved */
- /* CID */
- 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00,
- /* sub CID */
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0,0,0,0,0,0, /* Reserved */
- };
这一步是为了向Windows上报我们设备的WCID值,因为我们需要的是WinUSB的驱动,所以上报的内容就是WinUSB驱动的WCID:“WINUSB”。
上述内容添加完成后,将你的设备插入电脑,会发现设备能够自动安装上WinUSB驱动程序,如下图所示:
现在问题又来了,设备管理器中确实看到设备驱动已经安装,并且能正常使用,但是要怎么用呢。
微软为了让这个WinUSB能用起来,提供了对应的API。不过这个API用起来不是那么方便,libusb对WinUSB做了进一步的封装,提供了Windows和Linux上访问USB设备的统一接口。笔者对libusb按照Qt的风格又做了一次封装,封装成了QLibUsb。
QLibUsb用起来会更方便一些了。先用enumDevices枚举设备,枚举时可以指定VID和PID,也可以不指定。然后调用open打开设备。打开成功后通过readEndpoints得到设备所有的IN端点号,通过writeEndpoints得到设备所有的OUT端点号。调用write函数向指定的OUT端点写数据。当有IN端点收到数据时,会触发设备的epDataReady信号,在这个信号中对收到的数据进行处理。QLibUsb代码地址:https://github.com/xtoolbox/qtlua/tree/master/src/qlibusb
运行XToolbox.exe后,在USB View框中填入VID和PID后点击【Refresh】按钮搜索设备,在下拉框中选中需要测试的设备后点击Open打开设备。设备打开成功后会在下方显示输入端点和输出端点,选中一个输出端点,填入一些数据后,点击【send】按钮发送数据。当接收到数据时,会在对应的输入端点栏中显示。如下图:

上图中USB设备测试工具下载地址:Github镜像,21ic镜像
如果要在Win8以前的系统中支持WinUSB设备,还是需要编写inf文件,生成inf文件的工具下载:Github镜像,21ic镜像
关于WCID免驱动设备的更多内容在这里:https://github.com/xtoolbox/TeenyUSB/wiki/WCID-Device。
更多关于STM32上USB设备开发的资料也可以阅读《STM32 USB设备开发指南》,此书还在编写中。下载地址:Github镜像,21ic镜像
完整的免驱动自定义设备代码在code.tusb.org,也包括上述测试工具的源代码