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

时间:2017-02-14 13:01:23

标签: c++ macos usb hid

我有一个暴露MaxFeatureReportSize = 263的设备。与设备通信的协议要求我发送长度恰好为263字节的功能报告。这在Windows上工作正常,但我在Mac上遇到了一个奇怪的问题 - OS X 10.11上的IOHIDDeviceSetReport和10.12返回了我无法从IOKit头中推断出的神秘错误0xe0005000,以及相应驱动程序的代码(IOUSBHostHIDDevice)是closedsource。

进一步调查表明

  1. 发送64字节或更少的请求时不会出现错误。不幸的是,这并没有真正帮助,因为协议是一成不变的,我不能改变它 - 我必须发送263个字节。
  2. 在使用旧版IOUSBHIDDriver代替0xe0005000的OS X 10.10上,出现0xe000404f错误。这是kIOUSBPipeStalled,但每当我尝试发送超过64个字节时,我仍然会得到它。
  3. 这是我得到的。我现在正在考虑下载OS X 10.8并调试IOUSBFamily,看看为什么它不能处理超过64字节的报告。令人遗憾的是,Apple选择从OS X 10.9及更高版本中删除IOUSBFamily资源。

2 个答案:

答案 0 :(得分:1)

IOKit/usb/IOUSBHostFamily.h(应该在Xcode.app中)将错误0xe0005000定义为kUSBHostReturnPipeStalled

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

答案 1 :(得分:0)

硬件协议分析器终于发现了Mac数据包的错误。所有Mac数据包都是263个字节长(正是我设置的那些),而一些Windows数据包被截断为64字节(由系统!)。一旦我在Mac上添加了一个hack来截断这些数据包,它就能完美运行。

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