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

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 WINUSB1.0详细适配教程

发表回复