Como obter o relacionamento de barramento e dispositivo para um / dev / ttyUSB

14

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

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 a:

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

Mas quero saber qual dispositivo está relacionado a qual dispositivo de barramento. Por exemplo, 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 não consigo entender o relacionamento.

Ernesto Campohermoso
fonte

Respostas:

11

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

Eu sugiro que você vá ao dispositivo em questão, por exemplo:

ls -l /dev/ttyUSB0

e obtenha os números dos nós principais e secundários. Digamos que eles são 116, 7

Então vá para:

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

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

Na saída do comando, você verá algo parecido com:

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 muitas informações sobre o dispositivo. Como um exemplo, /sys/devices/pci0000:00/0000:00:13.5/usb1/1-3/busnume /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 de 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
John S Gruber
fonte
Muito obrigado !, Estou lutando com isso há muito tempo. Apenas para obter mais visitantes: Na minha ubuntu Ubuntu 10.04.2 LTS o diretório do dispositivo é / sys / dev / char / em vez de / sys / char /
Ernesto Campohermoso
Obrigado pela correção - editei a resposta com essa alteração e adicionei um comando find para imprimir as informações.
John S Gruber
@JohnSGruber Ok, mas como montá-lo ?!
precisa saber é o seguinte
1
@ Mr.Hyde: Você não pode montar um / dev / ttyUSB; apenas algum dispositivo que opera como uma unidade de disco pode ser montado.
John S Gruber
10

Realmente não há uma boa maneira de mapear dispositivos de caracteres como /dev/ttyUSB0o dispositivo USB e o número de barramento correspondentes. MAS, é possível!

Algo assim pode funcionar:

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

A partir daí, você obterá um monte de informações sobre o dispositivo e seus dispositivos principais. Agora, é tudo uma questão de 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\)\)}==\"\([^\"]\+\)\"/\4/p' | head -n 2 | awk '{$1 = sprintf("%03d", $1); 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\)\)}==\"\([^\"]\+\)\"/\4/p'- analisa esses dados e retorna todas as linhas que contêm o atributo "devnum" ou "busnum". Vamos assumir que "busnum" está listado primeiro ... e, nesse caso, podemos apenas pegar as duas primeiras linhas de saída.

head -n 2- Pegue as 2 primeiras linhas de saída. Poderíamos ter mais graça aqui, mas estamos apenas assumindo que o "busnum" e o "devnum" dos pais mais próximos serão listados primeiro.

awk '{$1 = sprintf("%03d", $1); print}' - Pega esses dígitos e os fecha com zeros.

echo /dev/bus/usb... - todo esse jazz é envolvido em uma echodeclaração para substituir as novas linhas por espaços. Você pode adicionar o -nque echose deseja cortar a nova linha de fuga.

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

Isso produzirá algo como:

/dev/bus/usb/001/011

... que, é claro, é o dispositivo. Se desejar, você pode facilmente produzir algo como busnum:001 devnum:011com alguns 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;}'`
BMiner
fonte
1

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

udevadm info -a -p /sys/bus/usb-serial/devices/ttyUSB0/
ravibhuva9955
fonte
Remova a barra à direita. Dá "syspath não encontrado".
N26