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

时间:2019-05-29 17:39:16

标签: c++ libusb-1.0

我正在为某些自定义固件建立测试框架(Google测试框架)。我将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端点?

1 个答案:

答案 0 :(得分:0)

请一位同事帮助我解决这个问题。 因此,显然在libusb源代码中,hid_open()函数解析USB描述符并使用features.NumberOutputValueCaps来确定是否需要报告ID来编写输出报告。我的自定义固件中的USB Descriptor以此进行解析,使capabilities.NumberOutputValueCaps =0。这意味着api调用不希望使用报告ID。

为解决此问题,我们仅对NumberOutputValueCaps的特定值进行了硬编码,然后重新编译了libusb库。这样就为固件的生产版本提供了一个有效的测试框架。