Правило udev для Linux для загрузки модуля гаджета для драйвера клиента.

Вопрос или проблема

Мне сложно автоматизировать загрузку модуля гаджета и включение устройства usb0 как сетевого интерфейса eth. Интерфейс, о котором идет речь, это g_ether для встроенного устройства Linux и подключения к ПК.

Я предполагаю, что существует способ увидеть событие от плагина и выполнить скрипт с помощью udev. Когда я подключаю свое устройство к ПК, я не вижу никаких событий. Я пробовал различные варианты udevadm monitor, и я не уверен, как определить, что я могу использовать в качестве правила udev для загрузки модуля гаджета через modprobe.

Частично я пытаюсь загрузить модуль otg, потому что мы в основном используем g_ether. Я хочу использовать avahi-autoipd, но он получает IP-адрес до того, как устройство подключено. Если я использую allow-hotplug в сетевом интерфейсе, он никогда автоматически не поднимает интерфейс при подключении. Так теоретически я хочу подключить устройство к ПК, запустить avahi-autoipd на новом сетевом интерфейсе, чтобы получить IP, и dhcpd, чтобы выдать его хосту.

Поскольку кто-то еще начал помогать мне на StackOverflow (перепост здесь), я получил больше информации.

/sys/bus/usb/devices$ ls
1-0:1.0  2-0:1.0  3-0:1.0  3-1  3-1:1.0  usb1  usb2  usb3
[ 4297.515400] g_ether gadget: high speed config #2: RNDIS
[ 4300.379021] g_ether gadget: high speed config #1: CDC Ethernet (ECM)
sys/bus/usb/devices$ ls
1-0:1.0  2-0:1.0  3-0:1.0  3-1  3-1:1.0  usb1  usb2  usb3

Я попробовал запустить

   udevadm monitor --environment
   udevadm monitor --environment --udev 
   udevadm monitor
   udevadm monitor --kernel
   udevadm monitor --kernel --udev

отключение и подключение устройства не показывает ничего. В manpage сказано, что он “слушает ядровые uevents и события, отправленные правилом udev”, и у меня нет правил на моем устройстве. Так что я предполагаю, это, вероятно, причина, почему ничего никогда не выводится, даже если я пытаюсь что-то сделать с другим оборудованием?

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

Мне стало известно, что может быть проблема с моим модулем g_ether? Эти выводы никогда не меняются.
cat /sys/class/net/usb0/carrier
cat: ошибка чтения: Неверный аргумент
cat /sys/class/net/usb0/operstate
down

Специфические для USB переменные для uevent установлены в функции ядра usb_uevent. Вы можете отслеживать вызывается эта функция или нет.

Ответ или решение

Вопрос о создании udev-правил для автоматической загрузки модуля gadget и поднятия интерфейса usb0 в качестве сетевого интерфейса является интересной задачей в контексте встроенных систем на базе Linux. Давайте подробно рассмотрим, как это можно реализовать, учитывая все нюансы и потенциальные трудности.

Теоретические основы

Во-первых, стоит понять, как работает udev в Linux. Udev — это система управляющая устройствами для ядра Linux, которая создает и удаляет устройства в директории /dev. Она отвечает за запуск определенных действий при появлении или исчезновении устройств, основываясь на uevent (событиях ядра) и правилах, определенных в системных конфигурациях.

Когда устройство подключается к системе, ядро генерирует uevent, который обычно обнаруживается udev. На основе этого uevent можно настроить правило, которое будет выполнять необходимые действия, такие как загрузка модуля ядра с помощью modprobe.

Пример и реализация

В вашем случае, задача состоит в том, чтобы определить, когда устройство с интерфейсом g_ether подключается, и установить его как сетевой интерфейс. Чтобы добиться этого, выполните следующие шаги:

  1. Определение uevent-события:

    Включите мониторинг событий ядра с помощью udevadm monitor для изучения того, какие uevent генерируются при подключении вашего устройства:

    udevadm monitor --kernel --udev --property

    Выполните подключение и отключение вашего USB-устройства и наблюдайте за выводом. Вы должны увидеть uevent-события, которые связаны с вашим устройством USB. Если вы не видите события, возможно, проблема кроется в конфигурации вашей встроенной системы или в отсутствии поддержки данного USB-модуля в ядре.

  2. Создание udev-правила:

    Чтобы автоматизировать загрузку модуля, создайте файл в /etc/udev/rules.d/. Например, 99-usb-gadget.rules со следующим содержимым. Обратите внимание, что вам нужно заменить ATTRS{idVendor} и ATTRS{idProduct} на реальные значения вашего устройства. Их можно найти в выводе предыдущего шага:

    ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", ATTR{idProduct}=="yyyy", RUN+="/sbin/modprobe g_ether"

    В этом правиле мы указываем, что должна происходить загрузка модуля g_ether при добавлении устройства с заданными идентификаторами производителей и продуктов.

  3. Загрузка модуля ядра и поднятие интерфейса:

    После срабатывания правила и загрузки модуля g_ether, система должна автоматически определить usb0 как сетевой интерфейс. Вы можете добавить дополнительные правила для автоматической настройки интерфейса, например, используя ifconfig или ip для присвоения IP-адреса.

  4. Настройка службы:

    Для автоматизации процесса получения IP-адреса и его предоставления используйте демон Avahi и dhcpd. Убедитесь, что Avahi установлен и правильно настроен для работы с интерфесом usb0.

  5. Проверка и отладка:

    Проверьте содержимое /sys/class/net/usb0/ для диагностики проблем. Команды cat /sys/class/net/usb0/carrier и cat /sys/class/net/usb0/operstate могут помочь выявить, активен ли интерфейс.

Применение

Эти шаги помогут вам добиться автоматизации загрузки и конфигурации USB-гаджета на встроенном устройстве Linux. Важно провести тщательное тестирование в вашем конкретном окружении, так как встроенные системы могут иметь ограничения в зависимости от ядра и аппаратного обеспечения.

Если отладка все еще не помогает выявить проблему, проверьте наличие необходимых модулей ядра и поддержку USB на уровне аппаратного обеспечения вашего устройства. Возможна ситуация, когда конкретная аппаратная платформа не имеет полной поддержки необходимых функций в текущем ядре.

Эти подходы и примеры должны предоставить достаточно информации для успешной реализации автоматизации загрузки модуля гаджета и настройки сети, однако, они могут потребовать адаптации под специфические условия вашей системы.

Оцените материал
Добавить комментарий

Капча загружается...