puertos - ver usb en linux
¿Cómo saber qué dispositivo USB-RS232 está en qué tty? (3)
Tengo dos dispositivos USB diferentes basados en los mismos chips USB-RS232. Cuando los conecto al USB, están montados en /dev/ttyUSB0...3
Mi problema es cómo, dentro de un script, puedo averiguar cuál está en qué tty?
Usando lsusb puedo diferenciarlos:
$> lsusb | grep 0403:f850
Bus 004 Device 002: ID 0403:f850 Future Technology Devices International, Ltd
$> lsusb | grep 0403:6001
Bus 004 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC
Y usando dmesg puedo decir dónde fueron montados:
$> dmesg | grep ''FTDI USB Serial Device converter now attached''
[36051.393350] usb 4-2: FTDI USB Serial Device converter now attached to ttyUSB1
[36061.823513] usb 4-1: FTDI USB Serial Device converter now attached to ttyUSB0
Pero "usb 4-1" no parece corresponder con "Bus 004 Device 002".
¿Puedo suponer que "Bus 004 Device 001" siempre será un "concentrador de raíz USB" y, por lo tanto, dmesg contará desde 1 en adelante y lsusb desde 2 en adelante?
¿O tiene otra sugerencia sobre cómo correlacionar la identificación del dispositivo con el punto de montaje (dentro de un script)?
Estoy usando Ubuntu 10.04 LTS.
Encuentra más información usando sysfs:
$ ls /sys/bus/usb-serial/devices/ -ltrah
lrwxrwxrwx 1 root root 0 2012-02-07 22:17 ttyUSB0 -> ../../../devices/pci0000:00/0000:00:0f.4/usb2/2-2/2-2:1.0/ttyUSB0
$ ls -ltrad /sys//devices/pci0000:00/0000:00:0f.4/usb2/2-2/2-2:1.0/ttyUSB0
drwxr-xr-x 4 root root 0 2012-02-07 22:17 /sys//devices/pci0000:00/0000:00:0f.4/usb2/2-2/2-2:1.0/ttyUSB0
$ ls -ltrad /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 0 2012-02-01 00:17 /dev/ttyUSB0
Por supuesto, el nodo de dispositivos enlazados / ... contiene mucha información.
Agregando información basada en el comentario del OP:
El número de dispositivo sigue creciendo si se eliminan / insertan dispositivos. lsusb -t
se puede usar para correlacionar los números de dispositivo con el bus / puerto usb.
Luego, ''lsusb -d devID'' puede determinar qué dispositivo está en qué puerto. Finalmente, ''ls / sys / bus / usb-serial / devices / -ltrah'' listará (por bus / puerto) donde se montó.
No es muy conveniente, pero '' funciona ''
Esta regla de udev de una sola línea proporcionará un nombre fijo (por ejemplo, / dev / ttyUSB_A9YL5BJJ) basado en el número de serie para cualquier dispositivo con ID de proveedor / producto como se indica.
Ponga esto en un archivo de reglas de udev, por ejemplo, /etc/udev/rules.d/60-ftdi-serial-names.rules
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ENV{ID_SERIAL_SHORT}=="?*", SYMLINK+="ttyUSB_%E{ID_SERIAL_SHORT}"
Puede usar udev para asignar un enlace simbólico estable a cada dongle FTDI. Use el dispositivo y el proveedor para que coincida con el tipo y luego el número de serie para el dispositivo específico. Luego use el enlace simbólico en el script.
Nombré a mis dongles ttyFTDI0, etc., y escribí los números en los dongles con un marcador:
$ cat /etc/udev/ftdi.rules SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDEN97D", SYMLINK+="ttyFTDI0" SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A600b30P", SYMLINK+="ttyFTDI1" SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A600bexU", SYMLINK+="ttyFTDI2" SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTFMSA54", SYMLINK+="ttyFTDI3" SUBSYSTEMS=="usb", KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTFMUW4A", SYMLINK+="ttyFTDI4"