4

カスタムメイドのHID USBデバイス(コントロールパネルのいくつかのボタンとLED)のドライバーをリバースエンジニアリングする必要があります。ドライバーは Windows でのみ利用可能で、*nix の実装が必要です。

デバイスは明らかに HID デバイスですが、特定のクラスではありません。これは、それぞれに 1 つの割り込みエンドポイントを持つ 2 つのインターフェイスを提供します。

私のセットアップには現在、Ubuntu ホストで Windows を実行している VirtualBox が含まれており、Wireshark 経由で USB トラフィックをキャプチャします。プロトコルはかなり単純で、私はすでにかなりよく理解しています。

プロトタイピング用の単純な 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); 

結果の URB を Wireshark で調べると、Windows セッションでキャプチャされたものとまったく同じように見えます。それでも、デバイスから応答がありません。

いくつかの設定がありません。デバイスが適切に開かれており、デバイスが提供する両方のインターフェイスが正常に要求されていることに注意してください。私の Linux アプリケーションでも、制御転送による入力レポートが通過します。

ポインタをありがとう!アルネ

補遺 I: を使用するときに、受け取りたいレポート ID をどのように指定すればよいの libusb_interrupt_transfer()でしょうか?

補遺 II: Windows ドライバーによって行われた要求を、Wireshark の上記のコードによって生成された要求と比較すると、違いは見られません (URB の値は同じです)。ただし、Windows ドライバーによって発行された場合にのみ、割り込み転送が返されます。

Wireshark で Windows ドライバーの通信を調べると、さまざまな .xml 以外の制御転送が見られませんGET_DESCRIPTOR(...)。最も重要: いいえSET_INTERFACEまたはしたがって、問題はライブラリまたはその使用方法に関連しており、デバイスには関連していないSET_CONFIGURATIONと思われます。

4

2 に答える 2

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レポートには独自のエンドポイントがあるため、正しいエンドポイントを指定して、受信するレポートを指定します。エンドポイント1IN(0x81)を指定しました。エンドポイントがデバイスの記述子で定義されていることを確認しますか?たぶん、記述子を取得して(lsusb -vUbuntuで)、ここに投稿して確認できるようにする必要があります。

于 2011-06-25T06:20:13.607 に答える