Comment obtenir la relation bus et périphérique pour un / dev / ttyUSB

14

J'ai besoin d'écrire un script pour redémarrer les dongles USB. J'ai tous les outils mais je ne peux pas lier mon / dev / ttyUSBx au BUS physique et au DISPOSITIF. Un problème est que j'ai trois dongles avec le même fournisseur d'identification et le même produit d'identification.

Si je fais lsusb, la sortie est:

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

Et je l'ai attaché à:

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

Mais je veux savoir quel périphérique est lié à quel périphérique de bus. Par exemple, je dois obtenir ce qui suit:

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

J'utilise Ubuntu Server 10.04 et j'ai testé les outils:

lsusb
hal
lsmod

Mais je ne peux pas obtenir la relation.

Ernesto Campohermoso
la source

Réponses:

11

Comme je n'ai pas votre matériel, je ne peux pas vous donner de réponse exacte.

Je vous suggère d'aller sur l'appareil en question, par exemple:

ls -l /dev/ttyUSB0

et obtenir les numéros de nœud majeur et mineur. Disons qu'ils sont 116, 7

Ensuite aller à:

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

( char, car un tty est un périphérique de caractères, si vous traçiez un périphérique de disque que vous spécifieriez à la blockplace de char)

Dans la sortie de la commande, vous verrez quelque chose comme:

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

Le répertoire /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/et ses sous-répertoires contiennent de nombreuses informations sur l'appareil. À titre d'exemple, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnumet /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum. Sur mon système, ils correspondent au numéro de bus et de périphérique mentionné dans les entrées de connexion à chaud des périphériques dans / var / log / syslog.

Quelque chose d'autre qui fonctionne sur mon système pour / dev / video0:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
John S Gruber
la source
Merci beaucoup !, je me bats avec ça depuis de nombreuses fois. Juste pour d'autres visiteurs: Dans mon ubuntu Ubuntu 10.04.2 LTS, le répertoire de l'appareil est / sys / dev / char / au lieu de / sys / char /
Ernesto Campohermoso
Merci pour la correction - j'ai modifié la réponse avec ce changement et ajouté une commande find pour imprimer les informations.
John S Gruber
@JohnSGruber D'accord, mais comment le monter?!
Dr.jacky
1
@ Mr.Hyde: Vous ne pouvez pas monter un / dev / ttyUSB; seul un périphérique fonctionnant comme un lecteur de disque peut être monté.
John S Gruber
10

Il n'y a vraiment pas de bon moyen de mapper des périphériques de caractères comme /dev/ttyUSB0les numéros de périphérique et de bus USB correspondants. MAIS, c'est possible!

Quelque chose comme ça pourrait fonctionner:

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

De là, vous obtiendrez un tas d'informations sur l'appareil et ses appareils parents. Maintenant, il s'agit simplement d'analyser ces données pour obtenir ce que vous voulez. Je l'ai utilisé dans le passé:

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 " " "/"

Maintenant, si ce n'est pas une bouchée, je ne sais pas ce que c'est! Décomposons-le:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - retourne des informations sur l'appareil et ses appareils parents

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'- analyse ces données et retourne toutes les lignes contenant l'attribut "devnum" ou "busnum". Nous supposerons que "busnum" est répertorié en premier ... et dans ce cas ... nous pouvons simplement saisir les deux premières lignes de sortie.

head -n 2- Saisissez les 2 premières lignes de sortie. Nous pourrions obtenir plus de fantaisie ici, mais nous faisons simplement l'hypothèse que le "busnum" et le "devnum" du parent le plus proche seront répertoriés en premier.

awk '{$1 = sprintf("%03d", $1); print}' - Prend ces chiffres et les garnit de zéros.

echo /dev/bus/usb... - tout ce jazz est enveloppé dans une echodéclaration pour remplacer les nouvelles lignes par des espaces. Vous pouvez ajouter le -nà echosi vous souhaitez couper la nouvelle ligne de fin.

tr " " "/" - remplacer les espaces dans la sortie par des barres obliques

Cela produira quelque chose comme:

/dev/bus/usb/001/011

... qui, bien sûr, est l'appareil. Si vous le souhaitez, vous pouvez facilement produire quelque chose comme busnum:001 devnum:011avec quelques ajustements:

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;}'`
BMiner
la source
1

Vous pouvez trouver toutes les informations sur le nœud en utilisant la commande ci-dessous:

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/
ravibhuva9955
la source
Veuillez supprimer la barre oblique de fin. Il donne "syspath not found".
nvd