2009-09-24 92 views
4

我有两个LCD使用Xorg的xinerama功能。每个LCD屏幕都有一个触摸屏,连接到它们各自的USB线。如何使用udev规则识别断开连接的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 ==“输入*”规则,我没有办法知道它是哪个设备!有没有人知道解决这个问题的方法?

+0

此shoukd在服务器故障。 – 2010-01-19 18:16:22

回答

0

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

0

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

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 /文件系统路径)作为参数传递给你的脚本是这样的(见man udev可用substitutions列表):

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

不要忘记通知你的新规则或更改规则的udevd与udevadm control --reload-rules