Открыть сервисСервис

Evdev

evdev — это подсистема ядра Linux, обеспечивающая универсальный интерфейс для доступа к устройствам ввода (клавиатуры, мыши, джойстики, сенсорные панели, тачскрины, кнопки, переключатели и другие аналогичные периферийные устройства). evdev реализован в виде набора драйверов и файлов устройств, расположенных в файловой системе /dev/input/, и предоставляет прикладным программам единый способ получения событий ввода без необходимости напрямую взаимодействовать с аппаратными протоколами (PS/2, USB, Bluetooth и др.). Подсистема входит в состав стандартного ядра Linux начиная с версии 2.0 (конец 1990-х годов) и является основным механизмом ввода для большинства современных графических окружений (GNOME, KDE, Xfce) и игр, работающих под управлением Linux.

История

Разработка evdev началась примерно в 1999 году в рамках проекта ядра Linux как часть общей модернизации подсистемы ввода. До появления evdev основным способом взаимодействия с клавиатурой и мышью в Linux было использование устаревшего интерфейса console (через /dev/tty и /dev/psaux), который был привязан к текстовой консоли и не поддерживал одновременную работу нескольких графических серверов. Толчком к созданию evdev послужила необходимость в более гибком и абстрактном API для развивающегося мультимедийного и настольного Linux. В 2002–2004 годах подсистема была существенно доработана: добавлены поддержка кнопок питания и громкости, а также возможность работы с несколькими одновременными нажатиями (multi-touch). Окончательное становление evdev как стандарта де-факто произошло с выходом X.Org Server 7.0 (2006 год), где драйвер evdev заменил ранее использовавшийся kbd и mouse. В последующие годы evdev интегрировали в libinput (с 2015 года) и в вытесняющую X11 графическую архитектуру Wayland.

Устройство и принцип работы

Архитектура

evdev работает на уровне ядра Linux и состоит из двух основных частей:

  • Драйверы устройств — модули ядра, отвечающие за взаимодействие с конкретными аппаратными протоколами (USB HID, PS/2, I²C, Bluetooth). Каждый драйвер регистрирует устройство в подсистеме evdev, сообщая о поддерживаемых типах событий (клавиши, оси, кнопки мыши, тачпад, потенциометр и др.).
  • Файл устройства — после регистрации в /dev/input/ появляется файл с именем eventN (где N — порядковый номер), например /dev/input/event0. Этот файл представляет собой символьное устройство, доступное для чтения и (в некоторых случаях) записи из пространства пользователя.

Прикладная программа (например, X.Org Server, Wayland compositor, игра) открывает нужный файл /dev/input/eventX, читает из него структурированные данные и обрабатывает события.

Формат событий

Каждое физическое действие (нажатие клавиши, движение мыши, касание сенсора) преобразуется драйвером в структуру input_event, определённую в <linux/input.h>. Структура содержит:

  • timestamp (struct timeval) — время события с точностью до микросекунд;
  • type — категория события (EV_KEY — кнопка/клавиша, EV_ABS — абсолютная ось (сенсорный экран, стилус), EV_REL — относительная ось (мышь), EV_SYN — синхронизация группы событий);
  • code — код конкретного действия или оси (например, KEY_ENTER, BTN_LEFT, ABS_X, ABS_MT_POSITION_X);
  • value — значение события: для клавиш 1 (нажатие), 0 (отпускание), 2 (автоповтор); для осей — целое число (координата, угол, сила нажатия).

События объединяются в пакеты с помощью события типа EV_SYN с кодом SYN_REPORT. Программа, читающая файл устройства, ожидает полный набор событий до получения SYN_REPORT, после чего обрабатывает их как атомарное действие.

Мультитач и сложные устройства

evdev поддерживает протокол multi-touch (MT) для сенсорных экранов, тачпадов и сенсорных панелей, позволяя одновременно обрабатывать до нескольких десятков точек касания. Для каждой точки используются отдельные события с типом EV_ABS и специальными кодами ABS_MT_*. Поддержка MT реализована в ядре начиная с версии 2.6.30 (2009 год). Также evdev обрабатывает давление, наклон стилуса, жесты (скролл двумя пальцами) и вращение колёсика мыши.

Использование в пользовательском пространстве

Подсистема libinput

С середины 2010-х годов основным пользовательским драйвером ввода в Linux стал libinput — библиотека, работающая поверх evdev. Она берёт на себя высокоуровневую обработку событий: распознавание жестов, настройку ускорения указателя, калибровку сенсорного экрана и конфигурирование тачпадов. libinput взаимодействует с файлами /dev/input/eventX напрямую и предоставляет Shape-API для композиторов Wayland и X.Org Server. Графические среды GNOME, KDE Plasma, Enlightenment и большинство драйверов X.Org (в версиях старше 2015 года) используют libinput как бэкенд.

Программы для отладки

Для диагностики работы evdev применяются утилиты:

  • evtest — читает события с любого устройства /dev/input/eventX и выводит их в удобочитаемом виде (тип, код, значение);
  • evhz — измеряет частоту опроса мыши;
  • input-utils — позволяет просматривать список зарегистрированных устройств и их свойства.

Преимущества и недостатки

Преимущества

  • Универсальность — одноразовая поддержка evdev в приложении позволяет работать с любыми устройствами ввода Linux без дополнительной настройки.
  • Низкая задержка — прямой доступ к файлу устройства сокращает число промежуточных слоёв.
  • Расширяемость — поддержка новых кнопок, осей и протоколов добавляется драйвером ядра без изменения пользовательского API.
  • Мультитач — возможность обрабатывать несколько одновременных касаний, что важно для современных сенсорных экранов.

Недостатки

  • Специфичность API — прикладным программам необходимо знать код нужной клавиши (например, KEY_A), что требует использования заголовочных файлов ядра.
  • Необходимость прав доступа — для чтения /dev/input/event* требуется либо права суперпользователя, либо нахождение пользователя в группе input.
  • Высокий уровень детализации — обработка потоков пустых событий (например, при движении мыши) может привести к избыточной нагрузке на CPU, если не использовать механизмы синхронизации (libinput решает эту проблему).

Примеры применения

  • Игры — многие игровые движки (например, Godot, Unity, Source 2) используют evdev для получения сырых событий от клавиатуры, мыши и геймпадов, минуя высокоуровневые библиотеки.
  • Специализированные устройства — производственные пульты, медицинская техника, POS-терминалы и киоски работают через evdev.
  • Встраиваемые системы — на платформах Raspberry Pi, BeagleBone и других одноплатных компьютерах evdev применяется для считывания кнопок, датчиков и сенсорных панелей.
  • Автоматизация — скрипты и боты могут имитировать нажатия клавиш через файл /dev/input/eventX (с правами root) с помощью утилиты evemu.

Связанные проекты

  • uinput — подсистема, позволяющая создавать виртуальные устройства ввода, реализованные на основе evdev. Используется для эмуляции ввода (например, виртуальные джойстики) или автоматизации тестирования.
  • libevdev — библиотека-обёртка над evdev, предоставляющая более удобный C API по сравнению с прямым чтением /dev/input/eventX.
  • xinput — утилита X.Org для настройки устройств ввода, взаимодействующая с evdev через X-драйвер xf86-input-evdev (устарел, заменён libinput).

Интересные факты

  • Название evdev является сокращением от «event device» (устройство событий).
  • В банковских терминалах и кассах, работающих на Linux, evdev часто является единственным способом ввода, так как позволяет точно привязать каждую клавишу физической клавиатуры к определённой функции.
  • Протокол evdev не поддерживает аппаратно-зависимые расширения (HID quirks), специфичные для некоторых игровых клавиатур и мышей — они реализуются в драйверах ядра, а не в пользовательских приложениях.

Источники

  • Документация ядра Linux: Documentation/input/input.rst
  • man 4 evdev — страница руководства Linux
  • Исходный код ядра Linux, подсистема input
  • Документация проекта libinput (wayland.freedesktop.org/libinput)
  • Статья «Evdev — The Universal Input Interface» в журнале Linux Journal (вып. 2012 г.)
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru