2012-01-14 3 views
2

.netアプリケーションから通信できる必要があるUSBデバイスがあります。このデバイスは標準のHIDデバイスではありません。それを初期化するために、別のタイプのマシンでそれを初期化するときに使用されるパケットのために、USBプロトコルアナライザー/スニファーからパケットのトレースを与えられました。デバイスを初期化するために私の.netアプリケーションからこのパケットシーケンスを複製する必要があります。ControlTransfer命令がLibUsbDotNetのセットアップパケットの値のパラメータを送信しない

私は特定のコントロール転送パケット/クラスタイプ要求に達するまで、すべてうまくいきます。

私は私が発行する必要がある状態を与えてきたトレース:

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が値のparamを見ることができるように私が設定しているにもかかわらず、セットアップパケット内のeterがそれを作り出していません。私はUSBと.net/LibUsbDotNetには比較的新しいので、私が間違っていることはよく分かりません。誰かが私に試して何かを提案できるのだろうか?

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

おかげで、 リッチ

答えて

3

OKは、多くの研究の後、私は、問題の原因を発見し、それは本当に私でしたLibUSBDotNetがどのように動作するかの理解が不足しており、それ以外の優れたライブラリに関する貧弱なドキュメントによって助けられていません。

問題は、セットアップパケットに0x0040を手動で指定しないでください。この値は無関係です。代わりに、単にControlTransfer方法で転送しても、そのバッファを確保するバイトを指定する事前に割り当てられた適切な大きさのバイト配列などである:これは、USBデバイス

に送信正しい制御転送パケットを生成する

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

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

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

関連する問題