Вопрос или проблема
До ядра 6.8 путь к драйверу для фиксированных последовательных портов (ttySxx) разрешался к /sys/bus/platform/drivers/serial8250, и простая проверка, что имя было “serial8250“, была достаточной для определения, является ли устройство фиксированным или съемным (USB) – если имя драйвера не было “serial8250“, то можно было предположить, что это (а) съемное устройство и (б) нет необходимости в дальнейшей проверке, чтобы убедиться, что это настоящее устройство (т.е. не просто заполнитель).
Это использовалось в решении для проверки портов, предложенном Сореном Холмом здесь:
https://stackoverflow.com/questions/2530096/how-to-find-all-serial-devices-ttys-ttyusb-on-linux-without-opening-them
Я использовал паскальский перевод кода Сорена в своем программном обеспечении в течение нескольких лет без каких-либо проблем или жалоб.
Но начиная с ядра 6.8 (Ubuntu 24.04LTS) путь к драйверу изменился. Теперь он разрешается к /sys/bus/serial-base/drivers/port, и имя “port” слишком общее, чтобы использовать его в качестве основы для принятия решений – ядро 6.8 ломает код Сорена. Пока я не смог найти никакой полезной информации в интернете о данном изменении в ядре.
Мой вопрос: с ядром 6.8 и позднее, есть ли какой-либо надежный альтернативный способ проверки, чтобы определить, связан ли последовательный порт с тем, что было драйвером “serial8250“? Есть ли эксперты, которые знают об изменениях в драйверах последовательных портов, почему они были сделаны, и обходных путях для последствий?
С наилучшими пожеланиями,
Роб 🙂
Ответ или решение
Изменения в названии драйвера последовательного порта в ядре 6.8 и позднее
С выходом ядра Linux 6.8, которое поставляется с Ubuntu 24.04 LTS, произошли значительные изменения в механизме работы с последовательными портами. В частности, путь к драйверу для фиксированных последовательных портов (ttySxx) был изменен с /sys/bus/platform/drivers/serial8250
на /sys/bus/serial-base/drivers/port
. Это изменение создало определенные трудности для разработчиков, которые использовали предыдущую логику для определения типа последовательного устройства, так как название нового драйвера — "port" — слишком общее, чтобы служить надежным критерием для этого.
Причины изменения
Изменения, внесенные в ядро, направлены на улучшение общей архитектуры системы, что позволяет более гибко управлять различными типами последовательных интерфейсов. Данный подход также способствует более единообразному управлению устройствами, включая интеграцию новых технологий и расширяемость функционала.
Альтернативные способы идентификации драйвера
Для определения, связано ли устройство последовательного порта с драйвером serial8250
, можно использовать несколько альтернативных подходов:
-
Проверка на уровне устройств: Используйте команду
dmesg | grep -i serial
для получения журналов сообщений ядра, которые могут обеспечить информацию о том, какой именно драйвер инициализировался для конкретного устройства. Можно фильтровать вывод по имени устройства, чтобы сосредоточиться на интересующих портах. -
Файлы и атрибуты устройств: В каталоге
/sys/class/tty
можно найти символические ссылки на tty устройства. Каждое tty устройство имеет подкаталог, который может содержать атрибуты, такие какdriver
, что может указать на драйвер, используемый для управления портом. -
Использование
udevadm
: Запустите командуudevadm info --query=all --name=/dev/ttyS0
(или другой tty), чтобы получить полную информацию об устройстве. В выводе ищите строку, указывающую на драйвер. Если этоserial8250
, значит, устройство действительно связано с данным драйвером. -
Обработка событий udev: Возможно, имеет смысл настроить правила udev, чтобы при подключении устройства осуществлялась автоматическая передача информации через системные логи или скрипты.
Заключение
Понимание изменений в реализации драйверов последовательных портов в ядре 6.8 и более поздних версиях требует немного больше усилий, однако альтернативные методы определения типа устройства могут помочь в сохранении функциональности вашего ПО. Постоянный анализ и использование новых возможностей, предлагаемых ядром, позволят создать более надежные и адаптивные системы управления устройствами.
Если вам необходимы дальнейшие детали или помощь в адаптации вашего кода, не стесняйтесь обращаться к специалистам сообществу разработчиков Linux. Сотрудничество и обмен знаниями могут значительно упрощать процесс адаптации к новым реалиям.