カスタム製HID USBデバイス用のドライバをリバースエンジニアリングする必要があります(コントロールパネル上のいくつかのボタンとLED)。ドライバはWindowsでのみ利用可能で、* nixの実装が必要です。libusb割り込み転送
デバイスは明らかに特定のクラスではありませんが、HIDデバイスです。これは、それぞれ1つの割り込みエンドポイントを持つ2つのインタフェースを提供します。
現在、私のセットアップでは、Wireshark経由でUSBトラフィックをキャプチャするためにUbuntuホスト上でWindowsを実行するVirtualBoxが必要です。プロトコルはかなりシンプルで、私はすでにかなり良い理解を得ています。
私は、プロトタイプ作成のための簡単なC++コンソールプログラムでlibusb-1.0を使用しています。私はすでにSET_REPORTコントロール転送を発行してLEDをトグルすることができましたが、転送中に割り込みを介してボタンを押すのを苦労しました。実際に
次のコールブロック永遠:
unsigned char bytes[8] = { 0 };
int len = 0;
int ret = libusb_interrupt_transfer(handle, 0x81, bytes, 8, &len, 0);
、それは正確にWindowsセッションで撮影された同等のように見えるのWiresharkでの結果のURBを検査します。それでも私はデバイスからの返信を得ることはありません。
私はいくつかの設定が不足しています。デバイスが正しく開かれ、デバイスによって提供される両方のインターフェイスが正常に主張されていることに注意してください。私のLinuxアプリケーションでさえ、制御転送による入力レポートは谷間に入っています。
ポインタありがとうございます! Arne
補遺I: libusb_interrupt_transfer()
を使用するときに受け取るレポートIDをどのように指定する必要があるのでしょうか?
補遺II: Windowsドライバの要求とWiresharkの上記のコードで生成された要求を比較すると、違いはありません(URBと同じ値)。しかし、Windowsドライバによって発行されたときにのみ、割り込み転送が返されます。
WiresharkでWindowsドライバの通信を調べると、さまざまなGET_DESCRIPTOR(...)
以外の制御転送は表示されません。最も重要な:no SET_INTERFACE
またはSET_CONFIGURATION
このように私は問題がライブラリに関連していると思っています。または、私がそれをどのように使用していて、ではなく、デバイスに関連するです。
@ david:デバイスが私のオフィスにあるため、今はディスクリプタを投稿できません。とにかく、記述子には2つのエンドポイント、つまり2つのインタフェースのそれぞれに1つのエンドポイントがあります。どちらのインターフェイスも、デバイスのボタンの状態を含む少なくとも1つの出力レポートを提供します。少なくともこれらのレポートでは、「使用ボタン」が定義されています。 – Arne
あなたはhidapiを使ってみましたか? –
私は500msのタイムアウトを設定していても、 'libusb_interrupt_transfer'が永遠にブロックしていると私は思っていました。 しかし、私の単純な運転手が電話を切った後、私はその行をコメントアウトした。だから私はここにいくつかのデバッグプリントを挿入し、どのデバイスに発行したとしても、 'libusb_open'は永遠にロックされることが分かりました。 デジタルペンタブレットから 'int x、y、pressure、button_state; 'を得るのは本当に難しいでしょうか?真剣に、それは過剰です:) – Frank