USBシリアルを2つ以上接続すると、どれがどれに接続されているのかわからなくなる。この問題は接続時に作成される /dev/ttyUSBxx に自動的に別名を設定することで回避できる。ここではUSB接続ポートとidVendor/idProductによる固定の設定例をあげ、その他の条件を調べるコマンドを紹介する。
USB接続ポートで設定
USBポートに接続した物理位置で判断する方法は、見た目でわかるので簡単だ。一方、どこでにも挿せるというUSBの利点を失うことにも注意してほしい。
接続ポートを調べる
下の写真にポート番号を振った。写真に①がないのは、①がSMSC9512/9514 Fast Ethernet Adapterつまり有線LANポートに割り当てられているためである。
udev の設定
下のファイルを作成する。usb-usb-0:1.5:1.0の5の部分がポート番号である。
SUBSYSTEM=="tty", ENV{ID_PATH}=="platform-*.usb-usb-0:1.5:1.0", SYMLINK+="ttyFixedA"
本来の/dev/ttyUSBxxに/dev/ttyFixedAにシンボリックリンクが固定で設定される。最後に次のコマンドを実行し、設定を反映させる。
sudo udevadm control --reload-rules
idVendor idProductで設定
idVendorとはメーカ名に割り振られた番号でUSB Implementers Forum, Inc.で管理している。idProductはメーカが各々自由に割り振る番号である。これを利用してUSBシリアルを特定することができる。
idVendor idProductを調べる
$lsusb
Bus 001 Device 024: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
(以下略)
ID 10c4:ea60のうちidVendorが10c4 idProductがea60である。これをメモする。もしも、どれか不明であれば抜いてみて再度lsusbして無くなったものがそれである。
udev の設定
下のファイルを作成する。idVendorとidProductを上で確認した値に合わせる。
KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="ttyFixedB"
本来の/dev/ttyUSBxx に/dev/ttyFixedBにシンボリックリンクが固定で設定される。
やはり、最後に次のコマンドを実行し、設定を反映させる。
sudo udevadm control --reload-rules
プリンター
USBプリンターを設定する場合の例を紹介する。idVendorとidProductで設定している。
SUBSYSTEM=="usb", ATTRS{idVendor}=="XXXX",ATTRS{idProduct}=="XXX", SYMLINK+="lpFixedA"
FTDI社FT-Prog
FTDI社では下記サイトで同社製FT232用に設定書き換えソフトウェアFT-Progを配布している。これを用いれば自由にVenderID ProductIDを設定できる。余談だが、FT230X BASICのC0端子にDTRを割り振ることができないのは、何かと使われているので残念だ。
その他の条件
/etc/udev/rules.d/に設定する他の条件も次のコマンドを実行中する確認することができる。
udevadm info -q path -n /dev/ttyUSB0
更に情報の範囲を広げて表示する。
$udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
更新履歴
2019/02/14 プリンタの例の追加