1 问题现象
有客户使用stm32f405并参照st官方usb标准库下的hid+cdc的示例代码做产品,发现在win7上使用得好好的,可放到win10上,cdc第一次能够识别,再次拔插后就不能再识别,且此后无论插拔多少次都无法再识别,除非再次上电,又会重复上述现象,只有板子上电后第一次才能正确被识别,后续均不行。
2 问题分析
客户使用 st官方示例代码stm32_usb-host-device_lib_v2.2.0\project\usb_device_examples\composite_examples\cdc_hid_composite当我尝试使用此示例代码重现客户所遇到的问题时,发现此代码在win7运行ok,但与客户不同的是,我测试到的情况是在win10下cdc一次都无法识别,hid却一直可以识别。
下面来分析下问题,既然win7下hid和cdc都能正常识别,放在win10上才不正常,那么初步可以判断,此问题可能与win10操作系统的usb主机驱动实现有关。
通过usb分析仪分析客户代码在win10下usb枚举异常的数据通讯:
figure 1 第一次usb枚举过程
上图是客户代码第一次正常枚举的通讯数据,从图中可以看出,win10 usb主机在正常获取hid报告描述符后,紧接着会获取虚拟串口状态和设置波特率,这样就正常枚举结束了。我们再来看看采集到的异常usb枚举过程:
figure 2 异常枚举过程
上图是win10下异常枚举过程。从图中可以看出,win10系统上usb主机在获取到设备描述符和配置描述符后直接将设备挂起了。很明显,win10系统的usb主机驱动实现对设备描述符或者配置描述符的内容并不认可,才会导致无法识别hid+cdc复合设备。
我们不妨检查下客户代码中的设备描述符:
figure 3 获取的设备描述符
复合设备的class,subclass,protocol
必须为0xef,0x02,0x01,这里
vid=0x0483,pid=0x3256(cube库下为0x5740,但这个不重要),接下来看配置描述符:
figure 4 win10不能识别的配置描述符
由此可见,客户的描述符是hid interface + iad + cdc interfaces结构。对于win7,这种结构可以识别,但对于win10,这种结构win10未必能够兼容,我们尝试在hid interface外部加上一层iad结构,使其成为iad1 + hid interface + iad2 + cdc interfaces结构,此时客户的问题得以解决,在win10也可以正确识别了,修改后的描述符结构如下:
figure 5 win10能够正确识别的配置描述符
结束本篇实战经验之前,让我们再次回顾iad的概念:
iad(interface association descriptor),为usb设备定义了一个标准来表述捆绑在一个逻辑功能(比如这里的cdc虚拟串口)上的多个接口的聚合的方法。usb协会分配了一个设备级别的类编码(即图3中0xef),使用iad的设备必须使用它(如图3的设备描述符);这样可以很容易在设备枚举时就能识别出采用了iad的设备。iad描述符通常放在它所要捆绑的多个接口的接口描述符之前。
3 结论
在win10系统中,建议复合设备每个逻辑功能的接口描述符前都搭载一个iad描述符,不论这个逻辑功能是单个接口描述符完成(比如这里的hid功能)还是要由多个接口描述符完成(比如这里的cdc功能)。
电动牙刷到底怎么样,对于它各方面性能的探讨
2018年天翼展开启,5G元素在本届天翼展上无处不在
公安物证的管理运用RFID技术
荣耀9什么时候上市最新消息:华为“真旗舰”荣耀9曝光6月发布,和小米6傻傻分不清楚?
智能机器人离家庭并不遥远 安全问题是最大挑战
HID+CDC复合设备在WIN10的识别问题
连接器制造商ITT与世强达成战略合作关系
可调光荧光灯泡电路原理图讲解
2023年将迎来大规模动力电池的“退役潮”,回收成当务之急
PLC控制系统的7大特点
共创、共享、共赢云生态,华为云ECS助力企业轻松上云
关于RF技术你知道多少?
汇智聚力,共创非凡|天启科技2023春茗会圆满举办!
EDA技术设计的基本特点以及技术优势分析
万象奥科参展“瑞萨交流日”-济南站
三星S9系列获FCC认证 明年1月份发布Exynos9810
车规级贴片电解电容HG系列的优点是什么
中天鸿锂是动力电池回收利用领域“年度技术创新奖”的有力竞争者
工信部正式发布了2019年第一季度电信服务质量通告
这些机器人能说会移动,简直要颠覆你的想象