Aporte

Ícono HAL de entrada de Android

El subsistema de entrada de Android consta nominalmente 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ísica produce señales que describen cambios de estado, como pulsaciones de teclas y puntos de contacto táctiles. El firmware del dispositivo codifica y transmite estas señales de alguna manera, como enviar informes USB HID al sistema o producir interrupciones en un bus I2C.

Luego, las señales son decodificadas por un controlador de dispositivo en el kernel de Linux. El kernel de Linux proporciona controladores para muchos periféricos estándar, en particular aquellos que se adhieren al protocolo HID. Sin embargo, un OEM a menudo debe proporcionar controladores personalizados para dispositivos integrados que están estrechamente integrados en el sistema a un nivel bajo, como las pantallas táctiles.

Los controladores de dispositivos de entrada son responsables de traducir las señales específicas del dispositivo a un formato de evento de entrada estándar, mediante el 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 al abrir el controlador evdev asociado con cada dispositivo de entrada. Luego, el componente InputReader de Android decodifica los eventos de entrada de acuerdo con la clase de dispositivo y produce una secuencia de eventos de entrada de Android. Como parte de este proceso, los códigos de eventos del protocolo de entrada de Linux se traducen a códigos de eventos de Android de acuerdo con la configuración del dispositivo de entrada, los archivos de distribución del teclado y varias tablas de mapeo.

Finalmente, 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 ejercen control sobre el comportamiento del dispositivo de entrada.

Configuración de controladores y firmware

Los controladores de dispositivos de entrada configuran con frecuencia el comportamiento del dispositivo de entrada configurando parámetros en registros o incluso cargando el propio firmware. Este es particularmente el caso de los dispositivos integrados, como las pantallas táctiles, donde 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 del módulo en el paquete de soporte de la placa del kernel (BSP) para que el mismo controlador pueda admitir múltiples implementaciones de hardware diferentes.

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

Propiedades de configuración de la placa

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

Consulte 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 mediante superposiciones de recursos en config.xml , como la operación del interruptor de la tapa.

Aquí están algunos ejemplos:

  • config_lidKeyboardAccessibility : especifica el efecto del interruptor de la tapa sobre si el teclado de hardware está accesible u oculto.

  • config_lidNavigationAccessibility : especifica el efecto del interruptor de la tapa sobre si el trackpad está accesible u 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.

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

Mapas clave

Los mapas de teclas son utilizados por los componentes Android EventHub e InputReader para configurar el mapeo 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.

Consulte las secciones de clase de dispositivo para obtener detalles sobre cómo los diferentes dispositivos usan mapas de teclas.

Archivos de configuración de dispositivos de entrada

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

Consulte las secciones de clases de dispositivos para obtener detalles sobre cómo los diferentes dispositivos utilizan mapas de configuración de dispositivos de entrada.

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

A menudo, se utilizan varios identificadores diferentes para referirse a cualquier tecla determinada en un teclado, botón en un controlador de juego, eje de joystick u otro control. Las relaciones entre estos identificadores no siempre son las mismas: dependen de un conjunto de tablas de mapeo, algunas de las cuales son fijas y otras varían según las características del dispositivo, el controlador del dispositivo, la ubicación actual, la configuración del sistema, 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 está asociado con cada tecla, botón u otro control. Debido a que los códigos de escaneo físicos a menudo varían de un dispositivo a otro, el firmware o el controlador del dispositivo es responsable de asignarlos a identificadores estándar, como usos de HID o códigos clave de Linux.

Los códigos de escaneo son de interés principalmente para los teclados. Otros dispositivos normalmente se comunican a bajo nivel mediante pines GPIO, mensajes I2C u otros medios. En consecuencia, las capas superiores de la pila de software se basan en los controladores de dispositivos para dar sentido a lo que está sucediendo.

Uso HID

Un uso de HID es un identificador estándar que se utiliza para informar el estado de un control, como una tecla del teclado, el eje del joystick, el botón del mouse o el 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 manera uniforme.

Android Framework se basa en los controladores HID del kernel de Linux para traducir los códigos de uso de HID en códigos clave 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 clave de Linux

Un código de tecla de Linux es un identificador estándar para una tecla o botón. Los códigos clave de Linux se definen en el archivo de encabezado linux/input.h usando 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 escaneo físicos, los usos de HID y otras señales específicas del dispositivo en códigos clave de Linux y entregar información sobre ellos como parte de los eventos EV_KEY .

La API de Android a veces se refiere 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 clave de Linux de los códigos clave 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 sobre 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 usando 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 otras señales específicas del dispositivo en códigos de eje de Linux y entregar información sobre ellos como parte de los eventos EV_REL y EV_ABS .

Código de cambio 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 tapa. Los códigos de cambio de Linux se definen en el archivo de encabezado linux/input.h usando 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 .

Las aplicaciones de Android generalmente no reciben eventos de los interruptores, pero el sistema puede usarlos internamente para controlar varias funciones específicas del dispositivo.

Código clave de Android

Un código de clave de Android es un identificador estándar definido en la API de Android para indicar una clave en particular, como 'INICIO'. Los códigos clave de Android están definidos por la clase android.view.KeyEvent 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 de teclado, el idioma, el país, el diseño o las funciones especiales.

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

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. Los códigos de eje de Android están definidos por la clase android.view.MotionEvent 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.

Metaestado de Android

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

El metaestado actual está determinado por el componente InputReader de Android, que supervisa cuándo se presionan o sueltan teclas modificadoras como KEYCODE_SHIFT_LEFT y establece o restablece el marcador de metaestado correspondiente.

La relación entre las teclas modificadoras y los metaestados está codificada, pero el diseño de las 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

El estado de un botón de Android es un identificador estándar definido en la API de Android para indicar qué botones (en un mouse o lápiz óptico) se presionan. Los estados de los botones de Android están definidos por la clase android.view.MotionEvent como constantes que comienzan con el prefijo BUTTON_ .

El estado actual del botón está determinado por el componente InputReader de Android, que supervisa cuándo se presionan o sueltan los botones (en un mouse o lápiz óptico) y establece o restablece el indicador de estado del botón apropiado.

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

Otras lecturas

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