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 г.)
