树莓派读取自定义USB HID设备时出现重复报告的排查求助
树莓派读取自定义USB HID设备时出现重复报告的问题
设备与环境概述
- 树莓派运行Raspberry Pi OS(内核版本5.15.32),同时在自定义Linux(内核5.15.61)和Ubuntu 20.04 LTS桌面系统中测试,结果一致
- 目标自定义USB HID设备支持两种工作模式:
- 标准HID模式:发送标准HID报告
- 自定义模式:发送约1KB的自定义报告,需发送特定功能报告启用
- Windows系统下,使用python hidapi发送功能报告启用自定义模式后,可通过
hid.device.read()以全速(约4250报告/秒)读取所有自定义报告,且报告含report_number字段可确保无遗漏
问题现象
树莓派上使用相同Python代码(采用libusb后端的python hidapi包,hidraw后端速度过慢)时出现异常:
- 初始阶段报告顺序正常(启动时丢失部分报告属预期情况)
- 数秒后开始出现连续块的重复报告,以
report_number为例,序列如下:
即每次获取约578条连续报告,但起始点为之前已接收过的历史报告(示例中回溯了340条)1,2,...,578, 238,239,...,816, 476,477,...,1054, and so on - 尝试过libusb Python绑定、C语言hidapi库,均出现相同的
report_number重复模式
排查过程
- 使用wireshark/tshark、usbmon监听USB通信:
- 打开设备并发送功能报告启用自定义模式
- 记录USB通信发现:使用cython-hidapi打开设备后,设备驱动从usbhid切换为usbfs,无需显式读取设备就会出现重复报告
- 启用usbmon进一步调试时,日志消息导致系统速度变慢、报告丢失,但不再出现回溯重复情况
- 当前使用的驱动信息:
pi@raspberrypi:~ $ lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M |__ Port 1: Dev 5, If 0, Class=Hub, Driver=hub/2p, 480M |__ Port 1: Dev 6, If 0, Class=Human Interface Device, Driver=usbhid, 480M pi@raspberrypi:~ $ lspci -k 00:00.0 PCI bridge: Broadcom Inc. and subsidiaries BCM2711 PCIe Bridge (rev 20) Kernel driver in use: pcieport 01:00.0 USB controller: VIA Technologies, Inc. VL805 USB 3.0 Host Controller (rev 01) Subsystem: VIA Technologies, Inc. VL805 USB 3.0 Host Controller Kernel driver in use: xhci_hcd - 怀疑问题源于设备驱动,模式类似环形缓冲区中入队和出队指针的“竞争”
请求帮助
恳请提供排查建议、调试方向或同类问题参考
内容的提问来源于stack exchange,提问作者Scholith
相关产品推荐
相关产品推荐

