Отправка передачи прерывания с использованием Libusb 1.0 возвращает LIBUSB_ERROR_IO, но не при получении - PullRequest
0 голосов
/ 29 мая 2019

Я устанавливаю среду тестирования (Google Test Framework) для некоторых пользовательских прошивок. Я использую USB с библиотекой Libusb 1.0 для получения выходов из прошивки, но мне также нужно смоделировать вход для прошивки. Я могу получать выходные данные на хост, но я не могу отправить передачу с хоста.

Дескриптор USB указывает, что передачи прерываний на хост содержат 3/4 фрагмента данных, которые я собираю, используя эту структуру данных:

typedef struct
{
    uint8_t reportId;
    uint8_t axis[NUM_AXIS];
    uint8_t button;
}usb_report_t;

Это прекрасно работает, используя этот вызов из libusb

transfer_error = libusb_interrupt_transfer(dev_handle, 0x81, (unsigned char*)&report, sizeof(report), &transfer_length, 200);

Моя вторая задача, а именно отправка передачи прерываний, я настроил с помощью этой структуры

typedef struct
{
    uint8_t reportId;
    uint8_t thumper;
}usb_out_report_t;

И я отправляю передачу прерывания, используя этот вызов

transfer_error = libusb_interrupt_transfer(dev_handle, 0x01, (unsigned char*)&out_report, sizeof(out_report), &length, 200);

Этот вызов возвращает -1, который является LIBUSB_ERROR_IO.

Пока я пытался решить эту проблему, я обнаружил обходной путь. Если я удалю идентификатор отчета из дескриптора USB, который, следовательно, превратит две структуры в

typedef struct
{
    //uint8_t reportId;
    uint8_t axis[NUM_AXIS];
    uint8_t button;
}usb_report_t;
typedef struct
{
    //uint8_t reportId;
    uint8_t thumper;
}usb_out_report_t;

Тогда прерывание переходит как на вход, так и на выход. Это нормально как временное решение, но не является идеальным долгосрочным решением.

Есть ли способ сохранить поле идентификатора отчета, но перенести его на конечные точки IN и OUT?

1 Ответ

0 голосов
/ 29 мая 2019

Если бы коллега помог мне разобраться с этим.Таким образом, очевидно, что в исходном коде libusb функция hid_open () анализирует дескриптор USB и использует functions.NumberOutputValueCaps, чтобы определить, нужен ли идентификатор отчета для написания выходного отчета.Дескриптор USB в моей пользовательской прошивке анализируется таким образом, что его возможности. NumberOutputValueCaps = 0. Это означает, что вызов API не ожидает использования идентификатора отчета.

Чтобы решить эту проблему, мы просто жестко закодировали определенное значение для NumberOutputValueCaps и перекомпилировали библиотеку libusb.Это позволило нам создать работающий тестовый фреймворк для производственной версии прошивки.

...