
У меня есть мост National Instruments USB<->GPIB. Это плата USB, для которой требуется специальная процедура, чтобы ее можно было использовать. У меня установлен пакет linux_gpib, который предоставляет два модуля ядра: gpib_common
и ni_usb_gpib
. Кроме того, gpib_config
инструмент должен быть запущен до того, как я смогу общаться с любым инструментом на шине GPIB. Хитрость в том, что плате требуется около 2 секунд после подключения к USB для внутренней инициализации, прежде чем gpib_config
команда вступит в силу. Итак, у меня есть следующее 99-gpib.rules
правило udev, которое идеально справляется с этой задачей:
SUBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="3923", ATTR{idProduct}=="709b", RUN+="/bin/sh -c '/usr/bin/sleep 2; /usr/sbin/gpib_config --minor 0'"
KERNEL=="gpib[0-9]*", MODE="0660", GROUP="gpib"
Проблема в том, что это работает только если я подключаю плату, когда хост-система запущена и работает. Когда я перезагружаюсь с подключенным донглом, я вижу, что оба модуля ядра загружены, но плата не может использоваться, что означает, что этот gpib_config
инструмент не был запущен. Если я запускаю его вручную, он работает отлично.
Поскольку сценарий перезагрузки более реален, чем подключение во время работы системы, мне нужен правильный способ заставить udev сделать это при загрузке. Конечно, я могу написать какой-нибудь скрипт инициализации, который будет проверять, подключена ли плата и загружены ли модули ядра, и запускать инструмент во время процесса загрузки, но это работа udev, потому что он как-то связан с оборудованием, я думаю. Есть идеи?
решение1
Проблема в udev, который выполняет RUN-файлы.досоответствующие модули загружаются, поэтому gpib_config
не удается настроить плату. Обходной путь — загрузка модулей до запуска udev при загрузке системы. Не настоящее решение, я думаю.