web-dev-qa-db-ja.com

USBシリアルのudevルール「パス別」が機能しない

FTDIドライバーによって/dev/ttyUSB0/dev/ttyUSB1/dev/ttyUSB2などとして列挙された2つ以上のシリアルデバイスがあります。再起動時に、これらは他の順序で混乱する可能性があります。また、これらのデバイスをこれらの間で、または他の同様のデバイスと物理的に交換/交換する場合があります。

ここで、これらの永続的な列挙が必要です。デバイスが接続されている物理USBポート(PCのマザーボードのUSBポートに直接接続するか、USBハブを使用する場合があります)に従ってデバイス名を列挙したい-たとえば、デバイスがに接続されている場合USBハブ、ポート1はttyUSB0、ポート2はttyUSB1などの名前で予約する必要があります。

基本的な読み方をした後、(前述のように ここ/dev/serial/by-path/がデバイスを一種のシンボリックリンクとしてリストしていることがわかりました。そこで、次のようなファイル/etc/udev/rules.d/101-usb-serial.rulesを作成しました。

KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", DRIVERS=="ftdi_sio", PATH=="pci-0000:00:14.0-usb-0:10.1:1.0", SYMLINK+="ttyUSB000"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", DRIVERS=="ftdi_sio", PATH=="pci-0000:00:14.0-usb-0:10.2:1.0", SYMLINK+="ttyUSB001"
KERNEL=="ttyUSB[0-9]*", SUBSYSTEM=="tty", DRIVERS=="ftdi_sio", PATH=="pci-0000:00:14.0-usb-0:10.3:1.0", SYMLINK+="ttyUSB002"

しかし、これは機能しません。 ls /dev/ttyUSB*を実行すると、作成した新しいシンボリックリンクが表示されません。何がうまくいかない可能性がありますか?

1
skrowten_hermit

上記のコメントから手がかりを得て、私はなんとか上記の解決策を見つけることができました。

udevadm info /dev/ttyUSB0 | grep "ID_PATH="

上記は、/dev/ttyUSB0が接続されているポートのsysfsパスを示しています。この値を使用して、ルールファイルに必要な数のデバイス(ttyUSB1ttyUSB2....)のルールを作成します。たとえば、次のように/etc/udev/rules.d/101-usb-serial.rulesと言います。

SUBSYSTEM=="tty",ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:10.1:1.0",SYMLINK+="ttyUSB001"
SUBSYSTEM=="tty",ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:10.2:1.0",SYMLINK+="ttyUSB002"
SUBSYSTEM=="tty",ENV{ID_PATH}=="pci-0000:00:14.0-usb-0:10.3:1.0",SYMLINK+="ttyUSB003"

変更またはファイルの作成が完了したら、以下を実行します。

Sudo udevadm control --reload-rules
Sudo /etc/init.d/udev restart

P.S。:上記のシナリオ例(私が使用しているシナリオ)は、4ポートのBelkinUSBハブを使用しています。 Device 1はハブのport 1に接続され、Device 2port 2に接続されます。

2
skrowten_hermit