2011-01-25 28 views
8

Estoy leyendo datos de múltiples adaptadores de serie USB idénticos en Ubuntu 10.1.Cómo identificar múltiples adaptadores de serie USB en Ubuntu 10.1

En ocasiones, sus cambios de ruta/dev/tty (por ejemplo, si otros dispositivos USB están conectados al inicio).

Necesito una forma de referirme repetidamente al mismo adaptador a través de dichos cambios.

Todos los dispositivos tienen los mismos números de serie, de acuerdo con udevadm.

Creo que la opción más probable es identificar un adaptador por qué puerto está conectado (no se mueven).

Puedo encontrar todo tipo de rutas interesantes/dev que funcionen, pero a pesar de toda la discusión sobre udev en línea, no puedo encontrar una declaración definitiva sobre si algunas de estas rutas son estáticas si el dispositivo está conectado a un puerto estático

+1

He encontrado esta respuesta superusuario muy útil: http://superuser.com/a/536648/27510 – ergosys

Respuesta

-1

Los dispositivos todos tienen los mismos números de serie [..]

Las direcciones usb-parse-devpath.pm esto mediante el uso del autobús e identificador de puerto del adaptador.

9

Hay una solución. Es mejor tarde que nunca;)

Utilice la siguiente regla udev para asignar dispositivos /dev/ttyUSB{?} en el enlace /dev/usb-ports/%bus_id-%port_id.

Aquí es mi /etc/udev/rules.d/usb-parse-devpath.rules:

ACTION=="add", KERNEL=="ttyUSB[0-9]*", PROGRAM="/etc/udev/rules.d/usb-parse-devpath.pm %p", SYMLINK+="usb-ports/%c" 

Y el guión usb-parse-devpath.pm:

#!/usr/bin/perl -w 

@items = split("/", $ARGV[0]); 
for ($i = 0; $i < @items; $i++) { 
    if ($items[$i] =~ m/^usb[0-9]+$/) { 
     print $items[$i + 1] . "\n"; 
     last; 
    } 
} 

Como se puede ver que esto nos ayuda a crear enlaces con nombre para /dev/ttyUSB{?} dispositivos y colocarlos en /dev/usb-ports en el siguiente formato : bus_id-port_id.

$ udevadm info --query=path --name=/dev/ttyUSB0 
/devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/ttyUSB0/tty/ttyUSB0 

Así, el bus_id es 3 y port_id es 1 y ahora han siguiente en mi /dev/usb-ports::

$ ls -al /dev/usb-ports 
lrwxrwxrwx 1 root root 10 Май 12 00:26 3-1 -> ../ttyUSB0 

Saludos

Por ejemplo, el siguiente comando de mí Esta da.

+2

he encontrado que el cambio de elementos de impresión $ [$ i + 1] a print $ items [$ i + 2] es más útil aquí; ya que ambos puertos USB en la parte frontal de mi computadora parecían mapear a '1-1' debajo de la primera! –

+0

@JamesMuscat: Gracias por su respuesta. –

+0

¡Hablemos de la sobreingeniería! 'ACTION ==" add ", KERNEL ==" ttyUSB [0-9] * ", SYMLINK + =" usb-ports/tty-% s {../ busnum} -% s {../ devpath} "' hace la misma cosa. –

1

Al igual que la respuesta de Ilya Matvejchikov, una buena solución es agregar reglas de udev para hacer lo que quiera con el dispositivo. Al igual que usted, estaba teniendo un problema similar. Tenía un UPS en un adaptador USB-a-serie múltiple y ocasionalmente el sistema cambiaba los números/dev/tty.

Mi solución fue crear una regla para que coincida con el tipo de dispositivo por el controlador y el puerto, y luego crear un enlace simbólico al puerto al que estaba conectado mi UPS. Usé NUT para monitorear el UPS, que siempre estaba conectado al mismo puerto físico.

# File contents of /etc/udev/rules.d/75-nut-ups.rules 
# Create /dev/nut-ups0 to use as a persistent serial device that can be used 
# reliably by nut to communicate with a UPS attached to the system. 
# The UPS is attached to the first port of a MosSemiconductor dual USB 
# serial adapter. 
KERNELS=="ttyUSB*", SUBSYSTEMS=="usb-serial", DRIVERS=="moschip7720", ATTRS{port_number}=="0", SYMLINK+="nut-ups0" 

Ahora configure NUT utilizar siempre un/dev/tuerca-ups0 constante, como el puerto serie y el Estado se encarga de mapeo correctamente cuando se reconoce el dispositivo USB-serie.

Puede utilizar el comando lsusb para averiguar el nombre real del dispositivo a utilizar en la regla cuando está enchufado.

2

Look con $ udevadm info -n /dev/ttyUSB0 -a qué puerto del dispositivo USB está enchufado. Los núcleos variables de una de las los dispositivos principales deben ser algo así como KERNELS == "1-1.2: 1.0".

crear una regla udev:

SUBSYSTEM=="tty", KERNELS=="1-1.2:1.0", SYMLINK+="ttyUSB42" 
SUBSYSTEM=="tty", KERNELS=="1-1.3:1.0", SYMLINK+="usb-serial" 

y el gatillo udev

$ udevadm trigger 
0

USB-dispositivos se puede obtener el número de puerto y la enumeración de bus/dev.

0

Yo también estaba buscando en este tema una forma de encontrar qué dispositivo físico USB fue asignado/conectado a un nombre de dispositivo lógico/dev. Así que, después de algún ensayo y error, esto es lo que ha funcionado mejor para mí:

Ver lo que existen dispositivos lógicos ttyUSBx (donde x es 0, 1, 2 ...):

$ ls /dev 

Mostrar autobús y números de dispositivos para todos los adaptadores USB-serie:

$ lsusb 

por último, el uso:

$ udevadm info --name=ttyUSBx --attribute-walk | grep num 

Ahora inspeccione la salida udevadm para hacer coincidir el nombre del dispositivo lógico con el dispositivo físico real. Aquí mi lista cuando lo hice:

$ lsusb 
Bus 002 Device 005: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial  (UART) IC 
Bus 002 Device 004: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port 
Bus 002 Device 002: ID 80ee:0021 
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub 

$ udevadm info --name=ttyUSB0 --attribute-walk | grep num 
    ATTRS{port_number}=="0" 
    ATTRS{urbnum}=="812" 
    ATTRS{busnum}=="2" 
    ATTRS{devnum}=="5" 
    ATTRS{urbnum}=="115" 
    ATTRS{busnum}=="2" 
    ATTRS{devnum}=="1" 
    ATTRS{numa_node}=="-1" 

$ udevadm info --name=ttyUSB1 --attribute-walk | grep num 
    ATTRS{port_number}=="0" 
    ATTRS{urbnum}=="465" 
    ATTRS{busnum}=="2" 
    ATTRS{devnum}=="4" 
    ATTRS{urbnum}=="115" 
    ATTRS{busnum}=="2" 
    ATTRS{devnum}=="1" 
    ATTRS{numa_node}=="-1" 

Por lo tanto, en mi caso, ttyUSB0 está asociado con el dispositivo de bus2, device5, que es el USB Dispositivos de tecnología futura Internacional al adaptador de serie; y del mismo modo, ttyUSB1 está asociado con el dispositivo en bus2, dispositivo4, que es el adaptador USB a serie de Prolific Technology, Inc..

Y como se ha señalado, el comando:

$ usb-devices 

le conseguirá la misma información en forma de una línea. Yo pensé que había puesto los detalles que me ayudaron a aprender cómo las cosas trabajó detrás de las escenas ...

la esperanza de que era muy útil :)

1

Tengo muchos dispositivos USB a serie con cada muchos puertos y las soluciones mencionadas anteriormente no lo hicieron por mí.

El USB "KERNEL" no fue suficiente en mi caso, pero encontré el número de puerto.

Soy consciente de que lo que estoy proponiendo ahora podría ser considerado como un truco loco, pero funciona para mí ..
por ahora ..

De hecho, me complace ver una sugerencia más elegante que lograr algo similar ..

Así ... Con base en el formulario de respuesta anterior Ilya Matveychikov

del archivo:/etc/udev/rules .d/usb-parse-devpath.sh

#!/bin/bash 

DEVNUM=$(echo "${1}" | rev | cut -d'/' -f4 | rev | tr -d '-' | tr -d '.' | tr -d ':') 
PORTNUM=$(/sbin/udevadm info -a --path=${1} | grep "ATTRS{port_number}" | head -1 | cut -d'"' -f2) 
PRODUCT=$(/sbin/udevadm info -a --path=${1} | grep "ATTRS{product}" | head -1 | cut -d'"' -f2 | tr -d '/' | tr ' ' '_') 

NEWID="ttyUSB_${PRODUCT}_${DEVNUM}${PORTNUM}" 

#echo "${NEWID} :: $1" >> /tmp/DEBUG_udev.txt 

echo "$NEWID" 

Y archivo: /etc/udev/rules.d/99-usb-serial.rules

ACTION=="add", KERNEL=="ttyUSB[0-9]*", PROGRAM="/etc/udev/rules.d/usb-parse-devpath.sh %p", SYMLINK+="TTYUSBs/%c" 

El resultado ser algo como esto:

# ls -l /dev/TTYUSBs 

lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_435100 -> ../ttyUSB20 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_435101 -> ../ttyUSB21 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_435102 -> ../ttyUSB22 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_435103 -> ../ttyUSB23 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_435104 -> ../ttyUSB24 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_435105 -> ../ttyUSB25 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_435106 -> ../ttyUSB26 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_435107 -> ../ttyUSB27 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_436100 -> ../ttyUSB28 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_436101 -> ../ttyUSB29 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_436102 -> ../ttyUSB30 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_436103 -> ../ttyUSB31 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_436104 -> ../ttyUSB32 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_436105 -> ../ttyUSB33 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_436106 -> ../ttyUSB34 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport416_436107 -> ../ttyUSB35 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport4_4341100 -> ../ttyUSB38 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport4_4341101 -> ../ttyUSB39 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport4_4342100 -> ../ttyUSB36 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport4_4342101 -> ../ttyUSB37 
lrwxrwxrwx. 1 root root 10 Jan 5 18:46 ttyUSB_Edgeport8_421100 -> ../ttyUSB2 
lrwxrwxrwx. 1 root root 10 Jan 5 18:46 ttyUSB_Edgeport8_421101 -> ../ttyUSB3 
lrwxrwxrwx. 1 root root 10 Jan 5 18:46 ttyUSB_Edgeport8_422100 -> ../ttyUSB4 
lrwxrwxrwx. 1 root root 10 Jan 5 18:46 ttyUSB_Edgeport8_422101 -> ../ttyUSB5 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport8_423100 -> ../ttyUSB18 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Edgeport8_423101 -> ../ttyUSB19 
lrwxrwxrwx. 1 root root 10 Jan 5 18:46 ttyUSB_Edgeport8_424100 -> ../ttyUSB0 
lrwxrwxrwx. 1 root root 10 Jan 5 18:46 ttyUSB_Edgeport8_424101 -> ../ttyUSB1 
lrwxrwxrwx. 1 root root 10 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_431100 -> ../ttyUSB6 
lrwxrwxrwx. 1 root root 10 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_431101 -> ../ttyUSB7 
lrwxrwxrwx. 1 root root 10 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_431102 -> ../ttyUSB8 
lrwxrwxrwx. 1 root root 10 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_431103 -> ../ttyUSB9 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_0 -> ../ttyUSB10 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_1 -> ../ttyUSB11 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_2 -> ../ttyUSB12 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_3 -> ../ttyUSB13 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_433100 -> ../ttyUSB14 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_433101 -> ../ttyUSB15 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_433102 -> ../ttyUSB16 
lrwxrwxrwx. 1 root root 11 Jan 5 18:46 ttyUSB_Keyspan_USA-49WG_433103 -> ../ttyUSB17 
Cuestiones relacionadas