2011-06-25 84 views
4

我需要逆向設計定製HID USB設備(控制面板上的某些按鈕和LED)的驅動程序。該驅動程序僅在Windows上可用,我們需要* nix實現。libusb中斷傳輸

該設備顯然是一個HID設備,雖然不是一個特定的類。它提供兩個接口,每個接口都有一箇中斷端點。

我的設置目前涉及到一個在Ubuntu主機上運行Windows的VirtualBox,通過Wireshark捕獲USB流量。該協議相當簡單,我已經獲得了相當好的理解。

我在一個簡單的C++控制檯程序中使用libusb-1.0進行原型設計。我已經設法通過發出一個SET_REPORT控制傳輸來切換LED,但在通過傳輸中斷來接收按鈕按壓方面掙扎不已。

其實下面的調用塊永遠:

unsigned char bytes[8] = { 0 }; 
int len = 0; 
int ret = libusb_interrupt_transfer(handle, 0x81, bytes, 8, &len, 0); 

當檢查導致URB在Wireshark的它看起來就像在Windows會話中捕獲的等價物。儘管如此,我從來沒有從設備得到答覆。

我倒了,我錯過了一些設置。請注意,設備已正確打開,且設備提供的兩個界面都已獲得成功聲明。即使在我的Linux應用程序中,通過控制傳輸方式輸入報告也即將到來。

感謝任何指針! Arne

附錄I: 我在想如何指定在使用libusb_interrupt_transfer()時想要接收哪個報告ID?

附錄二: 當比較Windows驅動程序與Wireshark中的上述代碼生成的請求時,我看不到任何區別(URB中的值相同)。但是,只有當Windows驅動程序發出中斷傳輸時纔會返回。

在Wireshark中檢查Windows驅動程序通信時,我看不到除各種GET_DESCRIPTOR(...)以外的任何控制轉移。最重要的是:沒有SET_INTERFACESET_CONFIGURATION因此我懷疑問題是關係到圖書館或我如何使用它,並且是而不是與設備相關。

+0

@david:由於設備駐留在我的辦公室,因此我無法立即發佈描述符。無論如何,描述符中肯定有兩個端點 - 兩個接口中的每一個都有一個。兩個接口都至少提供一個包含設備按鈕狀態的輸出報告。至少這些報告定義了「使用按鈕」。 – Arne

+0

你嘗試過使用hidapi嗎? –

+0

我以爲自己'libusb_interrupt_transfer'永遠被阻塞,即使我已經設置了500ms的超時時間。 但是當我註釋掉那條線後,我的簡單驅動程序掛了;所以我在這裏和那裏插入了一些debug-prints,並發現'libusb_open'永遠鎖定,無論我發佈哪個設備。 該死的,難道真的需要這麼難從數字筆中獲得'int x,y,pressure,button_state;'?認真,這是矯枉過正:) – Frank

回答

1

您發佈的代碼存在問題。您爲定義bytes而編寫的語法不會生成8字節的數組,但是您要求libusb將8個字節寫入該地址,以便可能出現錯誤或內存損壞。試試這個:

unsigned char buffer[8]; 
int len = 0; 
int ret = libusb_interrupt_transfer(handle, 0x81, buffer, sizeof(buffer), &len, 0); 

每個HID報告都有自己的終點,所以你指定要通過指定正確的端點接受該報告。您指定了端點1 IN(0x81)。你確定端點是在設備描述符中定義的嗎?也許你應該得到描述符(在Ubuntu中使用lsusb -v)並將它們發佈到這裏,以便我們可以檢查它們。

+0

缺失的括號是一個錯字。實際的代碼讀取'unsigned char buffer [8]'。無論如何,感謝提示。 – Arne