2011-06-25 59 views
4

カスタム製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このように私は問題がライブラリに関連していると思っています。または、私がそれをどのように使用していて、ではなく、デバイスに関連するです。

+0

@ david:デバイスが私のオフィスにあるため、今はディスクリプタを投稿できません。とにかく、記述子には2つのエンドポイント、つまり2つのインタフェースのそれぞれに1つのエンドポイントがあります。どちらのインターフェイスも、デバイスのボタンの状態を含む少なくとも1つの出力レポートを提供します。少なくともこれらのレポートでは、「使用ボタン」が定義されています。 – Arne

+0

あなたはhidapiを使ってみましたか? –

+0

私は500msのタイムアウトを設定していても、 'libusb_interrupt_transfer'が永遠にブロックしていると私は思っていました。 しかし、私の単純な運転手が電話を切った後、私はその行をコメントアウトした。だから私はここにいくつかのデバッグプリントを挿入し、どのデバイスに発行したとしても、 'libusb_open'は永遠にロックされることが分かりました。 デジタルペンタブレットから 'int x、y、pressure、button_state; 'を得るのは本当に難しいでしょうか?真剣に、それは過剰です:) – Frank

答えて

1

投稿したコードに問題があります。 bytesを定義するために記述した構文は8バイト配列にはなりませんが、libusbにそのアドレスに8バイトを書き込むように要求しているため、エラーまたはメモリ破損が発生する可能性があります。

unsigned char buffer[8]; 
int len = 0; 
int ret = libusb_interrupt_transfer(handle, 0x81, buffer, sizeof(buffer), &len, 0); 

各HIDレポートには独自のエンドポイントがあるため、正しいエンドポイントを指定して受信するレポートを指定します。エンドポイント1 IN(0x81)を指定しました。エンドポイントがデバイスのディスクリプタに定義されていますか?たぶんあなたは(Ubuntuでlsusb -vの)記述子を取得し、ここに投稿して確認することができます。

+0

括弧が足りないのは誤字です。実際のコードは 'unsigned char buffer [8]'と読みます。とにかく、ヒントありがとう。 – Arne

関連する問題