2009-09-24 60 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