调用 usb_control_msg 返回错误值 -32, Broken pipe, 对 hidraw write时 返回错误值 -32, Broken pipe

在使用libusb进行hid设备控制传输时遇到错误-32, Broken pipe,分析发现并非实际通讯异常,而是内核错误反馈。经测试和跟踪,确定是因为设备回复的数据包PID未交替,导致主机认为无正确响应,改正PID交替后问题解决。寻求类似问题的解决方案,欢迎讨论。" 133291389,19673781,Canvas坐标轴变换:平移、旋转与缩放,"['前端开发', 'HTML5', '绘图库', '图形编程']
摘要由CSDN通过智能技术生成

-------------------Step 1---------------------

如题,使用 libusb 对 hid 类设备进行控制传输的时候,有时会遇到此错误,但是实际上传输是成功的,用usb分析仪等工具和程序中验证,比如发送数据成功后,让设备返回给主机,主机读取数据后验证数据正确性。由此看来,该错误是内核返回出现了错误,并不是指实际的通讯异常。

现在在使用其他HID类设备在进行测试,发现有些HID类设备不会出现类似的报错,因此写程序模拟该设备通讯过程,尝试与主机通讯,依然返回错误值 -32, Broken pipe。该原因还在跟踪,待续~

-------------------Step 2---------------------

在 Linux 内核中,HID 设备的驱动由三个部分组成:hid-core、hid-input 和 hidraw。这三个部分的源代码分别位于 drivers/hid/hid-core.c、drivers/hid/hid-input.c 和 drivers/hid/hidraw.c 中。 下面介绍一下在这三个文件中函数的调用顺序: 1. hid-core.c:hid_probe():当一个 HID 设备被插入,驱动程序首先调用 hid_probe() 函数。该函数会检查设备是否是 HID 设备,并为该设备分配一个 hid_device 结构体。 2. hid-core.c:hid_add_device():在成功分配 hid_device 结构体之后,驱动程序会调用 hid_add_device() 函数,将该设备添加到系统中。 3. hid-core.c:hid_input_start():当 HID 输入子系统准备好接收数据hid_input_start() 函数会被调用。该函数会启动 HID 设备的输入报告。 4. hid-input.c:hidinput_open():当用户空间的应用程序打开 HID 设备文件hidinput_open() 函数会被调用。 5. hidraw.c:hidraw_open():当用户空间的应用程序打开 hidraw 设备文件hidraw_open() 函数会被调用。 6. hid-input.c:hidinput_write():当用户空间的应用程序向 HID 设备文件写入数据hidinput_write() 函数会被调用。 7. hidraw.c:hidraw_write():当用户空间的应用程序向 hidraw 设备文件写入数据hidraw_write() 函数会被调用。 8. hid-core.c:hid_remove():当 HID 设备被移除,驱动程序会调用 hid_remove() 函数,将该设备从系统中移除。 总体来说,hid-core.c 负责管理 HID 设备,hid-input.c 负责处理 HID 设备的输入报告,hidraw.c 负责提供 HID 设备的原始数据访问。这三个部分共同协作,实现了 Linux 内核对 HID 设备的支持。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值