内核模块不一致

内核模块不一致

每个人。

我有特殊的 USB 设备(中文触摸屏),我需要它来连接到我的 Linux 计算机。

默认情况下,Linux 将连接的设备分配给usbhid(我通过执行找到了这个信息USB 设备和节点绘图*将触摸屏连接到计算机后出现)内核模块,因此我的系统无法将触摸屏视为输入设备。另外,我有该设备的驱动程序。我在 Linux 系统中构建并安装驱动程序,并创建在系统启动时加载此模块的指令/etc/modules-load.d/

驱动程序在启动时成功加载(我通过执行获取此信息lsmod),但触摸屏仍然连接到usbhid。我知道驱动程序运行良好,因为如果我卸载usbhid并重新插入设备,触摸屏驱动程序捕获触摸屏。

[alarm@alarmpi ~]$ usb-devices 

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0eef ProdID=0005 Rev=02.00
S:  Manufacturer=RPI_TOUCH
S:  Product=By ZH851
S:  SerialNumber=RÿhgWUC`g
C:  #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=(usbhid)

我发现有一种方法可以解除设备绑定usbhid通过创建 udev 规则。所以,这是我的 udev 规则:

ATTRS{idVendor}=="0eef", ATTRS{idProduct}=="0005", DRIVER=="usbhid", RUN="/bin/sh -c 'echo -n $kernel > /sys/bus/usb/drivers/usbhid/unbind'"

电脑重启后,USB 设备告诉我触摸屏根本没有附加驱动程序!我想,我的司机会捕捉到它:

[alarm@alarmpi ~]$ usb-devices 

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0eef ProdID=0005 Rev=02.00
S:  Manufacturer=RPI_TOUCH
S:  Product=By ZH851
S:  SerialNumber=RÿhgWUC`g
C:  #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=(none)

好吧,我也发现系统文件系统提供新id我的驱动程序中的字段。谷歌搜索新id系统文件系统我发现如果我向它发送供应商和产品 ID,设备将绑定到驱动程序,并且驱动程序将捕获设备。所以,如果我在 shell 执行这样的事情:

[alarm@alarmpi ~]# echo -n 0eef 0005 > /sys/bus/usb/drivers/eleduino_ts/new_id

一切都按我的需要进行。因此,我决定使用以下字符串更新我的 udev 规则:

# 1. Unbind our device from usbhid:
ATTRS{idVendor}=="0eef", ATTRS{idProduct}=="0005", DRIVER=="usbhid", RUN="/bin/sh -c 'echo -n $kernel > /sys/bus/usb/drivers/usbhid/unbind'"

# 2. Bind device to eleduino_ts driver:
ATTRS{idVENDOR}=="0eef", ATTRS{idProduct}=="0005", RUN="/bin/sh -c 'echo -n '0eef 0005' > /sys/bus/usb/drivers/eleduino_ts/new_id'"

应用新的 udev 规则,重新启动,执行 usb-device:

[alarm@alarmpi ~]$ USB 设备

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0eef ProdID=0005 Rev=02.00
S:  Manufacturer=RPI_TOUCH
S:  Product=By ZH851
S:  SerialNumber=RÿhgWUC`g
C:  #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=(usbhid)

这是怎么回事?为什么usbhid?。

好吧,我决定降级 udev 规则并创建系统.d服务。就这个:

[alarm@alarmpi ~]$ cat /etc/systemd/system/eleduino_ts.service 
[Unit]
Description=Bind device to eleduinos_ts
[email protected] plymouth-quit.service
After=systemd-user-sessions.service [email protected] plymouth-quit.service

[Service]
ExecStart=/bin/echo -n 0eef 0005 > /sys/bus/usb/drivers/eleduino_ts/new_id
Restart=always
IgnoreSIGPIPE=no

[Install]
WantedBy=multi-user.targets

我知道,该服务运行良好,但我的触摸屏仍然没有附加驱动程序:

[alarm@alarmpi ~]$ usb-devices 

T:  Bus=01 Lev=02 Prnt=02 Port=03 Cnt=02 Dev#=  4 Spd=12  MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=0eef ProdID=0005 Rev=02.00
S:  Manufacturer=RPI_TOUCH
S:  Product=By ZH851
S:  SerialNumber=RÿhgWUC`g
C:  #Ifs= 1 Cfg#= 1 Atr=c0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 2 Cls=03(HID  ) Sub=00 Prot=00 Driver=(none)

所以,我的问题是:如何将驱动程序附加到我的设备?

PS 也许会有帮助:

[alarm@alarmpi ~]$ uname -a 
Linux alarmpi 4.1.12-1-ARCH #1 PREEMPT Tue Oct 27 19:16:04 MDT 2015 armv6l GNU/Linux

提前致谢。

PS我在其他帖子中问过这个问题,但没有人给我答案。

相关内容