3

.net アプリケーションから通信できるようにする必要がある USB デバイスがあります。デバイスは標準の HID デバイスではなく、初期化するために、別のタイプのマシンで初期化するときに使用されるパケットについて、USB プロトコル アナライザー/スニファーからパケットのトレースを取得しました。デバイスを初期化するには、.net アプリケーションからこのパケット シーケンスを複製する必要があります。

特定の制御転送パケット/クラス タイプの要求に到達するまで、すべてが正常に機能しています。

与えられたトレースには、発行する必要があると記載されています。

Control Transfer Class Type Request 
21 0A 00 00 00 00 00 00 
Result stall (intentional)

Control Transfer Class Tyoe Request
A1 01 01 03 00 00 40 00 
Result will initiate a 64 byte transfer of data from the device to the host.

これは私がこれを行うために使用しているコードです:

                // Transcation 6
                UsbSetupPacket setup = new UsbSetupPacket(0x21, 0x0A, 0, 0, 0);
                bool result = MyUsbDevice.ControlTransfer(ref setup, buffer, 0, out transferred);
                Console.WriteLine("Result = {0}", result);

                // Transcation 7
                setup = new UsbSetupPacket(0xA1, 0x01, 0x0301, 0x0000, 0x0040);
                result = MyUsbDevice.ControlTransfer(ref setup, buffer, 64, out transferred);

                Console.WriteLine("Result = {0}, {1}", result, transferred);

これは、このデバイスの USB データ トラフィックをスニッフィングしている BusHound から受信したトレースです。

Device  Phase  Data                      Description       Cmd.Phase.Ofs(rep)
------  -----  ------------------------  ----------------  ------------------
  46.0  CTL    21 0a 00 00  00 00 00 00  SET IDLE                20.1.0        
  46.0  USTS   c0000004                  stall pid               20.2.0        
  46.0  CTL    a1 01 01 03  00 00 00 00  GET REPORT              21.1.0        
  46.1  USTS   c0000004                  stall pid               22.1.0        

ご覧のとおり、セットアップ パケットの 0x0040 値パラメータは、設定しているにも関わらずうまくいきません。私は USB と .net / LibUsbDotNet に比較的慣れていないので、何が間違っているのかよくわかりません。誰かが私に何か提案できるのだろうか?

注、私は Visual Studio 2008 を使用して Windows 7 64 ビット マシンで開発しています。

ありがとう、リッチ

4

1 に答える 1

4

OK、多くの調査の結果、問題の原因を突き止めました。これは、LibUSBDotNet がどのように機能するかを理解していなかったことが原因でした。これは、他の点では優れたライブラリの貧弱なドキュメントによって助けられません。

問題は、セットアップ パケットで 0x0040 を手動で指定してはならないことです。この値は無関係のようです。代わりに、単純に ControlTransfer メソッドで転送するバイトを指定し、バッファが事前に割り当てられた適切な大きさのバイト配列であることを確認します。

byte[] buffer = new byte[256];
setup = new UsbSetupPacket(0xA1, 0x01, 0x0301, 0x0000, 0x0000); 
result = MyUsbDevice.ControlTransfer(ref setup, buffer, 0x0040, out transferred); 

これにより、USB デバイスに送信される正しいコントロール転送パケットが生成されます。

Control Transfer Class Tyoe Request   
A1 01 01 03 00 00 40 00   

LibUsbDotNet はさまざまなパラメーターに対して何らかの検証を行っているようで、バッファー配列が十分に大きくない場合は、適切な例外をスローするのではなく、代わりに何か (私の場合は 0x0000) を送信するだけです。

于 2012-01-16T13:25:26.153 に答える