【发布时间】:2019-05-30 04:44:44
【问题描述】:
我正在为一些自定义固件设置一个测试框架(谷歌测试框架)。我正在使用 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 描述符中删除报告 ID,从而将两个结构变为
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;
然后中断传输输入和输出工作正常。这可以作为临时解决方案,但不是理想的长期解决方案。
有没有办法保留报告 ID 字段,但让 IN 和 OUT 端点都可以传输?
【问题讨论】:
标签: c++ libusb-1.0