使用 Libusb 1.0 发送中断传输会返回LIBUSB_ERROR_IO,但在接收时不会

Sending a interrupt transfer using Libusb 1.0 returns an LIBUSB_ERROR_IO but not when receiving

本文关键字:IO ERROR LIBUSB Libusb 返回 传输 中断 使用      更新时间:2023-10-16

我正在为一些自定义固件设置一个测试框架(谷歌测试框架)。我正在使用带有 Libusb 1.0 库的 USB 来接收固件的输出,但我还需要模拟固件的输入。我可以正常接收到主机的输出,但无法从主机发送传输。

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 端点进行传输工作?

有一位同事帮我弄清楚这个问题。 因此,显然在libusb源代码中,hid_open()函数解析USB描述符并使用这些功能。NumberOutputValueCaps,用于确定编写输出报告是否需要报表 ID。我的自定义固件中的 USB 描述符被解析为此功能。数字输出值上限 = 0。这意味着 api 调用不需要使用报告 ID。

为了解决这个问题,我们只是为 NumberOutputValueCaps 硬编码了一个特定的值,并重新编译了 libusb 库。这让我们有一个固件生产版本的工作测试框架。

相关文章: