HAL de sensores AIDL

La capa de abstracción de hardware de sensores (HAL) es la interfaz entre los un marco de trabajo de sensores de Android y los sensores de un dispositivo, como un acelerómetro o giroscopio. La HAL de sensores define las funciones que deben implementarse para permiten que el framework controle los sensores.

La HAL de sensores AIDL está disponible en Android 13 y más alto para dispositivos nuevos y actualizados. La HAL del AIDL de sensores, que se basa en La HAL de sensores 2.1 usa la la interfaz de la HAL del AIDL y expone el monitor de cabeza y los tipos de sensores IMU de eje limitado.

Interfaz de la HAL del AIDL

La principal fuente de documentación de la HAL del AIDL de sensores se encuentra en la HAL definición en hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl.

Implementa la HAL del AIDL de sensores

Para implementar la HAL del AIDL de sensores, un objeto debe extender el ISensors e implementar todas las funciones definidas en hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl.

Cómo inicializar la HAL

El framework del sensor de Android debe inicializar la HAL de sensores antes de un modelo de AA. El framework llama a la función initialize() para proporcionar tres parámetros a la HAL de sensores: dos descriptores de FMQ y un puntero a una ISensorsCallback.

La HAL usa el primer descriptor para crear el evento FMQ que se usa para escribir el sensor eventos al framework. La HAL usa el segundo descriptor para crear la alerta de activación Bloqueo de FMQ que se usa para sincronizar cuando la HAL libera el bloqueo de activación para WAKE_UP de sensores. La HAL debe guardar un puntero en el objeto ISensorsCallback para que que se pueden invocar las funciones de devolución de llamada necesarias.

La función initialize() debe ser la primera a la que se llama durante la inicialización la HAL de sensores.

Cómo exponer los sensores disponibles

Para obtener una lista de todos los sensores estáticos disponibles en el dispositivo, usa el función getSensorsList(). Esta función muestra una lista de sensores, cada uno que se identifica de forma única por su identificador. El controlador de un sensor determinado no debe cambiar cuando se reinicia el proceso que aloja la HAL de sensores. Los identificadores pueden cambiar y entre reinicios del servidor del sistema.

Si varios sensores comparten el mismo tipo de sensor y propiedad de activación, la primer sensor de la lista se llama sensor predeterminado y se devuelve al apps que usan getDefaultSensor(int sensorType, bool wakeUp) .

Estabilidad de la lista de sensores

Después de que se reinicia la HAL de sensores, si los datos devueltos por getSensorsList() indica un cambio significativo en comparación con la lista de sensores recuperada antes del reiniciar, el framework activa un reinicio de la Tiempo de ejecución de Android Los cambios significativos en la lista de sensores incluyen casos en los que un sensor con un controlador determinado si falta o ha cambiado atributos, o cuando se usa un se introducen sensores. Aunque reiniciar el tiempo de ejecución de Android es disruptivo para el usuario, es necesario porque el framework de Android ya no puede cumplir la API de Android contratan que los sensores estáticos (no dinámicos) no cambien durante la el ciclo de vida de una app. Esto también puede impedir que el framework se restablezca solicitudes de sensores activas que realizan las apps. Por lo tanto, se recomienda a los proveedores de HAL para evitar cambios evitables en la lista de sensores.

Para garantizar controladores estables del sensor, el HAL debe asignar de manera determinista un del sensor físico del dispositivo al mango. Aunque no se requiere una implementación específica la interfaz de la HAL de sensores, los desarrolladores tienen diversas opciones disponibles para cumplir con este requisito.

Por ejemplo, la lista de sensores puede ordenarse combinando las señales de atributos fijos, como proveedor, modelo y tipo de sensor. Otra opción se basa en el conjunto de sensores estáticos del dispositivo es fijo en el hardware, La HAL debe saber cuándo todos los sensores esperados completaron la inicialización antes que regresan de getSensorsList(). Esta lista de los sensores esperados pueden compilarse en el objeto binario de HAL o almacenarse en una de configuración en el sistema de archivos y se puede usar el orden de aparición para obtener controladores estables. Aunque la mejor solución depende del estado detalles específicos de la implementación, el requisito clave es que el sensor se ocupe no cambien en los reinicios del HAL.

Configurar sensores

Antes de activar un sensor, este se debe configurar con un modelo y la latencia máxima de los informes con la función batch().

Un sensor se debe poder reconfigurar en cualquier momento mediante batch() sin la pérdida de datos de sensores.

Período de muestreo

El período de muestreo tiene un significado diferente según el tipo de sensor que se utilice. que se está configurando:

  • Continuo: Los eventos de sensores se generan a una velocidad continua.
  • Si se produce un cambio: Los eventos se generan antes del período de muestreo y pueden generados a una tasa más lenta que el período de muestreo si el valor medido no cambia.
  • Única: Se ignora el período de muestreo.
  • Especial: Para obtener más detalles, consulta Tipos de sensores.

Para aprender sobre la interacción entre un período de muestreo y el estado modos de generación de informes, consulte Modos de informes.

Latencia de informes máxima

La latencia máxima de los informes establece el tiempo máximo en nanosegundos pueden demorarse y almacenarse en el FIFO de hardware antes de escribirse el FMQ del evento a través de la HAL mientras el SoC está activo.

Un valor de cero significa que los eventos se deben informar medirse, ya sea omitiendo el FIFO por completo o vaciado el FIFO tan pronto como un evento del sensor está presente en el FIFO.

Por ejemplo, un acelerómetro activado a 50 Hz con un máximo de informes latencia de cero activa interrupciones 50 veces por segundo cuando el SoC está activo.

Cuando la latencia máxima de informe es mayor que cero, los eventos del sensor no se deben informar apenas se detectan. Los eventos se pueden se almacenan en el FIFO de hardware y se informan en lotes, siempre que no se produzca retrasado por más que la latencia de informe máxima. Todos los eventos desde el lote anterior se registran y se devuelven de una sola vez. Esto reduce la cantidad de Interrupciones enviadas al SoC y permiten que este cambie a un modo de bajo consumo mientras el sensor captura y procesa los datos en lotes.

Cada evento tiene una marca de tiempo asociada. Retrasar el momento en el que un el evento que se informa no debe afectar la marca de tiempo del evento. La marca de tiempo debe ser sean precisos y correspondan a la hora a la que ocurrió físicamente el evento, no la hora en que se informó.

Para obtener información y requisitos adicionales sobre cómo informar eventos de sensores con de informes máxima distinta de cero, consulta Agrupación en lotes.

Activar sensores

El framework habilita e inhabilita los sensores con la función activate(). Antes de activar un sensor, el framework primero debe configurar el sensor usando batch().

Después de desactivar un sensor, los eventos de sensores adicionales de ese sensor no deben escribirse en la FMQ del evento.

Limpiar sensores

Si un sensor está configurado para agrupar los datos del sensor, el framework puede forzar una limpieza inmediata de eventos de sensores por lotes llamando a flush(). Esto provoca que los eventos del sensor por lotes para el controlador del sensor especificado se envíen inmediatamente se escribe en el FMQ del evento. La HAL de sensores debe agregar un evento de vaciado completo. hasta el final de los eventos de sensores que se escriben como resultado de una llamada a flush()

La limpieza ocurre de forma asíncrona (es decir, esta función debe mostrar inmediatamente). Si la implementación usa un único FIFO para varios sensores, ese FIFO se limpia y el evento de vaciado completo se agrega solo para el sensor especificado.

Si el sensor especificado no tiene FIFO (no hay almacenamiento en búfer posible) o si el FIFO no vacío en el momento de la llamada, flush() aún debe tener éxito y enviar un vaciado evento completo para ese sensor. Esto se aplica a todos los sensores, excepto a los de un intento. sensores.

Si se llama a flush() para un sensor único, flush() debe devolverse. BAD_VALUE y no generan un evento de vaciado completo.

Escribe los eventos del sensor en el FMQ

La HAL de sensores usa el FMQ de eventos para enviar eventos de sensores a Android del marco de trabajo del sensor.

El FMQ del evento es una FMQ sincronizada, lo que significa que cualquier intento de escribir más eventos a FMQ antes de que el espacio disponible permita resultados escribir. En ese caso, la HAL debe determinar si debe escribir el conjunto actual de eventos como dos grupos más pequeños de eventos o para escribir todos los eventos cuando hay suficiente espacio disponible.

Cuando la HAL de sensores ha escrito la cantidad deseada de eventos de sensores en el FMQ de evento, la HAL de sensores debe notificar al framework que los eventos están listos escribiendo el bit EventQueueFlagBits::READ_AND_PROCESS al evento FMQ Función EventFlag::wake. El EventFlag se puede crear desde el Event FMQ con EventFlag::createEventFlag y el getEventFlagWord() de Event FMQ .

La HAL del AIDL de sensores admite write y writeBlocking en el evento FMQ. La implementación predeterminada proporciona una referencia para usar write. Si el botón writeBlocking, la marca readNotification debe establecerse en EventQueueFlagBits::EVENTS_READ, que establece el framework cuando lee del evento FMQ. La marca de notificación de escritura debe establecerse en EventQueueFlagBits::READ_AND_PROCESS, que notifica al framework que los eventos se hayan escrito en el FMQ del evento.

Eventos WAKE_UP

Los eventos WAKE_UP son eventos de sensores que provocan que el procesador de la aplicación (AP) activar y controlar el evento de inmediato. Cada vez que se escribe un evento WAKE_UP al FMQ de evento, la HAL de sensores debe asegurar un bloqueo de activación para garantizar que hasta que el framework pueda controlar el evento. Al recibir un WAKE_UP, el framework protege su propio bloqueo de activación, lo que permite Detecta la HAL para liberar el bloqueo de activación. Para sincronizar el momento en que la HAL de sensores libera su bloqueo de activación, utiliza el FMQ Wake Lock.

La HAL de sensores debe leer el FMQ del bloqueo de activación para determinar la cantidad de WAKE_UP eventos que el framework manejó. La HAL solo debería liberar su bloqueo de activación para los eventos WAKE_UP si la cantidad total de eventos WAKE_UP no controlados es cero Después de controlar los eventos de sensores, el framework cuenta el número de eventos que se marcado como eventos WAKE_UP y vuelve a escribir este número en el FMQ de Wake Lock.

El framework establece la operación de escritura WakeLockQueueFlagBits::DATA_WRITTEN en la FMQ de Wake Lock cuando se escriben datos en el FMQ de Wake Lock.

Sensores dinámicos

Los sensores dinámicos son aquellos que no forman parte física del dispositivo, pero que pueden usarse como entrada para el dispositivo, como un control de juegos con un acelerómetro.

Cuando se conecta un sensor dinámico, la función onDynamicSensorConnected en Se debe llamar a ISensorsCallback desde la HAL de sensores. Esto notifica al del nuevo sensor dinámico y permite que este se controle a través del framework y que los clientes consuman los eventos del sensor.

De forma similar, cuando se desconecta un sensor dinámico, el Se debe llamar a la función onDynamicSensorDisconnected en ISensorsCallback que el marco pueda quitar cualquier sensor que ya no esté disponible.

Canal directo

El canal directo es un método de operación en el que los eventos del sensor se escriben una memoria específica en lugar de la FMQ del evento sin pasar por los sensores Android de Google Cloud. Un cliente que registra un canal directo debe leer los eventos del sensor directamente desde la memoria que se usó para crear el canal directo y no recibir los eventos del sensor a través del framework. El configDirectReport() es similar a batch() para el funcionamiento normal y configura el canal de informes.

Las funciones registerDirectChannel() y unregisterDirectChannel() crean o destruir un canal directo nuevo.

Modos de operación

La función setOperationMode() permite que el framework configure un sensor para que el framework pueda inyectar datos del sensor en el sensor. Esto es útil para en especial para los algoritmos que existen debajo del framework.

La función injectSensorData() se usa normalmente para enviar parámetros en la HAL de sensores. La función también se puede usar para inyectar el sensor eventos en un sensor específico.

Validación

Para validar tu implementación de la HAL de sensores, ejecuta los CTS y el VTS del sensor y pruebas.

Pruebas del CTS

Las pruebas del CTS del sensor existen tanto en pruebas automatizadas del CTS como en el verificador del CTS manual .

Las pruebas automatizadas se encuentran cts/tests/sensor/src/android/hardware/cts Estas pruebas verifican la funcionalidad estándar de los sensores, como la activación sensores, procesamiento por lotes y tasas de eventos de sensores.

Las pruebas del verificador del CTS se encuentran en cts/apps/CtsVerifier/src/com/android/cts/verifier/sensors Estas pruebas requieren la entrada manual del operador para garantizar que los sensores registran valores precisos.

Aprobar las pruebas del CTS es fundamental para garantizar que el dispositivo sometido a prueba cumpla con todos los requisitos de CDD.

Pruebas de VTS

Las pruebas de VTS para la HAL de sensores AIDL se encuentran en hardware/interfaces/sensors/aidl/vts/; Estas pruebas garantizan que la HAL de sensores esté implementada correctamente y que todas de los requisitos de ISensors.aidl y ISensorsCallback.aidl se cumplan correctamente.

Cómo inicializar la HAL

La función initialize() debe ser compatible para establecer FMQ entre las el framework y la HAL.

Cómo exponer los sensores disponibles

En la HAL del AIDL de sensores, la función getSensorsList() debe mostrar el mismo valor durante el inicio de un solo dispositivo, incluso entre reinicios de la HAL de sensores. Un requisito nuevo de la función getSensorsList() es que debe mostrar el mismo valor durante de un solo dispositivo, incluso entre reinicios de la HAL de sensores. Esto permite que los para intentar restablecer las conexiones de los sensores si el servidor del sistema reinicios. El valor que muestra getSensorsList() puede cambiar después de que se activa el dispositivo. realiza un reinicio.

Escribe los eventos del sensor en el FMQ

En lugar de esperar a que se llame a poll(), en la HAL del AIDL de Sensores, los sensores La HAL debe escribir de forma proactiva los eventos del sensor en la FMQ del evento cada vez que se produce algún evento. están disponibles. La HAL también se encarga de escribir los bits correctos en EventFlag para provocar que se lea una FMQ dentro del framework.

Eventos WAKE_UP

En la HAL de sensores 1.0, la HAL pudo liberar su bloqueo de activación para cualquier WAKE_UP evento en cualquier llamada posterior a poll() después de que se publicara un WAKE_UP en poll() porque indica que el framework procesó todos los sensores eventos y había obtenido un bloqueo de activación, si fuera necesario. Porque, en el AIDL de Sensors, HAL, ya no se notifica a la HAL cuando el framework procesa eventos escrito en la FMQ, Wake Lock FMQ permite que el framework se comunique con el HAL cuando controló eventos de WAKE_UP.

En la HAL del AIDL de sensores, el bloqueo de activación protegido por la HAL de sensores de WAKE_UP los eventos deben comenzar con SensorsHAL_WAKEUP.

Sensores dinámicos

Se mostraron los sensores dinámicos con la función poll() en la HAL de sensores 1.0. La HAL del AIDL de sensores requiere que onDynamicSensorsConnected y Se puede llamar a onDynamicSensorsDisconnected en ISensorsCallback siempre que sea dinámico las conexiones de los sensores cambian. Estas devoluciones de llamada están disponibles como parte del Puntero ISensorsCallback proporcionado a través de la función initialize().

Modos de operación

El modo DATA_INJECTION para los sensores WAKE_UP debe ser compatible.

Compatibilidad con varias HAL

La HAL del AIDL de sensores admite varias HAL con el Framework de varias HAL de sensores. Para detalles de la implementación, consulta Portabilidad de la HAL de sensores 2.1.