udev для лабораторного стола: порядок в /dev/ttyUSB*
На столе пять программаторов, два логических анализатора и три USB-UART. Каждый раз после перезагрузки ноутбука /dev/ttyUSB0 оказывался не тем, чем вчера. Привёл в порядок одним файлом правил udev.
Найти, чем устройства отличаются
udevadm info -a -n /dev/ttyUSB0 | grep -E 'idVendor|idProduct|serial'
У приличных адаптеров есть серийный номер. У дешёвых CH340 его нет, и различать их приходится по порту хаба — то есть по физическому разъёму. Поэтому дешёвые адаптеры у меня всегда втыкаются в одни и те же порты, подписанные маркером.
Правила
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{serial}=="FT6XK2QA", SYMLINK+="uart-rs485"
SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", KERNELS=="1-2.3", SYMLINK+="uart-bench"
SUBSYSTEM=="usb", ATTRS{idVendor}=="1366", MODE="0660", GROUP="plugdev"
Теперь в скриптах и в minicom только /dev/uart-rs485 и /dev/uart-bench. Последняя строка — права для J-Link без sudo.
Применить без перезагрузки
sudo udevadm control --reload
sudo udevadm trigger
И отдельно про ModemManager: если он установлен, он открывает каждый новый ttyACM и шлёт туда AT-команды. Для платы, которая в этот момент грузится через bootloader по UART, это выглядит как мусор на линии. Правило ENV{ID_MM_DEVICE_IGNORE}="1" для своих устройств или просто удалить ModemManager с рабочего ноутбука.