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)