无法在 Mac 上发送超过 64 字节的 HID 功能报告

Can't send HID feature reports of more than 64 bytes on Mac

我有一个暴露 MaxFeatureReportSize = 263 的设备。与设备通信的协议要求我发送长度正好为 263 字节的功能报告。这在 Windows 上工作正常,但我 运行 在 Mac - IOHIDDeviceSetReport 上 OS X 10.11 和 10.12 returns 我无法从 IOKit headers 中推断出的神秘错误 0xe0005000,相应的 driver (IOUSBHostHIDDevice) 的代码是闭源的。

进一步调查表明

  1. 发送小于或等于64字节的请求时不会出现该错误。不幸的是,这并没有真正帮助,因为协议是一成不变的,我无法更改它 - 我必须发送 263 个字节。
  2. 在使用旧 IOUSBHIDDriver 而不是 0xe0005000 的 OS X 10.10 上,我收到 0xe000404f 错误。这是 kIOUSBPipeStalled,但每次尝试发送超过 64 个字节时我仍然得到它。

这是我得到的。我现在正在考虑下载 OS X 10.8 并调试 IOUSBFamily,看看为什么它不能处理超过 64 字节的报告。令人遗憾的是,Apple 选择从 OS X 10.9 及更高版本中删除 IOUSBFamily 源。

IOKit/usb/IOUSBHostFamily.h(应该在Xcode.app内)定义错误0xe0005000kUSBHostReturnPipeStalled

  • 你有硬件协议分析器来查看线路上发生了什么吗?
  • Apple 曾经有 "log releases" 的 IOUSBFamily(downloadable here) 允许进一步调试。最后一个版本是 10.9.4,获取 10.9 并安装它可能会有所帮助。
  • lists.apple.com 站点已关闭几天,但 USB 列表中的某个人可能可以提供帮助。您现在可以通过在主题或正文中将 "help" 发送电子邮件至 Usb-request@lists.apple.com
  • 来加入列表
  • 我正在搜索并发现这个线程可能有用(尽管它在 HID 管理器级别以下运行):Stall reported by ReadPipe, but no stall in USB Protocol Capture

硬件协议分析器终于发现了 Mac 数据包的问题。所有 Mac 数据包都是 263 字节长(正是我将它们设置的长度),而一些 Windows 数据包被截断为 64 字节(由系统!)。一旦我添加了一个 hack 来截断 Mac 上的这些数据包,它就完美地工作了。

我不知道为什么 Windows 决定截断它们 - 可能是因为特定的报告 ID(描述符中的东西?),或者可能是因为实际的数据包长度从未超过 20 字节和其他一切正在填充。但这种奇怪的行为实际上是设备所期待的。