HIDデバイスの制御について

Macに接続したHID準拠のデバイスをプログラムより制御しようとしています。

【開発環境】

MacOSX 10.6.8

Xcode4.2


Mac上でHID準拠のデバイスを制御するには「何も処理を行わないkext」を作成し、ロードした上でUSB機器を接続しないと

プログラムからの処理ができないということがわかりました。(この結論までの経緯は長いので最後に示します。)


「何も処理を行わないkext」はAppleが提供しているサンプルプログラムの「VendorSpecificDriver」のidVendorとidProduct

を制御したいデバイスのものに変更して作成しています。

しかし、「何も処理を行わないkext」をロードした状態ではUSBデバイスを接続しても、接続が切れたり再度繋がったりを繰り返す

状態(USBを不定期に抜き差ししているような状態)となってしまいます。


そもそも「VendorSpecificDriver」は古いバージョンのXcodeから持ってきたものであり、ビルド時にも"ld: warning: using ld_classic"

という警告が出てしまっている状態です。


①Mac上でHID準拠のデバイスを制御するには「何も処理を行わないkext」が必要であるという結論は正しいのか

(他の方法でもHIDデバイスの制御は可能であるのか)

②「VendorSpecificDriver」のビルド時に出る警告"ld: warning: using ld_classic"はどういった状態を示す警告なのか


の2点をご教示いただけないでしょうか?




少し長いですが、これまでの経緯を以下に示します。

-------------------------------------------------------------------------------------------

Appleが提供しているサンプルプログラムの「USBSimpleExsample」のidVendorとidProductを制御したいデバイス

のものに変更しビルドしてみましたがdealWithInterface関数の下記の部分でエラーが出力されうまく実行できませんでした。

【エラーが出力される処理】

err = (*intf)->USBInterfaceOpen(intf);

if (err)

{

printf("dealWithInterface: unable to open interface. ret = %08x\n", err);

return;

}

【エラーメッセージ】

dealWithInterface: unable to open interface. ret = e00002c5


上記のエラーコード"e00002c5"は下記URLを参考にしてみると、"該当のデバイスが既に排他制御でオープンされている"

というエラーであることがわかりました。

どうやらHIDデバイスはMac接続時にIOUSBHIDDriverというドライバが反応し排他制御で開いてしまうようで、それを回避

するためには、IOUSBHIDDriverより優先度が高く何も処理を行わないkextを作成し、IOUSBHIDDriverより先にHIDデバイス

の制御を奪ってしまうという方法が有効であるということがわかりました。

【参考にしたURL】

http://osdir.com/ml/usb/2009-08/msg00040.html

http://lists.apple.com/archives/usb/2009/Aug/msg00055.html

http://lists.apple.com/archives/usb/2002/Jul/msg00027.html


何も処理を行わないkextはサンプルプログラム「VendorSpecificDriver」のidVendorとidProductを制御したいデバイス

のものに変更して作成しています。

【参考にしたURL】

http://homepage.mac.com/inada/pdf/Info.plistDocs.pdf

-------------------------------------------------------------------------------------------

iMac, Mac OS X (10.6.8)

投稿日 2012/06/14 04:07

返信
返信: 1

2012/07/02 03:29 kyohei09 への返信

VendorSpecificDriverのソースコードについて

以下URLのMacOSXのIOUSBFamily-xxx.x.x内の"Examples/VendorSpecific Driver"に最新があります。

http://www.opensource.apple.com/


kextを使わない別の方法について

IOHIDDeviceSetReportとかIOHIDDeviceGetReportを使ってみてはどうでしょうか。

【参考URL】

"Accessing a HID Device":https://developer.apple.com/library/mac/#documentation/DeviceDrivers/Conceptual/HID/new_api_10_5/tn2187.html#//apple_ref/doc/uid/TP40000970-CH214-SW2


参考にしてください。

このスレッドはシステム、またはAppleコミュニティチームによってロックされました。 問題解決の参考になる情報であれば、どの投稿にでも投票いただけます。またコミュニティで他の回答を検索することもできます。

HIDデバイスの制御について

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple Account を使ってご参加ください。