6

Xorg の xinerama 機能を使用する 2 つの 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 バスがリセットされたように見え (または何かおかしい)、2 つのタッチスクリーンが反転します (左の LCD を押すとマウスが右に移動し、右の LCD を押すとマウスが右に移動します)。左)。

問題をデバッグするために、デバイスがリセット/切断されたとき (または何でも) をログに記録する udev ルールを作成しようとしました。しかし、udev は接続時にデバイスの完全な詳細 (製品、製造元、idProduct、idVendor など) を報告するように見えますが、削除するといくつかのバス番号しか表示されません。どうしてこれなの?

ACTION=="remove", KERNEL=="input*" ルールを取得すると、それがどのデバイスかを知る方法がありません! 誰もこれを回避する方法を知っていますか?

4

3 に答える 3

3

最初に、デバイスの「削除」イベントのudevイベントを確認することをお勧めします。たとえばudevadm monitor --kernel --property --subsystem-match=usb、デバイスを順番に切断して接続を切断し、出力を比較します。ここでは、1 回のマウス切断で 2 つのイベントが発生します。

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をチェックすることをお勧めします.2つの同じデバイスでは異なるはずです。また、次のようdevpathに (これは /sys/ ファイルシステム内のパスです) を引数としてスクリプトに渡すこともできます (man udev使用可能な のリストについては、 を参照してくださいsubstitutions)。

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

新しいルールまたは変更されたルールを udevd に通知することを忘れないでください。udevadm control --reload-rules

于 2014-06-10T12:46:25.690 に答える
0

Linuxでも同じ問題に遭遇しました。削除時に送信される情報は最小限であり、削除されるデバイスを一意に識別するために使用することはできません。以前は を使用していましたがPHYDEVPATH(これは、特定のマシンと USB ポートのプラグインとアンプラグで固有のものです)、非常に残念なことに、以降のバージョンのudev.

于 2010-01-19T18:14:12.093 に答える
0

私は同様の機能を備えたアプリケーションを作成していましたが、udev_device接続を保存するという唯一の使命を持つデーモンを実装する問題を解決しました。そのため、デーモンのデバイスリストにないデバイスをチェックしますremoveudev_monitor欠けているのは、デバイスが切断されていることです。そうすれば、切断されたデバイスのデータを取得できます。

于 2014-05-23T20:21:17.557 に答える