Инструкция ControlTransfer не отправляет параметр значения из установщика-упаковщика в LibUsbDotNet - PullRequest
2 голосов
/ 14 января 2012

У меня есть USB-устройство, с которым мне нужно общаться из приложения .net.Устройство не является стандартным устройством HID, и для его инициализации я получил трассировку пакетов от анализатора / анализатора протоколов USB для пакетов, используемых при инициализации его на компьютере другого типа.Мне нужно реплицировать эту последовательность пакетов из моего приложения .net для инициализации устройства.

Все работает хорошо, пока я не получаю конкретный запрос на передачу пакета управления / тип класса.

Трассировка IМне выданы состояния, которые я должен выдать:

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);

И это трассировка, которую я получаю от BusHoundкоторый анализирует трафик данных USB для этого устройства:

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, и я не совсем уверен, что я делаю не так.Интересно, кто-нибудь может мне что-нибудь предложить попробовать?

Заметьте, я занимаюсь разработкой на 64-битной машине Windows 7 с использованием Visual Studio 2008.

Спасибо, Рич

1 Ответ

3 голосов
/ 16 января 2012

Хорошо, после долгих исследований я нашел источник проблемы, и это было мое отсутствие понимания того, как работает 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) вместо того, чтобы выдавать соответствующийисключение.

...