簡體   English   中英

使用Libusb 1.0發送中斷傳輸會返回LIBUSB_ERROR_IO,但在接收時不會

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM