Como obter o relacionamento Bus and Device para um / dev / ttyUSB

10

Eu preciso escrever um script para reiniciar os dongles USB. Eu tenho todas as ferramentas, mas não consigo vincular meu / dev / ttyUSBx ao BUS físico e ao DEVICE. Um problema é que eu tenho três dongles com o mesmo fornecedor de id e product id.

Se eu fizer lsusb, a saída é:

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

E eu anexei isso a:

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

Mas quero saber qual dispositivo está relacionado a qual dispositivo de barramento. Por exemplo, eu preciso obter o seguinte:

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

Estou usando o Ubuntu Server 10.04 e testei as ferramentas:

lsusb
hal
lsmod

Mas eu não consigo o relacionamento.

    
por Ernesto Campohermoso 06.09.2012 / 00:21

3 respostas

10

Como não tenho o seu hardware, não posso dar uma resposta exata.

Sugiro que você vá para o dispositivo em questão, por exemplo:

ls -l /dev/ttyUSB0

e obtenha os números dos nós maiores e menores. Vamos dizer que eles são 116, 7

Em seguida, vá para:

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

( char , porque um tty é um dispositivo de caractere, se você estivesse rastreando um dispositivo de disco, você especificaria block em vez de char )

Na saída do comando, você verá algo um pouco como:

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

O diretório /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/ e seus subdiretórios têm muita informação sobre o dispositivo. Por exemplo, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnum e /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/devnum . No meu sistema, eles correspondem ao número do barramento e do dispositivo mencionados nas entradas do hotplug do dispositivo em / var / log / syslog.

Outra coisa que funciona no meu sistema para / dev / video0:

find /sys/dev -lname '*video0' -exec cat {}/device/busnum {}/device/devnum \; 2>/dev/null
    
por John S Gruber 06.09.2012 / 06:49
7

Não existe realmente uma maneira boa de mapear dispositivos de caracteres como /dev/ttyUSB0 para o dispositivo USB e números de barramento correspondentes. MAS, é possível!

Algo parecido com isso pode funcionar:

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

De lá, você receberá várias informações sobre o dispositivo e seus dispositivos pai. Agora, é só analisar esses dados para obter o que você deseja. Eu usei isso no passado:

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

Agora, se isso não é um bocado, eu não sei o que é! Vamos dividir:

udevadm info --name=/dev/ttyUSB0 --attribute-walk - retorna informações sobre o dispositivo e seus dispositivos pai

sed -n 's/\s*ATTRS{\(\(devnum\)\|\(busnum\)\)}==\"\([^\"]\+\)\"//p' - analisa esses dados e retorna todas as linhas que contenham o atributo "devnum" ou "busnum". Vamos supor que "busnum" é listado primeiro ... e, nesse caso ... podemos simplesmente pegar as duas primeiras linhas de saída.

head -n 2 - Pegue as duas primeiras linhas de saída. Poderíamos ficar mais chiques aqui, mas estamos apenas supondo que os "busnum" e "devnum" dos pais mais próximos serão listados primeiro.

awk '{ = sprintf("%03d", ); print}' - obtém esses dígitos e os preenche com zeros.

echo /dev/bus/usb ... - todo esse jazz é incorporado em uma instrução echo para substituir as novas linhas por espaços. Você pode adicionar o -n a echo se quiser cortar a nova linha à direita.

tr " " "/" - substitua os espaços na saída por barras normais

Isso produzirá algo como:

/dev/bus/usb/001/011

... o que, claro, é o dispositivo. Se você quiser, pode facilmente enviar algo como busnum:001 devnum:011 com alguns ajustes:

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

Você pode encontrar todas as informações sobre o nó usando o comando abaixo:

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/
    
por ravibhuva9955 28.04.2014 / 08:42