[英]Sending a interrupt transfer using Libusb 1.0 returns an LIBUSB_ERROR_IO but not when receiving
我正在為一些自定義固件設置測試框架(Google Test Framework)。 我正在使用帶有Libusb 1.0庫的USB來接收固件的輸出,但我還需要模擬固件的輸入。 我能夠將輸出接收到主機ok,但無法從主機發送傳輸。
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描述符並使用capabilities.NumberOutputValueCaps來確定編寫輸出報告是否需要報告ID。 我的自定義固件中的USB描述符由此進行解析,使得capabilities.NumberOutputValueCaps = 0.這意味着api調用不期望使用報告ID。
為了解決這個問題,我們只是對NumberOutputValueCaps的特定值進行了硬編碼,並重新編譯了libusb庫。 這讓我們為固件的生產版本提供了一個有效的測試框架。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.