Ввод

Значок Android-ввода 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 или коды клавиш 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 .

API Android иногда называет код ключа 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 — это стандартный идентификатор, определенный в API Android для обозначения определенного ключа, например «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 — это стандартный идентификатор, определенный в API Android для указания того, какие кнопки (на мыши или стилусе) нажаты. Состояния кнопок Android определяются классом android.view.MotionEvent как константы, начинающиеся с префикса BUTTON_ .

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

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

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

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