2017-02-14 121 views
1

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

进一步调查显示

  1. 发送的64个字节或更少的请求时,误差不会出现。不幸的是,这并没有真正的帮助,因为协议被设置为石头,我不能改变它 - 我必须发送263字节。
  2. 在使用旧的IOUSBHIDDriver而不是0xe0005000的OS X 10.10上,得到了0xe000404f错误。这是kIOUSBPipeStalled,但我每次尝试发送超过64个字节时都会收到。

这就是我得到的。我正在考虑下载OS X 10.8并调试IOUSBFamily,以了解为什么它无法处理超过64个字节的报告。苹果选择从OS X 10.9及以上版本中删除IOUSBFamily消息来源是一种遗憾。

回答

0

硬件协议分析器终于发现了Mac数据包有什么问题。所有的Mac数据包都是263字节长(正是我设置的),而一些Windows数据包被截断为64字节(由系统!)。只要我在Mac上添加黑客截断这些数据包,它就完美无瑕。

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

1

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

  • 您是否有硬件协议分析器来查看电线上发生了什么?
  • 苹果曾经有过“登陆发布”,允许进一步调试IOUSBFamily的(downloadable here)。最后一个版本是为10.9.4,它可能有助于获得10.9并安装它。
  • lists.apple.com网站被降了几天后,但USB列表上的某个人可能会有所帮助,您现在可以通过在主题或正文中发送“帮助”来加入列表[email protected]
  • 我正在查找并发现此线程可能是有用(尽管它在HID管理器级别以下操作):Stall reported by ReadPipe, but no stall in USB Protocol Capture
+0

感谢您的回答,事实证明,协议分析仪是最好的选择。我用自己的发现发布了自己的答案。另外,IOUSBFamily 10.9.4发行版不完整,缺少一些代码,我想这就是为什么它没有在OS X 10.9.4下列出。 – prazuber