如何使用udev规则识别断开连接的USB设备?

时间:2009-09-24 21:32:15

标签: udev

我有两台使用Xorg xinerama功能的LCD。每个LCD屏幕都有一个触摸屏,它们连接到各自的USB线。

查看'/ var / log / messages'文件,我看到以下内容:

kernel: input: Analog Resistive as /class/input/input0
kernel: input: USB HID v1.01 Mouse [Analog Resistive] on usb-0000:00:1d.3-1
kernel: input: Analog Resistive as /class/input/input1
kernel: input: USB HID v1.01 Mouse [Analog Resistive] on usb-0000:00:1d.3-2

出于某种原因,在某个时间点USB总线似乎重置(或奇怪的东西)并且我的两个触摸屏反转(按下左侧LCD,鼠标右移,如果我按下右侧LCD鼠标在左边移动。)

为了尝试调试问题,我尝试编写一个udev规则来记录我的设备何时重置/断开连接(或其他)。但似乎udev会在连接时在设备上报告完整的详细信息(产品,制造商,idProduct,idVendor等),但在删除时只提供一些总线号码。这是为什么?

当我得到一个ACTION ==“删除”,KERNEL ==“输入*”规则时,我无法知道它是哪个设备!有没有人知道解决这个问题?

3 个答案:

答案 0 :(得分:2)

我建议首先检查设备上的udev事件"删除"通过运行例如udevadm monitor --kernel --property --subsystem-match=usb并依次断开设备并比较输出。 在一个鼠标断开连接上我得到两个事件:

KERNEL[6680.737678] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0 (usb)
ACTION=remove
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0
DEVTYPE=usb_interface
INTERFACE=3/1/2
MODALIAS=usb:v09DAp000Ad0034dc00dsc00dp00ic03isc01ip02in00
PRODUCT=9da/a/34
SEQNUM=2835
SUBSYSTEM=usb
TYPE=0/0/0

KERNEL[6680.739577] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2 (usb)
ACTION=remove
BUSNUM=002
DEVNAME=/dev/bus/usb/002/006
DEVNUM=006
DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2
DEVTYPE=usb_device
MAJOR=189
MINOR=133
PRODUCT=9da/a/34
SEQNUM=2836
SUBSYSTEM=usb
TYPE=0/0/0

您可以编写调用脚本的规则,该脚本在检查某些特定环境变量后应该执行某些操作。规则可以像

一样简单
SUBSYSTEM=="usb", ACTION=="remove", RUN+="/usr/local/sbin/usbdevgone.sh"

在你的情况下,我建议在usbdevgone.sh中检查$ DEVPATH,因为它们应该因你的两个相同的设备而不同。 您也可以将devpath(这是/ sys / filesystem中的路径)作为参数传递给您的脚本(请参阅man udev以获取可用的substitutions列表):

SUBSYSTEM=="usb", ACTION=="remove", RUN+="/usr/local/sbin/usbdevgone.sh $devpath"

请勿忘记使用udevadm control --reload-rules

通知udevd您的新规则或已更改的规则

答案 1 :(得分:0)

我在Linux中遇到了同样的问题。删除时发送的信息很少,不能用于唯一标识要删除的设备。我以前使用PHYDEVPATH(在插件和拔出时对于给定的机器和USB端口是唯一的),但非常不幸的是,这是deprecated in later versions of udev

答案 2 :(得分:0)

我正在编写一个具有类似功能的应用程序,我解决了实现守护进程的问题,其唯一任务是存储udev_device连接。因此,当我从remove检测到一些udev_monitor时,我检查了deamon设备列表中缺少的某些设备。缺少的是设备断开连接。这样我就可以获得断开设备的数据。