Линукс USB событие подключения / отключения - PullRequest
10 голосов
/ 19 августа 2011

Здравствуйте, я работаю на встроенном устройстве Linux с USB-портом, который использует драйвер g_ether для USB-сети.

Когда подключен USB-штекер, вывод dmesg будет:

g_ether gadget: полная скорость конфигурации # 2: RNDIS

Когда USB-кабель отключен, сообщение не записывается в dmesg.

Используя C, как я могу прослушать соединение / отключениеСобытия?

Встроенная ОС Linux не имеет никаких дополнений.Нет сценария dbus-демона или вспомогательного сценария hotplug.Я даже не уверен, что это было бы полезно.

Ответы [ 3 ]

6 голосов
/ 31 октября 2011

Если вам нужно все в одном процессе, вам придется использовать libudev для получения событий из udevd или напрямую из ядра.

Видя, что использование libudev может быть проблемой вваше приложение (отсутствие документации?), альтернативой является использование программы udevadm , которая может:

  • сообщать о событиях устройства после обработки udevd (udevadm monitor --udev --property),
  • сообщает о событиях devive непосредственно из ядра (udevadm monitor --kernel --property) и
  • создает базу данных текущих устройств udevd (но не базы данных ядра!) (udevadm info --query all --export-db)

udevadm является частью пакета udev, но не должен нуждаться в udevd, если вы используете его только для сообщения о событиях ядра.Вы можете использовать его, если ваш процесс порождает его и анализирует его стандартный вывод (но вам нужно будет запустить его с помощью stdbuf -o L).

В любом случае, возможно,быть много работы.Я уже реализовал многое из этого на своем NCD языке программирования , включая мониторинг USB-устройств.Возможно, вы захотите взглянуть на НИЗ;это полезно для многих задач настройки и хорошо справляется с горячим подключением.Например, эта программа NCD будет печатать события устройства USB на стандартный вывод:

process main {
    sys.watch_usb() watcher;
    println(watcher.event_type, " ", watcher.devname, " ", watcher.vendor_id, ":", watcher.model_id);
    watcher->nextevent();
}

Это приведет к тому, что NCD напечатает что-то подобное (с начальным событием added для любого USB-устройства, которое уже подключено):

added /dev/bus/usb/002/045 0409:0059
added /dev/bus/usb/002/046 046d:c313
added /dev/bus/usb/002/047 046d:c03e
added /dev/bus/usb/002/048 0557:2008
removed /dev/bus/usb/002/048 0557:2008

Вы также можете использовать NCD только для этого и проанализировать этот стандартный вывод - с ним гораздо проще работать, чем напрямую связываться с udevadm.

Обратите внимание, что NCD сам по себе использует udevadm, а требует для запуска udevd;но почему это проблема в любом случае?(при некоторой работе эта зависимость может быть удалена)

3 голосов
/ 23 октября 2013

Вы можете использовать libudev или анализировать udevadm вывод, как предложено @Ambroz Bizjak.Хотя я не советую добавлять дополнительный процесс (stdbuf) и язык (NCD), просто для анализа вывода udevadm.

Шаг между простым выводом libudev и синтаксическим анализом заключается в изменении исходных кодов udevadm.Это решение сокращает необходимые ресурсы и полностью пропускает процесс синтаксического анализа.Когда вы посмотрите на пакет udev, вы найдете источники udevd и udevadm в каталоге udev.

Там у вас есть основная подпрограмма в udevadm.c и источник для udevadm monitor в udevadm-monitor.c.Каждое полученное событие будет напечатано через print_device().Здесь вы можете вставить свой код.

Если у вас недостаточно памяти, вы можете удалить ненужный код для control, info, settle, test-builtin, test и trigger.В моей системе (Ubuntu 12.04) это уменьшает размер udevadm примерно на 75%.

0 голосов
/ 03 июня 2016

К сожалению, при подключении / отключении не создается событие udev, поэтому отслеживать эти события практически невозможно.
Вы можете отслеживать сообщения ядра (это кажется сумасшедшей идеей).Возможно, лучший способ - это изменить ядро.

обновление: Я не понимаю, почему этот ответ получил отрицательный рейтинг.
Может быть, некоторые люди смешивают хост-часть USB (которая генерирует события UDEV на устройствеplug / unplug) и часть USB-устройства / гаджета (которая не генерирует такие события)
Так что, если ваш Linux-компьютер работает как гаджет (USB-устройство, которое подключено к некоторому USB-хосту), нет хорошего способа поймать плагин/ отключить события.

Доказательство: сообщение Грега Кроа-Хартмана

...