我正在为某些自定义固件建立测试框架(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端点?
答案 0 :(得分:0)
请一位同事帮助我解决这个问题。 因此,显然在libusb源代码中,hid_open()函数解析USB描述符并使用features.NumberOutputValueCaps来确定是否需要报告ID来编写输出报告。我的自定义固件中的USB Descriptor以此进行解析,使capabilities.NumberOutputValueCaps =0。这意味着api调用不希望使用报告ID。
为解决此问题,我们仅对NumberOutputValueCaps的特定值进行了硬编码,然后重新编译了libusb库。这样就为固件的生产版本提供了一个有效的测试框架。