Linux

可以強制 udev 創建特定的設備事件編號,或更改設備事件編號

  • June 15, 2020

/dev/input/event2我有一個核心模組,它專門從和讀取 USB 鍵盤輸入/dev/input/event3

在某些設備上,鍵盤沒有被分配 event2 和 event3,它被分配了/dev/input/event3/dev/input/event4這當然會導致模組失去輸入。

我仔細研究了 udev 規則和範例,但似乎找不到強制 udev 分配特定事件#字元設備的方法。我可以讓它分配其他任何其他內容,例如/dev/input/mydevice,等,但這在這種情況下無濟於事。這可能嗎?

更複雜的是,插入的設備並不是真正的鍵盤,它是一個無線展示器,它將滑鼠分配給event2,將音量增大/減小按鈕分配給event3,並將前進後退按鈕分配給event4。如下所示:

drwxr-xr-x 160 Apr  1 00:05 .
drwxr-xr-x 240 Apr  1 00:05 ..
*lrwxrwxrwxroot  9 Apr  1 00:05 platform-fsl-ehci.0-usb-0:1:1.0-event-mouse -> ../event2
lrwxrwxrwx 9 Apr  1 00:05 platform-fsl-ehci.0-usb-0:1:1.0-mouse -> ../mouse0
*lrwxrwxrwx 9 Apr  1 00:05 platform-fsl-ehci.0-usb-0:1:1.1-event-kbd -> ../event3
*lrwxrwxrwx 9 Apr  1 00:05 platform-fsl-ehci.0-usb-0:1:1.2-event-kbd -> ../event4
lrwxrwxrwx 9 Apr  1 00:00 platform-imx-i2c.0-platform-max77696-onkey.0-event -> ../event0
lrwxrwxrwx 9 Apr  1 00:00 platform-imx-i2c.1-event -> ../event1

我需要它看起來像這樣:

drwxr-xr-x 160 Apr  1 00:05 .
drwxr-xr-x 240 Apr  1 00:05 ..
*lrwxrwxrwxroot  9 Apr  1 00:05 platform-fsl-ehci.0-usb-0:1:1.0-event-mouse -> ../event4
lrwxrwxrwx 9 Apr  1 00:05 platform-fsl-ehci.0-usb-0:1:1.0-mouse -> ../mouse0
*lrwxrwxrwx 9 Apr  1 00:05 platform-fsl-ehci.0-usb-0:1:1.1-event-kbd -> ../event3
*lrwxrwxrwx 9 Apr  1 00:05 platform-fsl-ehci.0-usb-0:1:1.2-event-kbd -> ../event2
lrwxrwxrwx 9 Apr  1 00:00 platform-imx-i2c.0-platform-max77696-onkey.0-event -> ../event0
lrwxrwxrwx 9 Apr  1 00:00 platform-imx-i2c.1-event -> ../event1

認為需要更改的值是“KERNEL”值。在滑鼠設備上使用 udevadm info 我得到以下結果。

[root@kin input]# udevadm info -a -p $(udevadm info -q path -n /dev/input/by-path/platform-fsl-ehci.0-usb-0\:1\:1.0-event-mouse)

looking at device '/devices/platform/fsl-ehci.0/usb1/1-1/1-1:1.0/input/input26/event2':
   KERNEL=="event2"
   SUBSYSTEM=="input"
   DRIVER==""

 looking at parent device '/devices/platform/fsl-ehci.0/usb1/1-1/1-1:1.0/input/input26':
   KERNELS=="input26"
   SUBSYSTEMS=="input"
   DRIVERS==""
   ATTRS{name}=="Genius Wireless Mouse"
   ATTRS{phys}=="usb-fsl-ehci.0-1/input0"
   ATTRS{uniq}==""
   ATTRS{modalias}=="input:b0003v0458p0189e0101-e0,1,2,4,k110,111,112,113,114,r0,1,6,8,am4,lsfw"
ATTRS{properties}=="0"

委婉地說,通過打開特定文件而不是使用核心 API 來獲取事件來讀取事件的核心模組是非常不尋常的。

我解決這個問題的方法是使用dd或十六進制編輯器來修補核心模組以使用其他一些路徑,它們將這些路徑創建為帶有udev.

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