Como se sugiere, puede agregar algunas reglas de udev. Edité el /etc/udev/rules.d/10-local.rules
para contener:
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="my_uart"
Puede verificar las variables de su dispositivo ejecutando
udevadm info -a -p $(udevadm info -q path -n /dev/ttyUSB0)
Hay una guía más detallada que puede leer en http://www.reactivated.net/writing_udev_rules.html
La sintaxis de la regla anterior puede funcionar en algunas distribuciones, pero no funcionó en la mía (Raspbian). Como nunca encontré un solo documento que explicara todos los entresijos, escribí el mío propio, que se encuentra aquí. Esto es a lo que se reduce.
1. averiguar qué hay en ttyUSB:
dmesg | grep ttyUSB
2. enumere todos los atributos del dispositivo:
udevadm info --name=/dev/ttyUSBx --attribute-walk
(con su(s) número(s) de dispositivo en lugar de x, por supuesto). Seleccione un conjunto de identificadores únicos, por ejemplo, idVendor + idProduct. También puede necesitar SerialNumber si tiene más de un dispositivo con el mismo idVendor e idProduct. SerialNumbers debe ser único para cada dispositivo.
3. Crea un archivo /etc/udev/rules.d/99-usb-serial.rules
con algo como esta línea:
SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name"
(asumiendo que no necesita un número de serie allí y, por supuesto, con los números de idVendor e idProduct que encontró en el paso 2.
4. Cargue la nueva regla:
sudo udevadm trigger
5. Verifique lo sucedido:
ls -l /dev/your_device_name
mostrará a qué número ttyUSB fue el enlace simbólico. Si es /dev/ttyUSB1
, luego verifique quién es el propietario y a qué grupo pertenece:
ls -l /dev/ttyUSB1
Entonces, solo por diversión:
udevadm test -a -p $(udevadm info -q path -n /dev/your_device_name)
El problema de múltiples dispositivos USB idénticos
Tengo una Rasperry Pi con cuatro cámaras. Tomo fotos con fswebcam
que identifica las cámaras como /dev/video0
.. video3
. A veces la cámara es video0
, vide02
, video4
y video6
pero podemos olvidarnos de eso por ahora.
Necesito una identificación persistente para identificar un número de cámara para que, p. video0
Siempre es la misma cámara porque subtitulo las fotos. Desafortunadamente, esto no sucede de manera confiable:en el arranque, las cámaras se enumeran como video0
..video3
pero no siempre de la misma manera.
Todas las cámaras tienen el mismo ID y número de serie.
La solución a este problema implica reglas de udev, pero también hay muchos anzuelos.
Si emite el comando
udevadm info –attribute-walk –path=/dev/video0
obtienes una regla de salida pero los bits más destacados son
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
El bit KERNELS es un puerto concentrador USB. Con cuatro cámaras, hay cuatro de estas:no cambian al reiniciar, pero el video{x}
asociado con un puerto puede cambiar.
Entonces, necesitamos una regla udev para vincular un número de video a un puerto concentrador USB, algo como:
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
Parece simple:acceda a la cámara con
fswebcam –d $realpath /dev/camera0
Excepto que no funciona:si coloca esto en una regla udev y el sistema ha asignado video0 (en el arranque) a un puerto diferente, la regla udev se ignora. El enlace simbólico a /dev/camera0
básicamente dice no such device
. Cuadrado uno.
Lo que queremos es vincular un enlace simbólico a una dirección de concentrador USB, no un video{x}
número. Tomó un programa de Python.
El primer paso fue correr
fswebcam –d /dev/video${x} tst.jpg
para x
entre 1 y 8. La existencia de tst.jpg
después de cada llamada identifica si hay una cámara en este número de video. A partir de esto, haga una lista de números de video activos. Mi experiencia ha sido que es 0,1,2,3
o 0,2,4,6
para las cámaras que he usado.
Por supuesto, otros pueden crear esta lista usando un proceso diferente.
Luego, para cada número de video en la lista, ejecute
udevadm info –attribute-walk –path=/dev/videox > dd
y extrae el KERNELS= line
de dd
. A partir de este proceso, obtendrá una lista de las direcciones de los puertos USB de las cámaras. Ordene esta lista para que en el siguiente paso, siempre la procese en el mismo orden. Llame a esto la "lista de direcciones".
Ejecute el udevadm … > dd
otra vez y haz una lista que se parezca a
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
Ahora recorra la lista de direcciones; para cada entrada, busque la entrada correspondiente en la lista de videos. Cree una nueva lista que parezca una colección de líneas como
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
La x (número de enlace simbólico) se reemplaza por el número de secuencia en la lista de direcciones.
Ahora tienes una regla udev que funciona. Un enlace simbólico que está vinculado a una dirección de concentrador USB sin importar el número de video asignado a ese puerto en el arranque.
Escribe la lista final en un archivo /etc/udev/rules.d/cam.rules
. Ejecute udevadm trigger
para activarlo y el trabajo está hecho. /dev/camera2
será la misma cámara (puerto USB) independientemente de su número de vídeo.