每个人。
我有特殊的 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我在其他帖子中问过这个问题,但没有人给我答案。