ブートローダー

ブートローダー

私は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
    

解決策

パラメータの取得

  1. デバイスを取り外す
  2. udevadm monitor -kups usb完全に入力されたイベントを取得するには、コマンドを実行してください。
  3. 接続してログを取得します。

ルールの作成

2つのオプションがあります。

  1. 元のKERNELイベントに基づいてルールを作成します。

    ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \
      ENV{PRODUCT}=="403/6011/0", SYMLINK+="my_port"
    
  2. 拡張イベントに基づくUDEVルールの作成:

    ACTION=="add", SUBSYSTEM=="usb-serial", ENV{DEVTYPE}=="usb_device", \
      ENV{ID_VENDOR_ID}=="0403", ENV{ID_MODEL_ID}=="6011", SYMLINK+="my_port"
    

テストルール

不要な動作を防ぐために、本番前にルールをテストする必要があります。(例:広すぎる条件=>複数の一致=>複数の実行)

  1. 最後の実行出力からデバイスパスを取得しますudevadm monitor(例:usb1/1-3あなたの場合)
  2. udevadm test次のために走る試運転udevルール:

    udevadm test --action=add /sys/bus/usb/devices/usb1/1-3
    

変更を適用して試してください。

  1. ルールを再ロードします。

    udevadm control --reload
    
  2. USBデバイスの再接続トリガー:

    udevadm trigger -v --action=add --subsystem-match /sys/bus/usb/devices/usb1/1-3
    

おすすめ記事