用自定義的替換 HID 設備驅動程序
我正在尋找一種將我的鍵盤核心模組替換為自定義模組的方法。為此,我有一個羅技 MK710 鍵盤 + 滑鼠套裝,帶有一個帶有這 2 個介面的 USB 接收器。自動,預設管理這個USB接收器
usb
,usbhid
或者logitech-hidpp-device
模組,有一些資訊(注意:1-2
是接收器設備):ubuntu@ubuntu-VirtualBox:/sys/bus/usb/devices/1-2$ tree | grep driver │ ├── driver -> ../../../../../../bus/usb/drivers/usbhid │ ├── driver -> ../../../../../../bus/usb/drivers/usbhid │ │ │ ├── driver -> ../../../../../../../../bus/hid/drivers/logitech-hidpp-device │ │ │ ├── driver -> ../../../../../../../../bus/hid/drivers/logitech-hidpp-device │ │ ├── driver -> ../../../../../../../bus/hid/drivers/logitech-djreceiver │ ├── driver -> ../../../../../../bus/usb/drivers/usbhid ├── driver -> ../../../../../bus/usb/drivers/usb
我想要實現的是編寫一個適當的模組,該模組將由核心而不是那些預設驅動程序選擇。我認為這是編寫正確的模組別名的問題,但我不確定,因為還沒有任何效果。我已經嘗試過的事情是:
- 將我的模組放在
/lib/modules/$(uname -r)/kernel/drivers
目錄中(我在裡面創建了自己的子目錄custom
並將 .ko 文件放在那裡)- 在模組 C 程式碼中使用正確的別名,我嘗試了下面列出的所有選項(注意:
USB_VENDOR_ID
並且USB_PRODUCT_ID
是我使用的宏,並且它們的值已針對我的特定設備正確設置):static struct hid_device_id mod_table [] = { { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, USB_VENDOR_ID, USB_PRODUCT_ID) }, { } /* Terminating entry */ }; MODULE_DEVICE_TABLE(hid, mod_table);
或者
static struct hid_device_id mod_table [] = { { HID_USB_DEVICE(USB_VENDOR_ID, USB_PRODUCT_ID) }, { } /* Terminating entry */ }; MODULE_DEVICE_TABLE(hid, mod_table);
和
static struct usb_device_id mod_table [] = { { USB_DEVICE(USB_VENDOR_ID, USB_PRODUCT_ID) }, { } /* Terminating entry */ }; MODULE_DEVICE_TABLE(usb, mod_table);
/lib/modules/$(uname -r)/kernel/drivers
從目錄(我在頂部指定的 3 個)中刪除原始(預設)HID 驅動程序。然而核心仍然選擇載入原始模組而不是我自己的。我什至確保只有我的驅動程序的別名指定了供應商和產品 ID(在
modules.alias
文件中檢查它),但沒有任何效果。只有當我決定通過libusb
庫(使用libusb_detach_kernel_driver
函式)手動從使用者空間分離核心驅動程序並重新載入我自己的自定義模組時,該模組才開始工作 - 只有核心將設備與我的驅動程序相關聯,但這只是直到下一次啟動。我想讓它永久化,甚至自動化。我希望整個概念是可以理解的,並且不會太混亂。提前致謝。
您很可能被 initramfs 絆倒了:當您安裝目前核心時,原始 HID 驅動程序模組的副本已儲存在其中,如果您在添加模組時沒有重新生成 initramfs,那麼您定制的將不會在那裡。
在啟動時,USB 支持模組是最先被載入的模組,此時系統仍在 initramfs 上執行並且尚未安裝真正的根文件系統。所以系統仍在尋找和載入原始
usbhid
+logitech-hidpp-device
模組組合。您似乎使用的是 Ubuntu,因此 Debian 風格的
sudo update-initramfs -u
命令應該足以使用目前模組集和其他配置文件重建目前核心版本的 initramfs。