2017-02-14 118 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