【问题标题】:usb hid: why should i write "null" to the control pipe in the out endpoint interruptusb hid:为什么我要在输出端点中断中将“null”写入控制管道
【发布时间】:2016-12-22 02:26:01
【问题描述】:

在挖掘 HID 报告时,我在 USB HID 设备中遇到了一个奇怪的问题。我正在实现一个 HID 类设备,并且我的程序基于 Keil 提供的 HID USB 程序。该项目中的一些代码已更改,并且在 32 字节输入和 32 字节输出报告中似乎工作正常。不知何故,经过数千次数据传输,Endpoint 1 out 会挂起并成为一个坏管道。然后我在google上搜索了一些技巧,一个主题提醒我,我们应该在发送一个与您在报告描述中定义的数据包长度匹配的数据包后编写一个数据长度为零的数据包。但这对我不起作用。然后我在收到一个输出数据包后将数据长度为零写入控制管道,神奇的是,它起作用了!千万次传输永远不会挂!

这是我的问题:为什么在将数据长度为零写入控制管道后它会起作用。输出管道中传输的数据应该与控制管道中的数据没有关系。这让我很困惑!

【问题讨论】:

标签: usb report hid


【解决方案1】:

如果您传输任何小于预期负载大小的数据,您必须发送一个零长度数据包以指示数据已传输。

但这在很大程度上取决于主机控制器上的实现,并非所有设备都遵循规范并且可能会停止。

来源:
When do USB Hosts require a zero-length IN packet at the end of a Control Read Transfer?

【讨论】:

  • 感谢您的回复。你提供的信息真的给了我很多帮助。我发现在发送 USB 数据包后需要发送 ZLP 的原因是每个 USB OUT 事务在成功发送 USB 数据包后都需要来自设备的 ACK。无论设备发送多少有效负载。
  • 纠正评论:发送后不是,是接收后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-04
  • 2019-02-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2018-10-11
  • 1970-01-01
相关资源
最近更新 更多