HID复合设备部分接口设备无数据响应问题
群里有位同学使用USB的多接口功能实现了一个复合设备,即使用了多个接口描述符,每个接口描述符下一组端点,用于数据传输,当然每组下也有一组HID描述符和其对应的HID报告描述符。
关于HID复合设备接口描述符与其接口描述符的对应关系可见:http://www.usbzh.com/article/detail-381.html
HID报告描述符的获取是通过0x22单独的USB标准请求GET_DESCRIPTOR获取的。当然这个长度应该和HID描述符中指定的长度一致。
当系统获取到报告描述符之后,会解析报告描述符,然后使用中断请求来获取对应的数据,所以固件返回的数据应按报告描述符的格式长度来进行返回。
问题1:
我有一个设备 定义了三个接口描述符,三个接口都是hid,一个键盘接口一个自定义hid 一个鼠标接口,在定义三个接口下面的hid报告描述符的时候,鼠标报告描述符里面定义了一个ReportID, 现在只有鼠标不能使用,请问一下其他的两个hid报告描述符也需要定义ReportID么?
首先每个接口都有一个报告描述符的
其次如果每个接口都只有一个报告描述符而且没有定义多个报告,那应该是不需要的
问题2:
现在是我的鼠标无法正常工作,其他两个接口设备都没有问题。这说明那俩设备没问题,是一个设备 三个接口, 两个接口工作没有问题
分析:
- 好好看看鼠标的配置,报告reportid也要占一个字节
看的报告描述符正确不,通过抓包看一下接口是否返回对应的报告描述符
告描述符 应该是正确的, 我是从一个正常的设备里面抓包出来的
描述符通过HIDReportParser分析一下,对应规则可以通地bushound抓包看一下,这些工具都在QQ群文件里有
- 那就看报告描述符长度和HID描述符中的长度是否一致,还有枚举是否一致
长度是计算的 这个是对的
枚举是否一致 是指什么
- 用busHound抓包
- 通过抓包分析
- BUSHOUND表现实际的通讯数据
- 码有时比如一个索引忽略了,有时看不出来的。通过抓包看比较好排查
- 如果理论还是有点问题,可以看一下圈圈的书,他有一章是专门介绍接口复合设备的
问题所在:
数据没有传输够,最大的传输数据 应该限制在了127个,我的报告符是150个字节
- 返回0长度至少说明固件没有给数据,通读是正常的
- 看下固件传输的问题
- 少可以先用测试数据试
- 什么设备是什么数据,即流程是对的
问题解决了
- 我上发数据的时候 有个位置限制了发送的总长度为127
- 导致 发送数据始终有问题
- 不能超过127个字节
- 限制了 控制传输过程中,最大字节数位127
- 消了限制 就没有问题了