STM32 WINUSB1.0详细适配教程
废话不多说,先上一个配置好的工程,急于完成适配的可先取走。需要了解原理或者适配后有问题的可继续阅读!
通过网盘分享的文件:stm32h750_winusb.rar
https://pan.baidu.com/s/1ENncscWVfQLHsOEhbe0sXQ?pwd=dr24 提取码: dr24
说明:这个工程是基于STM32CUBEIDE 1.9.0版本开发,配置了FreeRTOS及USB HighSpeed
WINUSB适配的是WINUSB1.0的版本,即大家网上常见的会读取0xEE处字符串描述符的版本!
后续笔者将推出一个WINUSB2.0适配的方案!
一、WINUSB概述
1.1 WINUSB(WCID)简介
TBD:
1.2 WINUSB1.0缺陷
(1)WINUSB1.0需要查询0xEE处字符串描述符,但是部分老旧的设备可能不支持这个字符串描述符的查询,从而导致USB设备枚举失败甚至死机。
(2)WINUSB虽说是免驱,但实际上只有WINDOWS8及以上系统是真正意义上的免驱,WINDOWS7系统仍然需要INF文件才能识别!
(3)WinUSB不支持Windows 2003 ( 32bit/64bit )
(4)WinUSB不支持Windows XP 64位(可以通过第三方驱动支持)
(5)SB设备版本必需是2.0或2.0以上,WinUSB不支持USB1.0和1.1
工作太忙了,时间原因,先占个坑,后续慢慢完善吧!
二、详细适配过程
急用的同学可以先参考下这个文章,写的其实也挺详细的。再结合上面适配好的工程,相信稍微花点点时间一定能解决这个适配问题!
STM32 WinUSB(WCID)免驱高速通信 20M/s(附详细测试)-CSDN博客
三、WINUSB枚举抓包
使用USB分析仪的抓包数据:
//抓包数据
//step1:预获取设备描述符
req data: 80 06 00 01 00 00 40 00
rsp data: 12 01 00 02 00 00 00 40 10 08 21 F1 00 02 01 02 03 01
//step2:设置USB设备地址
req data:00 05 22 00 00 00 00 00
rsp data:NULL
//step3:获取设备描述符
req data: 80 06 00 01 00 00 12 00
rsp data: 12 01 00 02 00 00 00 40 10 08 21 F1 00 02 01 02 03 01
//step4:获取设备配置信息
req data: 80 06 00 02 00 00 ff 00
rsp data: 09 02 27 00 01 01 04 C0 32 09 04 00 00 03 FF 00 00 00 07 05 01 02 00 02
00 07 05 81 02 00 02 00 07 05 82 03 08 00 10 (39bytes)
//step5:获取字符串描述信息
req data: 80 06 03 03 09 04 ff 00
rsp data: 1A 03 33 00 31 00 36 00 39 00 33 00 34 00 37 00 44 00 33 00 35 00 33 00
32 00
//step6:用户自定义请求
req data: C0 A0 00 00 04 00 10 00
rsp data: 28 00 00 00 00 01 04 00 01 00 00 00 00 00 00 00
//step7:用户自定义请求
req data: C0 A0 00 00 04 00 28 00
rsp data: 28 00 00 00 00 01 04 00 01 00 00 00 00 00 00 00
00 00 57 49 4E 55 53 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
//step8:获取字符串描述符
req data: 80 06 00 03 00 00 ff 00
rsp data: 04 03 09 04
//step9:获取字符串描述符
req data: 80 06 02 03 09 04 ff 00
rsp data: 36 03 42 00 55 00 53 00 4D 00 55 00 53 00 54 00 20 00 55 00 53 00 42 00
2D 00 43 00 41 00 4E 00 28 00 46 00 44 00 29 00 20 00 46 00 61 00 6D 00
69 00 6C 00 79 00
(bumust CANFD Family)
//step10:获取设备描述符
req data: 80 06 00 01 00 00 12 00
rsp data: 12 01 00 02 00 00 00 40 10 08 21 F1 00 02 01 02 03 01
//step11:预获取配置描述符0
req data: 80 06 00 02 00 00 09 00
rsp data: 09 02 27 00 01 01 04 C0 32
//step12:获取配置描述符
req data: 80 06 00 02 00 00 27 00
rsp data: 09 02 27 00 01 01 04 C0 32 09 04 00 00 03 FF 00 00 00 07 05 01 02 00 02
00 07 05 81 02 00 02 00 07 05 82 03 08 00 10
//step13:获取状态Get Status
req data: 80 00 00 00 00 00 02 00
rsp data: 01 00
//step14:Set Config 1
req data: 00 09 01 00 00 00 00 00
rsp data: 00
//step15:获取字符串描述符0
req data: 80 06 00 03 00 00 ff 00
rsp data: 04 03 09 04
//step16:获取字符串描述符1
req data: 80 06 01 03 09 04 ff 00
rsp data: 10 03 42 00 55 00 53 00 4D 00 55 00 53 00 54 00
(busmust)
//step17:获取字符串描述符2
req data: 80 06 02 03 09 04 ff 00
rsp data: 36 03 42 00 55 00 53 00 4D 00 55 00 53 00 54 00 20 00 55 00 53 00 42 00
2D 00 43 00 41 00 4E 00 28 00 46 00 44 00 29 00 20 00 46 00 61 00 6D 00
69 00 6C 00 79 00
(bumust CANFD Family)
//step18:预获取配置描述符0
req data: 80 06 00 02 00 00 09 00
rsp data: 09 02 27 00 01 01 04 C0 32
//step19:获取配置描述符0
req data: 80 06 00 02 00 00 27 00
rsp data: 09 02 27 00 01 01 04 C0 32 09 04 00 00 03 FF 00 00 00 07 05 01 02 00 02
00 07 05 81 02 00 02 00 07 05 82 03 08 00 10
四、常见问题解决
4.1 bcd版本号的要求
USB设备描述符的bcd版本号必须设置为0x0200,大于0x0200会被当做WINUSB2.0,小于0x0200,无法被WINDOWS当做WINUSB设备。
4.2 正确适配后,还是无法正常被识别为WINUSB设备
winusb1.0首先通过判断USB bcd版本号是否为0x0200来决定是否查询0xEE处字符串描述符。
读取到符合WINUSB1.0标准的0xEE处字符串描述符后,再读取厂商自定义描述0x04、0x05!
由于读取0xEE处字符串描述的方式,并不属于USB规范的范畴,所以市面上部分设备在收到0xEE处字符串描述符的读取指令时,会发生枚举失败或设备卡死的情况!
为了解决上述这个问题,微软在设备第一次接入时会查询0xEE处的描述符,并将这一次的查询结果写入注册表。后续同样PIV VID的设备再接入时,windows不再查询0xEE处的描述符,而是根据注册表的记录信息来决定是否查询厂商自定义描述符!
所以,如果WINUSB设备初次枚举失败时,后续如果仍然想让设备查询0xEE处的描述符,必须将如下路径下的注册表信息OSVC删除:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\usbflags\0810F12A0504
注意,上述路径中的0810F12A0504对应VID PID 为0810 F12A的设备,不同USB设备要根据自己的USB VID PID来删除对应的OSVC注册表信息!
五、调试工具
有条件的同学可以淘一个USB分析仪,可以用来抓取PC和STM32之间的USB通讯数据。包括枚举阶段、正常通讯阶段的数据等。有个仪器通常会事半功倍。笔者推荐一款自用的型号,支持USB Packet View软件,价格也比市面上带软件支持的一些款式亲民很多!
https://item.taobao.com/item.htm?abbucket=16&id=840316491660
六、参考链接
6.1 github上的开源适配例程
https://github.com/MichaelTien8901/STM32WINUSB
作者:Dreamer_young