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