Sou um microcontrolador / cara C, por favor, fique comigo:)
Estou usando um Raspberry Pi 3 Modelo B com Ubuntu Companheiro em um dispositivo móvel, conectado a uma IMU, um GPS e dois LIDAR.
Ubuntu 16.04.2
Kernel version 4.4.38-v7+
O dispositivo inicializa depois de ligado e, em seguida, inicia os drivers e os programas para amostrar os dados. Esses programas devem ter a porta (ttyUSB * ou symlink) do dispositivo atribuído anteriormente.
Toda vez que eu inicializo, os dispositivos USB escolhem um ttyUSB aleatório * para acompanhar. Isso funciona bem para a IMU e o GPS, pois eles possuem IDs de série exclusivas, etc., no entanto, os dispositivos LIDAR usam o mesmo chip UART para USB, que são indistinguíveis uns dos outros.
lsusb :
Bus 001 Device 005: ID 0403:6014 Future Technology Devices International, Ltd FT232H Single HS USB-UART/FIFO IC
Bus 001 Device 004: ID 06c2:0033 Phidgets Inc. (formerly GLAB)
Bus 001 Device 007: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Bus 001 Device 006: ID 10c4:ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB light
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. SMC9514 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Eu tentei comparar as informações do dispositivo para ver como elas poderiam ser diferenciadas.
diff <(udevadm info --name /dev/ttyUSB1) <(udevadm info --name /dev/ttyUSB2)
1,2c1,2
- P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB1/tty/ttyUSB1
- N: ttyUSB1
---
+ P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB2/tty/ttyUSB2
+ N: ttyUSB2
4,7c4,7
- S: serial/by-path/platform-3f980000.usb-usb-0:1.2:1.0-port0
- E: DEVLINKS=/dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0 /dev/serial/by-path/platform-3f980000.usb-usb-0:1.2:1.0-port0
- E: DEVNAME=/dev/ttyUSB1
- E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB1/tty/ttyUSB1
---
+ S: serial/by-path/platform-3f980000.usb-usb-0:1.3:1.0-port0
+ E: DEVLINKS=/dev/serial/by-path/platform-3f980000.usb-usb-0:1.3:1.0-port0 /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0
+ E: DEVNAME=/dev/ttyUSB2
+ E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB2/tty/ttyUSB2
14,15c14,15
- E: ID_PATH=platform-3f980000.usb-usb-0:1.2:1.0
- E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_2_1_0
---
+ E: ID_PATH=platform-3f980000.usb-usb-0:1.3:1.0
+ E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_3_1_0
28c28
- E: MINOR=1
---
+ E: MINOR=2
31c31
- E: USEC_INITIALIZED=4706121921
---
+ E: USEC_INITIALIZED=4706424041
O que eu gostaria de fazer neste estágio é atribuir um nome persistente a cada porta USB física no Raspberry Pi para que, desde que os dispositivos estejam conectados no soquete correto, funcione. Eu tentei muitas regras sem sucesso. Muitas combinações de:
KERNEL=="ttyUSB*",KERNELS=="1-1.2",NAME="ttyUSB0",MODE="0666"
KERNEL=="ttyUSB*",KERNELS=="1-1.2:1.0",NAME="ttyUSB0",MODE="0666"
KERNEL=="ttyUSB*",KERNELS=="1-1.3",NAME="ttyUSB1",MODE="0666"
KERNEL=="ttyUSB*",KERNELS=="1-1.3:1.0",NAME="ttyUSB1",MODE="0666"
KERNEL=="ttyUSB*",KERNELS=="1-1.5",NAME="ttyUSB2",MODE="0666"
KERNEL=="ttyUSB*",KERNELS=="1-1.5:1.0",NAME="ttyUSB2",MODE="0666"
como recomendado aqui; link
Nas informações do udevadm, a única outra diferença parecia ser o atributo MINOR, mas ainda não descobri como usar essas informações. Meu melhor palpite até agora é:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{Minor}=="1", SYMLINK+="rplidar1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", ATTRS{Minor}=="2", SYMLINK+="rplidar2"
mas isso não parece funcionar também (eu tentei MINOR e menor também). Eu fiquei sem ideias, e eu realmente aprecio alguma ajuda.