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 с рабочего ноутбука.