【问题标题】:Sending a interrupt transfer using Libusb 1.0 returns an LIBUSB_ERROR_IO but not when receiving使用 Libusb 1.0 发送中断传输会返回 LIBUSB_ERROR_IO 但在接收时不返回
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      • 2014-09-12
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多