ttyUSBXデバイスをUSBシリアルデバイスに一致させる方法


21

オプションドライバはUSB IDに正しく一致し、このデバイスのドライバをロードします。例えば

# lsusb
Bus 001 Device 002: ID 19d2:0031 ONDA Communication S.p.A. ZTE MF636
Bus 001 Device 003: ID 12d1:14ac Huawei Technologies Co., Ltd.

また、ハードウェアを管理するためのttyUSBXデバイスを作成します

crw-rw---- 1 root uucp 188, 0 Jul  4 13:48 /dev/ttyUSB0
crw-rw---- 1 root uucp 188, 1 Jul  4 13:49 /dev/ttyUSB1
crw-rw---- 1 root uucp 188, 2 Jul  4 13:35 /dev/ttyUSB2
crw-rw---- 1 root uucp 188, 3 Jul  4 13:37 /dev/ttyUSB3
crw-rw---- 1 root uucp 188, 4 Jul  4 13:37 /dev/ttyUSB4
crw-rw---- 1 root uucp 188, 5 Jul  4 13:37 /dev/ttyUSB5
crw-rw---- 1 root uucp 188, 6 Jul  4 13:37 /dev/ttyUSB6
crw-rw---- 1 root uucp 188, 7 Jul  4 13:37 /dev/ttyUSB7

ただし、USBシリアルデバイスは複数あり、どのttyUSBがどのUSBIDに対応しているかを知りたいです。例 / dev / ttyUSB1-> 19d2:0031

この情報を取得できるポイントを知っていますか?


ベンダー/製品などの詳細を知っている場合、この答えは素晴らしいです
earcam

回答:


12

sysfsファイルシステムをご覧ください。USBシリアルの例:

$ lsusb
Bus 003 Device 016: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
$ ls -l /sys/bus/usb-serial/devices
lrwxrwxrwx 1 root root 0 Jul  4 17:37 ttyUSB0 -> ../../../devices/pci0000:00/0000:00:1c.0/0000:02:00.0/usb3/3-1/3-1:1.0/ttyUSB0
$ $ grep PRODUCT= /sys/bus/usb-serial/devices/ttyUSB0/../uevent
PRODUCT=67b/2303/300

ご覧のとおり、私のコンピューターにttyUSB0マップし067b:2303ます。探索する価値がある他の場所は/sys/class/tty/です。シンボリックリンクに注意してください。


PRODUCTにもリストするために何かしましたか?
イゴールストッパ

@IgorStoppa、しようとした結果からファイル例えば、。シリアルデバイスのノード名に置き換えます。catueventfind /sys -name ttyACM0
-sherrellbc

9

デバイスが/ dev / serial / by-id /に登録されているかどうかを確認できます。

ls -l / dev / serial / by-id

これらの名前は一貫している必要があり、正しいttyUSBxを指す(シンボリックリンク)


明確化、例などを追加できますか。1行の回答は、SEでは良いとはみなされません
Romeo

@RomeoNinov OK、ご要望に応じて説明を追加しました。これは、単に別のディレクトリを調べるよりも難しいことではないので、答えをより精巧にすると何が改善されるかわかりません。ごめんなさい
ワックスヘッド

Raspberry Piに2つの同一のアダプター(2つのArduino)を接続しています。ls -l /dev/serial/by-idアダプタを1つだけ返しますが../../ttyUSB1ls -l /sys/bus/usb-serial/devices両方を表示します。だから、これは良い答えだとは思わない。
ダニエルF

6

私が持っていた同様の問題を

これを/etc/udev/rules.d/50-usb.rulesに書き込みます

SUBSYSTEM=="tty", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", SYMLINK+="ONDA"
SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14ac", SYMLINK+="HUAWEI"

最後まで。リブート。

これで/dev/ONDA、ONDAデバイスにアクセスできます。

非rootユーザーがこれらを使用できるようにする場合は、追加します

, MODE="0666"

各行の終わりまで。


これを行い、リンク先のファイルを確認しました。私が持っている製品には、ソリッドディスク、USBシリアルなどの複数のインターフェイスがあります。/ dev / ttyACM0へのリンクを期待していましたが、/ dev / sdaへのリンクでした。ルールを適用するデバイスタイプをルールファイルで定義する方法はありますか?/etc/udev/rules.d/99-ftdi.rulesにルールを書きました
18

わかりました:ルールパラメータにSUBSYSTEM == "tty"を追加しました。この値は、次の出力で見つけることができます udevadm info --name=/dev/ttyACM0
nurp

3

私はudevを使用して、デバイスのシンボリックリンクを作成するいくつかのルールを作成します。

デバイスを区別するのに十分な情報を取得するには、すべてのデバイスに対して次のようなことを試してください。

$ udevadm info --query all --name /dev/ttyUSB0 --attribute-walk

1

次のコマンドは、19d2:0016(ZTE MF831 LTEスティックの「モデムモード」IDで、異なる場合があります)に関連付けられているttyUSBデバイス名のリストを表示します。

    for i in $(find -L /sys/bus/usb/devices/ -maxdepth 2 -name "ttyUSB*"); do
        egrep -i "v19d2p0016(.*)in02" $i/../modalias >/dev/null && echo "/dev/${i##*/}"
    done

これにより、/ sys / bus / usb / devicesにある、シンボリックリンクを含むファイル名ttyUSB *のファイルのリストがループされます。結果内でmodaliasという名前のファイルを検索し、ベンダーID "v" "19d2"および製品ID "p" 0016を含む文字列を探します。出力が一致する場合、 "/ dev /で始まる文字列をエコーし​​ます「USBの前に?名前。Afaikは最初または通常最後(最も大きい番号)がZTEデバイスのモデムポートです。結果を/ tmp /のファイルにエコーし、それに応じて行をhead -n1またはtail -n1することができます。ハブがある場合は、おそらくmaxdepthを増やす必要があります。

これは最もエレガントな方法ではありませんが、ほとんどすべてのLinuxバリアントで機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.