USB получение данных с устройства - PullRequest
4 голосов
/ 29 февраля 2012

Я пытаюсь прочитать данные с устройства HID .У меня есть захват USB-сниффера, который в основном делает:

Get Device Descriptor
Get Device Descriptor
Set Address
Get Configuration Descriptor
Get Configuration Descriptor
Set Configuration
Set Idle
Get Input Report
Get Input Report
Get Input Report
Get Input Report
Set Feature Report
Get Input Report
Set Feature Report
Get Input Report
Get Input Report
Set Output Report
Get Input Report
Set Feature Report
Input Report
Input Report

Похоже, что все до установки Input Report и что Input Report - это обычный сбор данных с устройства.

В libusb я делаю следующее:

usb_init();
usb_find_busses();
usb_find_devices();

loop through busses
    loop through devices
        if correct vendor and correct product
            handle = usb_open(device)
            break

usb_set_configuration(dev_handle, 1)

// Endpoint 0 is a 'write endpoint', endpoint 1 is a 'read endpoint'.
endpoint = &device->config[0].interface[0].altsetting[0].endpoint[1]
usb_claim_interface(dev_handle, 0)
usb_set_altinterface(dev_handle, 0)

usb_bulk_read(dev_handle, endpoint->bEndpointAddress, buffer, endpoint->wMaxPacketSize, 1);

Я предполагаю, что драйвер и код до usb_set_configuration соответствуют анализу анализатора до Set Configuration.

Все в коде успешно до тех пор, пока не произойдет сбой usb_bulk_read.

  1. Как мне Set Idle, Get Input Report, Set Feature Report, Set Output Report?
  2. Почему usb_bulk_read выходит из строя?
  3. Что еще мне нужно сделать, чтобы установить связь с моим устройством?

Ответы [ 2 ]

3 голосов
/ 03 марта 2012

Я новичок в libusb и USB в целом, поэтому я не уверен, что это правильно, но после просмотра вывода USB-сниффера, такого как USBlyzer и подправляя несколько вещей, я придумываю следующие пункты протокола:

usb_claim_interface

Когда я запросил интерфейс (usb_claim_interface) и затем отменил свое приложение, я был в неработоспособном состоянии при последующих запусках. Я пробовал различные сбросы (usb_reset и usb_resetep), но я все еще не мог получить правильное использование из usb_control_msg.

SetReport / GetReport

USBlyzer показал, что соответствующие пакеты, где Get Descriptor, Select Configuration, Set Report и Get Report. Get Descriptor и Select Configuration явно связаны с usb_get_descriptor и usb_set_configuration соответственно.

Некоторые Get Report пакеты содержали Feature Id, а другие Input Id. Я смог сопоставить их с usb_control_msg со следующими параметрами, ( libusb.c помог я понял это):

requesttype = USB_ENDPOINT_IN | USB_TYPE_CLASS | USB_RECIP_INTERFACE
value = 0x01 (for GetReport)
index = id | (0x03 << 8) (for FeatureId)
Пакеты

Set Report также используются Feature Id, но Output Id. Из рассмотрения деталей выяснилось, что Input Id соответствует (0x01 << 8) и <code>Output Id соответствует (0x02 << 8). Таким образом, чтобы получить <code>Set Report, я позвонил usb_control_msg с этими настроенными параметрами:

requesttype = USB_ENDPOINT_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE
value = 0x09 (for SetReport)
index = id | (0x03 << 8) (for FeatureId)

Возможно, это не самый правильный способ сделать все это, и я, безусловно, был бы признателен за более глубокое понимание того, что происходит с различными функциями API . Но это позволило моему хосту захватить все соответствующие данные с устройства.

3 голосов
/ 02 марта 2012

HID-устройство [...] usb_bulk_read

Ой.Массовое чтение через USB используется только в конечных точках, а HID не имеет ни одного.

Конечные точки HID являются конечными точками прерывания, поэтому им требуется usb_interrupt_transfer().Вы смотрели на дескриптор конечной точки, не так ли?Он должен объявить тип конечной точки как прерывание.

...