Вход

Значок Android Input HAL

Подсистема ввода Android номинально состоит из конвейера событий, который проходит через несколько уровней системы.

Входной конвейер

На самом нижнем уровне физическое устройство ввода генерирует сигналы, описывающие изменения состояния, такие как нажатия клавиш и точки касания. Прошивка устройства каким-то образом кодирует и передает эти сигналы, например, отправляя отчеты USB HID в систему или создавая прерывания на шине I2C.

Затем сигналы декодируются драйвером устройства в ядре Linux. Ядро Linux предоставляет драйверы для многих стандартных периферийных устройств, особенно тех, которые поддерживают протокол HID. Тем не менее, OEM-производитель часто должен предоставлять специальные драйверы для встраиваемых устройств, которые тесно интегрированы в систему на низком уровне, таких как сенсорные экраны.

Драйверы устройств ввода отвечают за преобразование сигналов, специфичных для устройства, в стандартный формат событий ввода посредством протокола ввода Linux. Протокол ввода Linux определяет стандартный набор типов и кодов событий в заголовочном файле ядра linux/input.h . Таким образом, компонентам вне ядра не нужно заботиться о таких деталях, как коды физического сканирования, использование HID, сообщения I2C, выводы GPIO и т.п.

Затем компонент Android EventHub считывает события ввода из ядра, открывая драйвер evdev , связанный с каждым устройством ввода. Затем компонент Android InputReader декодирует события ввода в соответствии с классом устройства и создает поток событий ввода Android. В рамках этого процесса коды событий протокола ввода Linux преобразуются в коды событий Android в соответствии с конфигурацией устройства ввода, файлами раскладки клавиатуры и различными таблицами сопоставления.

Наконец, InputReader отправляет события ввода в InputDispatcher, который перенаправляет их в соответствующее окно.

Контрольные точки

Во входном конвейере есть несколько этапов, которые осуществляют контроль над поведением устройства ввода.

Конфигурация драйвера и прошивки

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

Параметры конфигурации драйвера часто указываются как параметры модуля в пакете поддержки платы ядра (BSP), поэтому один и тот же драйвер может поддерживать несколько различных аппаратных реализаций.

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

Свойства конфигурации платы

Пакет поддержки платы ядра (BSP) может экспортировать свойства конфигурации платы через SysFS, которые используются компонентом Android InputReader, например размещение виртуальных клавиш на сенсорном экране.

Подробную информацию о том, как разные устройства используют свойства конфигурации платы, см. в разделах, посвященных классам устройств.

Наложения ресурсов

Несколько режимов ввода настраиваются с помощью наложений ресурсов в config.xml , таких как операция переключателя крышки.

Вот несколько примеров:

  • config_lidKeyboardAccessibility : определяет влияние переключателя крышки на то, доступна ли аппаратная клавиатура или скрыта.

  • config_lidNavigationAccessibility : определяет влияние переключателя крышки на доступность или скрытие трекпада.

  • config_longPressOnPowerBehavior : указывает, что должно происходить, когда пользователь удерживает кнопку питания.

  • config_lidOpenRotation : определяет влияние переключателя крышки на ориентацию экрана.

Обратитесь к документации в frameworks/base/core/res/res/values/config.xml для получения подробной информации о каждом параметре конфигурации.

Ключевые карты

Сопоставления клавиш используются компонентами Android EventHub и InputReader для настройки сопоставления кодов событий Linux с кодами событий Android для клавиш, кнопок джойстика и осей джойстика. Отображение может зависеть от устройства или языка.

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

Файлы конфигурации устройства ввода

Файлы конфигурации устройства ввода используются компонентами Android EventHub и InputReader для настройки специальных характеристик устройства, таких как то, как сообщается информация о размере касания.

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

Понимание использования HID и кодов событий

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

Код физического сканирования

Физический код сканирования — это идентификатор устройства, связанный с каждой клавишей, кнопкой или другим элементом управления. Поскольку физические коды сканирования часто различаются от одного устройства к другому, прошивка или драйвер устройства отвечают за их сопоставление со стандартными идентификаторами, такими как HID Usages или коды клавиш Linux.

Коды сканирования в основном представляют интерес для клавиатур. Другие устройства обычно обмениваются данными на низком уровне, используя контакты GPIO, сообщения I2C или другие средства. Следовательно, верхние уровни программного стека полагаются на драйверы устройств, чтобы понять, что происходит.

Использование HID

Использование HID — это стандартный идентификатор, который используется для сообщения о состоянии элемента управления, такого как клавиша клавиатуры, ось джойстика, кнопка мыши или точка касания. Большинство устройств ввода USB и Bluetooth соответствуют спецификации HID, что позволяет системе взаимодействовать с ними унифицированным образом.

Android Framework использует драйверы HID ядра Linux для преобразования кодов использования HID в коды клавиш Linux и другие идентификаторы. Поэтому использование HID в основном представляет интерес для производителей периферийных устройств.

Код ключа Linux

Код клавиши Linux — это стандартный идентификатор клавиши или кнопки. Коды клавиш Linux определяются в заголовочном файле linux/input.h с использованием констант, начинающихся с префикса KEY_ или BTN_ . Драйверы ввода ядра Linux отвечают за преобразование физических кодов сканирования, использования HID и других сигналов, специфичных для устройства, в коды клавиш Linux и предоставление информации о них как часть событий EV_KEY .

Android API иногда ссылается на код ключа Linux, связанный с ключом, как на его «код сканирования». Это технически неверно, но помогает отличить коды ключей Linux от кодов ключей Android в API.

Относительный или абсолютный код оси Linux

Относительный или абсолютный код оси Linux — это стандартный идентификатор для сообщения об относительных перемещениях или абсолютных позициях вдоль оси, таких как относительные перемещения мыши по оси X или абсолютное положение джойстика по оси X. Код оси Linux определяется в заголовочном файле linux/input.h с использованием констант, начинающихся с префикса REL_ или ABS_ . Драйверы ввода ядра Linux отвечают за преобразование использования HID и других сигналов, специфичных для устройства, в коды осей Linux и предоставление информации о них как часть событий EV_REL и EV_ABS .

Код переключения Linux

Код переключателя Linux — это стандартный идентификатор для сообщения о состоянии переключателя на устройстве, например переключателя крышки. Коды переключателей Linux определяются в заголовочном файле linux/input.h с использованием констант, начинающихся с префикса SW_ . Драйверы ввода ядра Linux сообщают об изменении состояния переключателя как события EV_SW .

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

Код ключа Android

Код ключа Android – это стандартный идентификатор, определенный в Android API для указания конкретного ключа, например "HOME". Коды клавиш Android определяются классом android.view.KeyEvent как константы, начинающиеся с префикса KEYCODE_ .

Раскладка клавиш определяет, как коды клавиш Linux сопоставляются с кодами клавиш Android. В зависимости от модели клавиатуры, языка, страны, раскладки или специальных функций могут использоваться различные раскладки клавиш.

Комбинации кодов клавиш Android преобразуются в коды символов с помощью карты ключевых символов устройства и локали. Например, когда одновременно нажимаются клавиши, обозначенные как KEYCODE_SHIFT и KEYCODE_A , система ищет комбинацию в карте символов клавиш и находит заглавную букву «A», которая затем вставляется в текстовый виджет, находящийся в данный момент в фокусе.

Код оси Android

Код оси Android — это стандартный идентификатор, определенный в Android API для указания конкретной оси устройства. Коды осей Android определяются классом android.view.MotionEvent как константы, начинающиеся с префикса AXIS_ .

Раскладка клавиш определяет, как коды осей Linux сопоставляются с кодами осей Android. В зависимости от модели устройства, языка, страны, раскладки или специальных функций могут использоваться различные раскладки клавиш.

Метасостояние Android

Метасостояние Android — это стандартный идентификатор, определенный в API Android для указания того, какие клавиши-модификаторы нажаты. Метасостояния Android определяются классом android.view.KeyEvent как константы, начинающиеся с префикса META_ .

Текущее мета-состояние определяется компонентом Android InputReader, который отслеживает нажатие/отпускание клавиш-модификаторов, таких как KEYCODE_SHIFT_LEFT , и устанавливает/сбрасывает соответствующий флаг мета-состояния.

Связь между клавишами-модификаторами и метасостояниями жестко закодирована, но расположение клавиш может изменить способ сопоставления самих клавиш-модификаторов, что, в свою очередь, влияет на метасостояния.

Состояние кнопки Android

Состояние кнопки Android — это стандартный идентификатор, определенный в Android API для указания того, какие кнопки (на мыши или стилусе) нажаты. Состояния кнопок Android определяются классом android.view.MotionEvent как константы, начинающиеся с префикса BUTTON_ .

Текущее состояние кнопки определяется компонентом Android InputReader, который отслеживает нажатие/отпускание кнопок (на мыши или стилусе) и устанавливает/сбрасывает соответствующий флаг состояния кнопки.

Связь между кнопками и состояниями кнопок жестко запрограммирована.

Дальнейшее чтение

  1. Коды событий ввода Linux
  2. Мультисенсорный протокол Linux
  3. Драйверы ввода Linux
  4. принудительная обратная связь Linux
  5. Информация HID, включая таблицы использования HID