web-dev-qa-db-ja.com

/ dev / ttyUSBのバスとデバイスの関係を取得する方法

USBドングルを再起動するためのスクリプトを作成する必要があります。すべてのツールを持っていますが、/ dev/ttyUSBxを物理BUSおよびDEVICEにリンクできません。問題は、IDベンダーとID製品が同じ3つのドングルがあることです。

Lsusbを実行すると、出力は次のようになります。

Bus 001 Device 004: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 006: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 007: ID 12d1:1003 Huawei Technologies Co., Ltd. E220 HSDPA Modem / E270 HSDPA/HSUPA Modem
Bus 001 Device 002: ID 80ee:0021
Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

そして、私はそれを添付しました:

/dev/ttyUSB0
/dev/ttyUSB3
/dev/ttyUSB5

しかし、どのデバイスがどのバスデバイスに関連しているかを知りたいです。例として、次のものを取得する必要があります。

/dev/ttyUSB0 -> Bus 001 Device 006
/dev/ttyUSB3 -> Bus 001 Device 004
/dev/ttyUSB5 -> Bus 001 Device 007

Ubuntu Server 10.04を使用しており、ツールをテストしました。

lsusb
hal
lsmod

しかし、私は関係を得ることができません。

14

私はあなたのハードウェアを持っていないので、正確な答えをすることはできません。

たとえば、問題のデバイスにアクセスすることをお勧めします。

ls -l /dev/ttyUSB0

メジャーおよびマイナーノード番号を取得します。彼らは116、7だとしましょう

次に移動します:

ls -l /sys/dev/char/116:7

char、ttyはキャラクターデバイスであるため、ディスクデバイスをトレースダウンする場合は、blockの代わりにcharを指定します)

コマンドの出力には、次のようなものが表示されます。

lrwxrwxrwx 1 root root 0 Sep 6 00:17 116:7 -> ../../devices//sys/devices/pci0000:00/0000:00:13.5/pci0000:00/0000:00:13.5/usb1/1-3/1-3:1.1/sound/card1/pcmC1D0c

ディレクトリ/sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/とそのサブディレクトリには、デバイスに関する多くの情報があります。例として、/sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnumおよび/sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum。私のシステムでは、これらは/ var/log/syslogのデバイスホットプラグエントリに記載されているバスとデバイス番号に一致します。

/ dev/video0のシステムで動作する他の何か:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
11
John S Gruber

/dev/ttyUSB0のようなキャラクターデバイスを対応するUSB​​デバイスとバス番号にマッピングするgood方法は本当にありません。 ただし、可能です!

このような何かが動作する可能性があります:

udevadm info --name=/dev/ttyUSB0 --attribute-walk

そこから、デバイスとその親デバイスに関する多くの情報を取得します。さて、あなたが望むものを得るためにそれらのデータを解析することがすべてです。私は過去にこれを使用しました:

echo /dev/bus/usb/`udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); print}'` | tr " " "/"

さて、それが一口ではない場合、私は何がわからない!分解しましょう:

udevadm info --name=/dev/ttyUSB0 --attribute-walk-デバイスとその親デバイスに関する情報を返します

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'-これらのデータを解析し、「devnum」または「busnum」属性を含む行を返します。 「busnum」が最初にリストされていると仮定します...そしてその場合は、出力の最初の2行を取得するだけです。

head -n 2-出力の最初の2行を取得します。ここでもっと空想を得ることができますが、最も近い親の「busnum」と「devnum」が最初にリストされると仮定しています。

awk '{$1 = sprintf("%03d", $1); print}'-これらの数字を取得し、ゼロで埋めます。

echo /dev/bus/usb...-改行をスペースに置き換えるために、このジャズはすべてechoステートメントにラップされます。末尾の改行を切り捨てる場合は、-nechoに追加できます。

tr " " "/"-出力のスペースをスラッシュに置き換えます

これは次のようなものを出力します:

/dev/bus/usb/001/011

...もちろん、これはデバイスです。必要に応じて、いくつかの調整を行うことでbusnum:001 devnum:011のようなものを簡単に出力できます。

echo `udevadm info --name=/dev/ttyUSB0 --attribute-walk | sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\1\ \4/p' | head -n 2 | awk '{$1 = sprintf("%s:%03d", $1, $2); print $1;}'`
9
BMiner

以下のコマンドを使用して、ノードに関するすべての情報を見つけることができます。

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/
1
ravibhuva9955