私はUSB <->シリアルボックスを使用しており、シリアルポートへのカスタムシンボリックリンクを持っていると思います。
出力によると、udevadm
各ポートのKERNELS値が異なることがわかります。
KERNELS=="1-3:1.0" (this is labeled as port 1 on the box)
KERNELS=="1-3:1.1" (port 2)
KERNELS=="1-3:1.2" (port 3)
KERNELS=="1-3:1.3" (port 4)
私は次のルールを試しました。
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", KERNELS=="1-3:1.3", SYMLINK+="my_port"
これはうまくいきません。ただし、KERNELS=="1-3"
代わりに使用するとKERNELS=="1-3:1.3"
シンボリックリンクが生成されます。
異なるシリアルポートを区別するためにどのようにルールを書き換えることができますか?
$ udevadm info --path=/sys/bus/usb-serial/devices/ttyUSB19 --attribute-walk
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.3/ttyUSB19':
KERNEL=="ttyUSB19"
SUBSYSTEM=="usb-serial"
DRIVER=="ftdi_sio"
ATTR{latency_timer}=="16"
ATTR{port_number}=="0"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.3':
KERNELS=="1-3:1.3"
SUBSYSTEMS=="usb"
DRIVERS=="ftdi_sio"
ATTRS{authorized}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceNumber}=="03"
ATTRS{bInterfaceProtocol}=="ff"
ATTRS{bInterfaceSubClass}=="ff"
ATTRS{bNumEndpoints}=="02"
ATTRS{interface}=="USB <-> Serial Cable"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/pci0000:00/0000:00:14.0/usb1/1-3':
KERNELS=="1-3"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{bMaxPower}=="100mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 4"
ATTRS{bcdDevice}=="0800"
ATTRS{bmAttributes}=="80"
ATTRS{busnum}=="1"
ATTRS{configuration}==""
ATTRS{devnum}=="65"
ATTRS{devpath}=="3"
ATTRS{idProduct}=="6011"
ATTRS{idVendor}=="0403"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="FTDI"
[...]
ベストアンサー1
ブートローダー
KERNEL
@dirktが書いたように、USBデバイスのルールを書くときは、数学はできません。- 残念ながら、 ""のデバイスの充填速度は適切な
looking at device '/devices/pci0000:00/0000:00:14.0/usb1/1-3/1-3:1.3/ttyUSB19'
一致には十分ではありません(質問に見られるように)。 しかし、
udev
以前のルールとは異なるルールが役に立つかもしれません!元のデバイス情報がudevadm info
印刷されますが、udevadm monitor -u -p
パディングされたバージョンが印刷されます。udevadm monitor --help ... -p --property Print the event properties -k --kernel Print kernel uevents -u --udev Print udev events -s --subsystem-match=SUBSYSTEM[/DEVTYPE] Filter events by subsystem
解決策
パラメータの取得
- デバイスを取り外す
udevadm monitor -kups usb
完全に入力されたイベントを取得するには、コマンドを実行してください。- 接続してログを取得します。
ルールの作成
2つのオプションがあります。
元の
KERNEL
イベントに基づいてルールを作成します。ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \ ENV{PRODUCT}=="403/6011/0", SYMLINK+="my_port"
拡張イベントに基づく
UDEV
ルールの作成:ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \ ENV{ID_VENDOR_ID}=="0403", ENV{ID_MODEL_ID}=="6011", SYMLINK+="my_port"
テストルール
不要な動作を防ぐために、本番前にルールをテストする必要があります。(例:広すぎる条件=>複数の一致=>複数の実行)
- 最後の実行出力からデバイスパスを取得します
udevadm monitor
(例:usb1/1-3
あなたの場合) udevadm test
次のために走る試運転udevルール:udevadm test --action=add /sys/bus/usb/devices/usb1/1-3
変更を適用して試してください。
ルールを再ロードします。
udevadm control --reload
USBデバイスの再接続トリガー:
udevadm trigger -v --action=add --subsystem-match /sys/bus/usb/devices/usb1/1-3