我需要逆向設計定製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_INTERFACE
或SET_CONFIGURATION
因此我懷疑問題是關係到圖書館或我如何使用它,並且是而不是與設備相關。
@david:由於設備駐留在我的辦公室,因此我無法立即發佈描述符。無論如何,描述符中肯定有兩個端點 - 兩個接口中的每一個都有一個。兩個接口都至少提供一個包含設備按鈕狀態的輸出報告。至少這些報告定義了「使用按鈕」。 – Arne
你嘗試過使用hidapi嗎? –
我以爲自己'libusb_interrupt_transfer'永遠被阻塞,即使我已經設置了500ms的超時時間。 但是當我註釋掉那條線後,我的簡單驅動程序掛了;所以我在這裏和那裏插入了一些debug-prints,並發現'libusb_open'永遠鎖定,無論我發佈哪個設備。 該死的,難道真的需要這麼難從數字筆中獲得'int x,y,pressure,button_state;'?認真,這是矯枉過正:) – Frank