Entrada

Ícono de HAL de entrada de Android

El subsistema de entrada de Android consta, de forma nominal, de una canalización de eventos que atraviesa varias capas del sistema.

Canalización de entrada

En la capa más baja, el dispositivo de entrada físico produce indicadores que describen cambios de estado, como la presión de teclas y los puntos de contacto táctiles. El firmware del dispositivo codifica y transmite estas señales de alguna manera, por ejemplo, enviando informes HID USB al sistema o generando interrupciones en un bus I2C.

Luego, un controlador de dispositivo en el kernel de Linux decodifica los indicadores. El kernel de Linux proporciona controladores para muchos periféricos estándar, principalmente aquellos que cumplen con el protocolo HID. Sin embargo, a menudo, un OEM debe proporcionar controladores personalizados para dispositivos integrados que están integrados de forma estrecha en el sistema a bajo nivel, como las pantallas táctiles.

Los controladores de dispositivos de entrada son responsables de traducir los indicadores específicos del dispositivo a un formato de evento de entrada estándar a través del protocolo de entrada de Linux. El protocolo de entrada de Linux define un conjunto estándar de tipos de eventos y códigos en el archivo de encabezado del kernel linux/input.h. De esta manera, los componentes fuera del kernel no necesitan preocuparse por los detalles, como los códigos de escaneo físicos, los usos de HID, los mensajes I2C, los pines GPIO y similares.

A continuación, el componente EventHub de Android lee los eventos de entrada del kernel abriendo el controlador evdev asociado con cada dispositivo de entrada. Luego, el componente InputReader de Android decodifica los eventos de entrada según la clase del dispositivo y produce una transmisión de eventos de entrada de Android. Como parte de este proceso, los códigos de eventos del protocolo de entrada de Linux se traducen en códigos de eventos de Android según la configuración del dispositivo de entrada, los archivos de diseño del teclado y varias tablas de asignación.

Por último, InputReader envía eventos de entrada a InputDispatcher, que los reenvía a la ventana adecuada.

Puntos de control

Hay varias etapas en la canalización de entrada que afectan el control sobre el comportamiento del dispositivo de entrada.

Configuración del controlador y el firmware

Los controladores de dispositivos de entrada suelen configurar el comportamiento del dispositivo de entrada estableciendo parámetros en los registros o incluso subiendo el firmware. Esto es particularmente cierto en el caso de los dispositivos integrados, como las pantallas táctiles, en las que una gran parte del proceso de calibración implica ajustar estos parámetros o corregir el firmware para proporcionar la precisión y la capacidad de respuesta deseadas, y suprimir el ruido.

Las opciones de configuración del controlador a menudo se especifican como parámetros de módulo en el paquete de compatibilidad de la placa del kernel (BSP) para que el mismo controlador pueda admitir varias implementaciones de hardware diferentes.

En esta documentación, se intenta describir la configuración del controlador o el firmware, pero se ofrece orientación sobre la calibración del dispositivo en general.

Propiedades de configuración de la pizarra

El paquete de compatibilidad de la placa del kernel (BSP) puede exportar propiedades de configuración de la placa a través de SysFS que usa el componente InputReader de Android, como la ubicación de teclas virtuales en una pantalla táctil.

Consulta las secciones de clase de dispositivo para obtener detalles sobre cómo los diferentes dispositivos usan las propiedades de configuración de la placa.

Superposiciones de recursos

Algunos comportamientos de entrada se configuran a través de superposiciones de recursos en config.xml, como el funcionamiento del interruptor de la tapa.

Estos son algunos ejemplos:

  • config_lidKeyboardAccessibility: Especifica el efecto del interruptor de la tapa en si se puede acceder al teclado en hardware o si está oculto.

  • config_lidNavigationAccessibility: Especifica el efecto del interruptor de la tapa en si se puede acceder al panel táctil o si está oculto.

  • config_longPressOnPowerBehavior: Especifica lo que debe suceder cuando el usuario mantiene presionado el botón de encendido.

  • config_lidOpenRotation: Especifica el efecto del interruptor de la tapa en la orientación de la pantalla.

Consulta la documentación de frameworks/base/core/res/res/values/config.xml para obtener detalles sobre cada opción de configuración.

Mapas de teclas

Los componentes EventHub y InputReader de Android usan mapas de teclas para configurar la asignación de códigos de eventos de Linux a códigos de eventos de Android para teclas, botones de joystick y ejes de joystick. La asignación puede depender del dispositivo o del idioma.

Consulta las secciones de las clases de dispositivos para obtener detalles sobre cómo los diferentes dispositivos usan los mapas de teclas.

Archivos de configuración de dispositivos de entrada

Los componentes EventHub y InputReader de Android usan los archivos de configuración de dispositivos de entrada para configurar características especiales del dispositivo, como la forma en que se informa la información del tamaño táctil.

Consulta las secciones de clase de dispositivo para obtener detalles sobre cómo los diferentes dispositivos usan mapas de configuración de dispositivos de entrada.

Comprende los usos y los códigos de eventos de HID

A menudo, se usan varios identificadores diferentes para hacer referencia a cualquier tecla de un teclado, botón de un control de juego, eje de joystick o algún otro control. Las relaciones entre estos identificadores no siempre son las mismas: dependen de un conjunto de tablas de asignación, algunas de las cuales son fijas y otras varían según las características del dispositivo, el controlador de dispositivo, la configuración regional actual, la configuración del sistema, las preferencias del usuario y otros factores.

Código de escaneo físico

Un código de escaneo físico es un identificador específico del dispositivo que se asocia con cada tecla, botón o cualquier otro control. Debido a que los códigos de escaneo físicos suelen variar de un dispositivo a otro, el firmware o el controlador del dispositivo es responsable de asignarlos a identificadores estándar, como los usos de HID o los códigos de teclas de Linux.

Los códigos de escaneo son de interés principalmente para los teclados. Por lo general, otros dispositivos se comunican a bajo nivel con pines GPIO, mensajes I2C o algún otro medio. En consecuencia, las capas superiores de la pila de software dependen de los controladores de dispositivos para comprender lo que sucede.

Uso de HID

Un uso de HID es un identificador estándar que se usa para informar el estado de un control, como una tecla del teclado, un eje de joystick, un botón del mouse o un punto de contacto táctil. La mayoría de los dispositivos de entrada USB y Bluetooth cumplen con la especificación HID, lo que permite que el sistema interactúe con ellos de forma uniforme.

El framework de Android se basa en los controladores HID del kernel de Linux para traducir los códigos de uso de HID en códigos de teclas de Linux y otros identificadores. Por lo tanto, los usos de HID son de interés principalmente para los fabricantes de periféricos.

Código de teclas de Linux

Un código de tecla de Linux es un identificador estándar para una tecla o un botón. Los códigos de teclas de Linux se definen en el archivo de encabezado linux/input.h con constantes que comienzan con el prefijo KEY_ o BTN_. Los controladores de entrada del kernel de Linux son responsables de traducir los códigos de análisis físicos, los usos de HID y otros indicadores específicos del dispositivo en códigos de teclas de Linux y de proporcionar información sobre ellos como parte de los eventos EV_KEY.

A veces, la API de Android hace referencia al código de clave de Linux asociado con una clave como su "código de escaneo". Esto es técnicamente incorrecto, pero ayuda a distinguir los códigos de teclas de Linux de los códigos de teclas de Android en la API.

Código de eje relativo o absoluto de Linux

Un código de eje relativo o absoluto de Linux es un identificador estándar para informar movimientos relativos o posiciones absolutas a lo largo de un eje, como los movimientos relativos de un mouse a lo largo de su eje X o la posición absoluta de un joystick a lo largo de su eje X. El código de eje de Linux se define en el archivo de encabezado linux/input.h con constantes que comienzan con el prefijo REL_ o ABS_. Los controladores de entrada del kernel de Linux son responsables de traducir los usos de HID y otros indicadores específicos del dispositivo en códigos de ejes de Linux y de proporcionar información sobre ellos como parte de los eventos EV_REL y EV_ABS.

Código de interruptor de Linux

Un código de interruptor de Linux es un identificador estándar para informar el estado de un interruptor en un dispositivo, como un interruptor de la tapa. Los códigos de interruptor de Linux se definen en el archivo de encabezado linux/input.h con constantes que comienzan con el prefijo SW_. Los controladores de entrada del kernel de Linux informan los cambios de estado del interruptor como eventos EV_SW.

Por lo general, las aplicaciones para Android no reciben eventos de los interruptores, pero el sistema puede usarlos de forma interna para controlar varias funciones específicas del dispositivo.

Código de clave de Android

Un código de tecla de Android es un identificador estándar definido en la API de Android para indicar una tecla en particular, como "HOME". La clase android.view.KeyEvent define los códigos de teclas de Android como constantes que comienzan con el prefijo KEYCODE_.

El diseño de teclas especifica cómo se asignan los códigos de teclas de Linux a los códigos de teclas de Android. Se pueden usar diferentes diseños de teclas según el modelo, el idioma, el país, el diseño o las funciones especiales del teclado.

Las combinaciones de códigos de teclas de Android se transforman en códigos de caracteres con un mapa de caracteres de teclas específico del dispositivo y la configuración regional. Por ejemplo, cuando se presionan las teclas identificadas como KEYCODE_SHIFT y KEYCODE_A, el sistema busca la combinación en el mapa de caracteres de teclas y encuentra la letra mayúscula "A", que luego se inserta en el widget de texto enfocado actualmente.

Código de eje de Android

Un código de eje de Android es un identificador estándar definido en la API de Android para indicar un eje de dispositivo en particular. La clase android.view.MotionEvent define los códigos de eje de Android como constantes que comienzan con el prefijo AXIS_.

El diseño de teclas especifica cómo se asignan los códigos de eje de Linux a los códigos de eje de Android. Se pueden usar diferentes diseños de teclas según el modelo del dispositivo, el idioma, el país, el diseño o las funciones especiales.

Estado de meta de Android

Un metaestado de Android es un identificador estándar definido en la API de Android para indicar qué teclas modificadoras se presionan. La clase android.view.KeyEvent define los metaestados de Android como constantes que comienzan con el prefijo META_.

El componente Android InputReader determina el estado meta actual, que supervisa cuándo se presionan o sueltan teclas modificadoras, como KEYCODE_SHIFT_LEFT, y establece o restablece la marca de estado meta adecuada.

La relación entre las teclas modificadoras y los metaestados está codificada, pero el diseño de teclas puede alterar la forma en que se asignan las teclas modificadoras, lo que, a su vez, afecta los metaestados.

Estado del botón de Android

Un estado de botón de Android es un identificador estándar definido en la API de Android para indicar qué botones (en un mouse o una pluma stylus) se presionan. La clase android.view.MotionEvent define los estados de los botones de Android como constantes que comienzan con el prefijo BUTTON_.

El componente Android InputReader determina el estado actual del botón, que supervisa cuándo se presionan o sueltan los botones (en un mouse o una pluma stylus) y establece o restablece la marca de estado del botón adecuada.

La relación entre los botones y los estados de los botones está codificada.

Lecturas adicionales

  1. Códigos de eventos de entrada de Linux
  2. Protocolo multitáctil de Linux
  3. Controladores de entrada de Linux
  4. Retroalimentación de fuerza en Linux
  5. Información de HID, incluidas las tablas de uso de HID