Kernel

用自定義的替換 HID 設備驅動程序

  • January 24, 2022

我正在尋找一種將我的鍵盤核心模組替換為自定義模組的方法。為此,我有一個羅技 MK710 鍵盤 + 滑鼠套裝,帶有一個帶有這 2 個介面的 USB 接收器。自動,預設管理這個USB接收器usbusbhid或者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。

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