Отправка передачи прерывания с использованием Libusb 1.0 возвращает LIBUSB_ERROR_IO, но не при получении

Я настраиваю тестовую среду (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?


person EYoung    schedule 29.05.2019    source источник


Ответы (1)


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

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

person EYoung    schedule 29.05.2019