我有一个内核模块,专门从/dev/input/event2
和读取 USB 键盘输入/dev/input/event3
。
在某些设备上,键盘不会分配 event2 和 event3,但会分配键盘/dev/input/event3
,/dev/input/event4
这当然会导致模块丢失输入。
我已经仔细研究了 udev 规则和示例,但我似乎无法找到一种方法来强制 udev 分配特定的 event# 字符设备。我可以让它分配额外的任何其他内容,例如,/dev/input/mydevice
等等,但这在这种情况下没有帮助。这可能吗?
更复杂的是,插入的设备并不是真正的键盘,而是无线演示器,并为它分配了一个鼠标事件2、音量调高/调低按钮事件3,以及前进后退按钮事件4。就像下面这样:
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"
答案1
温和地说,通过打开特定文件而不是使用内核 API 来获取事件来读取事件的内核模块是很不寻常的。
我解决这个问题的方法是使用dd
或 十六进制编辑器来修补内核模块以使用其他路径,它们将这些路径创建为符号链接udev
。