Google is committed to advancing racial equity for Black communities. See how.
Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Entrada

Icono de entrada de Android HAL

El subsistema de entrada de Android consiste nominalmente en una canalización de eventos que atraviesa múltiples 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 enviando informes USB HID al sistema o produciendo 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, particularmente 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 del dispositivo 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 tales como códigos de escaneo físicos, usos de HID, mensajes I2C, pines GPIO y similares.

A continuación, el componente EventHub Android lee los eventos de entrada del kernel abriendo el controlador evdev asociado con cada dispositivo de entrada. Luego, el componente Android InputReader decodifica los eventos de entrada de acuerdo con la clase de dispositivo y produce un flujo 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 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 al InputDispatcher que los reenvía a la ventana apropiada.

Puntos de control

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

Configuración de controlador y firmware

Los controladores de dispositivos de entrada configuran con frecuencia el comportamiento del dispositivo de entrada estableciendo parámetros en registros o incluso cargando el firmware en sí. 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 arreglar el firmware para proporcionar la precisión y capacidad de respuesta deseadas y para suprimir el ruido.

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

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

Propiedades de configuración de la placa

El paquete de soporte de la placa del núcleo (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 las teclas virtuales en una pantalla táctil.

Consulte las secciones de clase de dispositivo para obtener detalles sobre cómo los diferentes dispositivos utilizan 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 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 componentes de Android EventHub y InputReader utilizan mapas de teclas 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. El mapeo puede depender del dispositivo o del idioma.

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

Archivos de configuración del dispositivo de entrada

Los componentes de Android EventHub y InputReader utilizan los archivos de configuración del dispositivo de entrada 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 usan los mapas de configuración de dispositivos de entrada.

Comprensión de los usos y códigos de eventos de HID

A menudo, se utilizan varios identificadores diferentes para hacer referencia 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 son siempre 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 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 usando pines GPIO, mensajes I2C u otros medios. En consecuencia, las capas superiores de la pila de software dependen de los controladores del dispositivo para comprender lo que está sucediendo.

Uso 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, 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 clave de Linux es un identificador estándar para una clave o botón. Los códigos de clave de Linux se definen en el archivo de encabezado linux/input.h utilizando constantes que comienzan con el prefijo KEY_ o BTN_ . Los controladores de entrada del kernel de Linux son responsables de traducir códigos de escaneo físicos, usos de HID y otras señales específicas del dispositivo en códigos de 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 la 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 absoluto o relativo de Linux

Un código de eje absoluto o relativo 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 utilizando 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 conmutador 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 conmutador de Linux se definen en el archivo de encabezado linux/input.h utilizando constantes que comienzan con el prefijo SW_ . Los controladores de entrada del kernel de Linux informan los cambios de estado del conmutador como eventos EV_SW .

Las aplicaciones de Android generalmente no reciben eventos de conmutadores, pero el sistema puede usarlas 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 de 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 utilizar diferentes distribuciones de teclas según el modelo de teclado, el idioma, el país, la distribución o las funciones especiales.

Las combinaciones de códigos clave de Android se transforman en códigos de caracteres mediante un dispositivo y un mapa de caracteres clave específico de la localidad. 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.

Meta Estado 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 meta estados 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 monitorea cuando se presionan / sueltan las teclas modificadoras como KEYCODE_SHIFT_LEFT y establece / restablece el indicador de metaestado apropiado.

La relación entre las teclas modificadoras y los meta estados está codificada, pero el diseño de las teclas puede alterar cómo se asignan las teclas modificadoras, lo que a su vez afecta a los meta estados.

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 lápiz) 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 monitorea cuándo se presionan / sueltan los botones (en un mouse o lápiz) y establece / 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 evento de entrada de Linux
  2. Protocolo multitáctil de Linux
  3. Controladores de entrada de Linux
  4. Force Feedback de Linux
  5. Información de HID, incluidas las tablas de uso de HID