RT1052-usb-HID某些电脑丢包问题

思汝 2023-02-02 09:57:03 编辑

我遇到一个RT1052-USB-HID方面的问题,想寻求各位大佬的指导。
在某些电脑上,我的设备在使用USB-HID和PC客户端软件通信期间会随机丢失一部分报告。目前总结规律如下:
①大部分电脑功能正常,少部分电脑会出现这个问题,目前面没找到规律,可以复现;
②有客户出现问题后,重装系统后,功能正常了;
③使用Bus Hound抓包,确实丢包了
想寻求一下指导和建议:
①代码在最新官方SDK基础上修改而来,麻烦看看我们HID描述符的配置是否存在问题;
②我应该怎么去定位,和解决这个问题;
附件:和官方SDK代码描述符的差异,主要是发送和接收的报告长度修改为1024字节(图1);并修改相关配置(图2)
图片左边是修改后的代码,右边是官方SDK代码

USB中文网 2023-02-02 10:09:59 编辑

首先得确实你的是高速模式,因为只有高速模式下HID的中断端点才支持1024

中断传输的特点

高速设备和低速设备均可使用中断传输。

  • 全速模式最大包长上限为64个字节;
  • 低速模式最大最大包长上限为8个字节。
  • 高速模式的最大包长上限为1024个字节;中断传输端点要指定其可以在超高速总线上接受或传输的最大数据包负载大小。对于支持突发大小大于 1 的中断端点,唯一允许的最大的数据包负载大小为 1024 字节;对于突发大小等于 1 的中断端点,最大的数据包负载大小可以在 1 到 1024 之间任意大小。中断端点的最大突发大小是 3。

第二:HID丢数这在WINDOWS很正常,因为只要设备端发数据,主机都会收到,无论应用层是不是都打开这个HID端点读数据。这是因为当设备已经工作时,驱动自动会读取HID中断端点发的数据,这个数据会缓存起来,默认的缓存大小个数为2,你可以通过HidD_GetNumInputBuffers来获取当前的值,也可以通过HidD_SetNumInputBuffers来设置这个队列的大小,最大为512包。

第三:bushound抓到的都是已经正常传输的数据包,所以如果BUSHOUND都丢了,应该是总线上确实丢了。由于中断传输是可靠传输,所以会重传的。所以这种丢失应反应在你的固件上。就是你认为你自己发出去了,其实没有发出发去(需要收到主机发送的ACK).所以你得从固件方面来再查一下。