Linux

如何為 USB-HID 設備使用 Linux 核心驅動綁定/取消綁定介面?

  • December 10, 2020

第一個背景。我正在為羅技遊戲面板設備開發驅動程序。這是一個帶有螢幕的鍵盤。該驅動程序執行良好,但預設情況下該設備由 HID 處理。為了防止 HID 在我的驅動程序之前接管設備,我可以在 hid-core.c 中將其列入黑名單。這可行,但不是最好的解決方案,因為我正在與幾個人一起工作,我們都必須繼續修補我們的 HID 模組,這正在成為一件苦差事,特別是因為它經常涉及重建 initramfs 等。

我對這個問題做了一些研究,發現了這個郵件列表文章,最終把我帶到了 LWN 上的這篇文章。這描述了一種在執行時將設備綁定到特定驅動程序的機制。這似乎正是我所需要的。

所以,我試了一下。我能夠從 HID 解除鍵盤綁定。這行得通,正如預期的那樣,我不能再在上面打字了。但是當我嘗試將它綁定到我們的驅動程序時,我得到“錯誤:沒有這樣的設備”並且操作失敗。

所以我的問題是:如何使用核心綁定/取消綁定操作來複製當您將 hid-core 中的 HID 設備列入黑名單並提供自己的驅動程序時發生的情況?- 那就是 - 代替一直需要修補 hid-core.c 的需要?

我們的驅動源碼在這裡:https ://github.com/ali1234/lg4l

好吧,原來答案是盯著我的臉。

首先,無論是使用我們的自定義驅動程序,還是使用通常接管設備的通用驅動程序,它仍然最終由 HID 控制,而不是 USB。

以前我試圖將它與 HID 解除綁定,這不是要走的路。HID 有子驅動程序,接管沒有專用驅動程序的設備的子驅動程序稱為通用 USB。這是我在綁定到 hid-g19 之前需要取消綁定的內容。此外,我需要使用看起來像“0003:046d:c229.0036”的 HID 地址,而不是看起來像“1-1.1:1.1”的 USB 地址。

所以在重新綁定之前,我會在 dmesg 上看到這個:

generic-usb 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

然後我做:

echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/generic-usb/unbind
echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/hid-g19/bind

然後我在 dmesg 上看到:

hid-g19 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

所以就像我說的,盯著我的臉,因為這兩個關鍵資訊是設備綁定時上線的前兩個東西……

引用自:https://unix.stackexchange.com/questions/12005