Устойчивые имена для физических портов USB

Я парень-микроконтроллер / C, поэтому, пожалуйста, несите меня 🙂

Я использую модель малины Pi 3 B с Ubuntu Mate на мобильном устройстве, подключенном к IMU, GPS и двум LIDAR.

Ubuntu 16.04.2
Версия ядра 4.4.38-v7 +

Устройство загружается после включения, затем запускает драйверы и программы для выборки данных. Эти программы должны иметь порт (ttyUSB * или символическую ссылку) устройства, назначенного заранее.

Каждый раз, когда я загружаюсь, устройства USB выбирают случайный ttyUSB *, чтобы идти. Это отлично подходит для IMU и GPS, поскольку у них уникальные идентификаторы серий и т. Д. Однако устройства LIDAR используют один и тот же UART-чип USB, который неотличим друг от друга.

lsusb :

Bus 001 Устройство 005: ID 0403: 6014 Future Technology Devices International, Ltd FT232H Single HS USB-UART / FIFO IC
Автобус 001 Устройство 004: ID 06c2: 0033 Phidgets Inc. (ранее GLAB)
Bus 001 Устройство 007: ID 10c4: ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB свет
Bus 001 Устройство 006: ID 10c4: ea60 Cygnal Integrated Products, Inc. CP210x UART Bridge / myAVR mySmartUSB свет
Bus 001 Устройство 003: ID 0424: ec00 Standard Microsystems Corp. SMSC9512 / 9514 Адаптер Fast Ethernet
Шина 001 Устройство 002: ID 0424: 9514 Стандартный микросистемный процессор SMC9514 Hub
Шина 001 Устройство 001: ID 1d6b: 0002 Корневой концентратор Linux Foundation 2.0

Я попытался сравнить информацию о устройстве, чтобы посмотреть, как они могут быть дифференцированы.

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 = платформа-3f980000.usb-usb-0: 1.2: 1.0
– E: ID_PATH_TAG = платформа-3f980000_usb-usb-0_1_2_1_0

+ E: ID_PATH = платформа-3f980000.usb-usb-0: 1.3: 1.0
+ E: ID_PATH_TAG = платформа-3f980000_usb-usb-0_1_3_1_0

28c28
– E: MINOR = 1

+ E: MINOR = 2

31c31
– E: USEC_INITIALIZED = 4706121921

+ E: USEC_INITIALIZED = 4706424041

То, что я хотел бы сделать на этом этапе, – назначить постоянное имя для каждого физического USB-порта на Raspberry Pi, чтобы до тех пор, пока устройства подключены к правильному сокету, он будет работать. Я пробовал много правил без успеха. Многие комбинации:

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 * », СЕМЕЧЕК == "1-1.5: 1.0", NAME = "ttyUSB2", MODE = "0666"

как рекомендовано здесь; https://askubuntu.com/questions/49910/how-to-distinguish-between-identical-usb-to-serial-adapters

Из информации udevadm единственная другая разница, по-видимому, была атрибутом MINOR, но я не понял, как использовать эту информацию. До сих пор я догадываюсь:

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"

но это тоже не работает (я тоже пробовал MINOR и немного). У меня закончились идеи, и я бы очень признателен за помощь.

Я нашел решение. Следующие правила назначают символическую ссылку на соответствующие порты USB для данного устройства. Вероятно, вы могли бы избавиться от условий idVendor и idProduct.

SUBSYSTEM == "tty", KERNELS == "1-1.2", ATTRS {idVendor} == "10c4", ATTRS {idProduct} == "ea60", SYMLINK + = "rplidar1"
SUBSYSTEM == "tty", KERNELS == "1-1.3", ATTRS {idVendor} == "10c4", ATTRS {idProduct} == "ea60", SYMLINK + = "rplidar2"