Cómo obtener una relación de bus y dispositivo para a / dev / ttyUSB


14

Necesito escribir un script para reiniciar los dongles USB. Tengo todas las herramientas, pero no puedo vincular mi / dev / ttyUSBx a BUS y DISPOSITIVO físicos. Un problema es que tengo tres dongles con el mismo proveedor de identificación y producto de identificación.

Si hago lsusb, la salida es:

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

Y lo he adjuntado a:

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

Pero quiero saber qué dispositivo está relacionado con qué dispositivo de bus. Por ejemplo, necesito obtener lo siguiente:

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

Estoy usando Ubuntu Server 10.04 y probé las herramientas:

lsusb
hal
lsmod

Pero no puedo entender la relación.

Respuestas:


11

Como no tengo su hardware, no puedo darle una respuesta exacta.

Te sugiero que vayas al dispositivo en cuestión, por ejemplo:

ls -l /dev/ttyUSB0

y obtener los números de nodo mayor y menor. Digamos que son 116, 7

Luego ve a:

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

( char, porque un tty es un dispositivo de caracteres, si estuviera rastreando un dispositivo de disco, especificaría en blocklugar de char)

En el resultado del comando, verá algo parecido a:

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

El directorio /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/y sus subdirectorios tienen mucha información sobre el dispositivo. Como ejemplo, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnumy /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum. En mi sistema, estos coinciden con el número de bus y dispositivo mencionado en las entradas de hotplug del dispositivo en / var / log / syslog.

Algo más que funciona en mi sistema para / dev / video0:

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

¡Muchas gracias! He luchado con esto por mucho tiempo. Solo para otros visitantes: en mi Ubuntu Ubuntu 10.04.2 LTS, el directorio del dispositivo es / sys / dev / char / en lugar de / sys / char /
Ernesto Campohermoso

Gracias por la corrección: edité la respuesta con ese cambio y agregué un comando de búsqueda para imprimir la información.
John S Gruber

@JohnSGruber Ok, pero ¿cómo montarlo?
Dr.jacky

1
@ Mr.Hyde: No puede montar un / dev / ttyUSB; solo se puede montar algún dispositivo que funcione como una unidad de disco.
John S Gruber

10

Realmente no hay una buena manera de asignar dispositivos de caracteres como /dev/ttyUSB0el dispositivo USB correspondiente y los números de bus. PERO, es posible!

Algo como esto podría funcionar:

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

A partir de ahí, obtendrá una gran cantidad de información sobre el dispositivo y sus dispositivos principales. Ahora, solo se trata de analizar esos datos para obtener lo que desea. He usado esto en el pasado:

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

Ahora, si eso no es un bocado, ¡no sé qué es! Vamos a desglosarlo:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - devuelve información sobre el dispositivo y sus dispositivos principales

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"/\4/p'- analiza estos datos y devuelve cualquier línea que contenga el atributo "devnum" o "busnum". Asumiremos que "busnum" aparece primero ... y en ese caso ... podemos tomar las dos primeras líneas de salida.

head -n 2- Tome las primeras 2 líneas de salida. Podríamos ponernos más elegantes aquí, pero solo estamos asumiendo que el "busnum" y el "devnum" de los padres más cercanos se enumerarán primero.

awk '{$1 = sprintf("%03d", $1); print}' - Toma esos dígitos y los rellena con ceros.

echo /dev/bus/usb... - todo este jazz está envuelto en una echodeclaración para reemplazar las nuevas líneas con espacios. Puede agregar -na echosi desea cortar la nueva línea final.

tr " " "/" - reemplazar los espacios en la salida con barras diagonales

Esto generará algo como:

/dev/bus/usb/001/011

... que, por supuesto, es el dispositivo. Si lo desea, puede generar fácilmente algo como busnum:001 devnum:011con algunos ajustes:

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;}'`

1

Puede encontrar toda la información sobre el nodo utilizando el siguiente comando:

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

Elimina la barra inclinada final. Da "syspath no encontrado".
nvd
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.