Capteurs AIDL HAL

La couche d'abstraction matérielle (HAL, Sensors Hardware Abstraction Layer) le framework de capteur Android et les capteurs d'un appareil, tels qu'un accéléromètre ou le gyroscope. Le HAL des capteurs définit les fonctions à implémenter pour de contrôler les capteurs.

Le HAL des capteurs AIDL est disponible sur Android 13 et pour les appareils neufs et plus récents. Sensors AIDL HAL, basé sur Sensors HAL 2.1 utilise le interface HAL AIDL et expose le capteur de tête et les capteurs de la centrale inertielle à axe limité.

Interface HAL AIDL

La principale source de documentation sur le HAL des capteurs AIDL se trouve dans le HAL définition à hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl.

Implémenter le HAL des capteurs AIDL

Pour implémenter le HAL Sensors AIDL, un objet doit étendre le ISensors et implémenter toutes les fonctions définies dans hardware/interfaces/sensors/aidl/android/hardware/sensors/ISensors.aidl.

Initialiser l'HAL

Le HAL des capteurs doit être initialisé par le framework de capteurs Android avant peuvent être utilisées. Le framework appelle la fonction initialize() pour fournir trois au HAL des capteurs: deux descripteurs FMQ et un pointeur vers ISensorsCallback.

Le HAL utilise le premier descripteur pour créer le FMQ de l'événement utilisé pour écrire le capteur d'événements dans le framework. Le HAL utilise le deuxième descripteur pour créer le Wake Verrouillage de FMQ utilisé pour la synchronisation lorsque le HAL libère son wakelock pour WAKE_UP les événements de capteurs. Le HAL doit enregistrer un pointeur vers l'objet ISensorsCallback. que toutes les fonctions de rappel nécessaires puissent être appelées.

La fonction initialize() doit être la première fonction appelée lors de l'initialisation. l'HAL des capteurs.

Exposer les capteurs disponibles

Pour obtenir la liste de tous les capteurs statiques disponibles dans l'appareil, utilisez la fonction getSensorsList(). Cette fonction renvoie une liste de capteurs, identifié de manière unique par son identifiant. La poignée d'un capteur donné ne doit pas changer. lorsque le processus hébergeant le HAL des capteurs redémarre. Les identifiants peuvent changer l'appareil et lors des redémarrages du serveur système.

Si plusieurs capteurs partagent le même type de capteur et la même propriété d'activation, le le premier capteur de la liste est appelé "capteur par défaut" et est renvoyé Applications qui utilisent le getDefaultSensor(int sensorType, bool wakeUp) .

Stabilité de la liste des capteurs

Après le redémarrage du HAL des capteurs, si les données renvoyées par getSensorsList() indique un changement significatif par rapport à la liste de capteurs récupérée avant la le framework déclenche un redémarrage du Environnement d'exécution Android Les modifications importantes apportées à la liste des capteurs sont les cas d'un capteur avec une poignée donnée est manquant ou dont les attributs ont changé, ou lorsque de nouveaux les capteurs sont présentés. Bien que le redémarrage de l'environnement d'exécution Android soit perturbant à l'utilisateur, elle est obligatoire, car le framework Android ne peut plus répondre aux Le contrat de l'API Android stipule que les capteurs statiques (non dynamiques) ne changent pas pendant le d'une application. Cela peut également empêcher le framework de rétablir les demandes de capteurs actives effectuées par les applications. Par conséquent, les fournisseurs HAL sont invités à pour empêcher les modifications évitables de la liste des capteurs.

Pour garantir la stabilité des poignées des capteurs, le HAL doit mapper de manière déterministe capteur physique de l'appareil à sa poignée. Même si aucune mise en œuvre spécifique est imposée par l'interface HAL des capteurs, les développeurs disposent de plusieurs options pour répondre à cette exigence.

Par exemple, il est possible de trier la liste des capteurs en combinant les valeurs des attributs fixes, tels que le fournisseur, le modèle et le type de capteur. Une autre option repose sur sur le fait que l'ensemble de capteurs statiques de l'appareil est fixe dans le matériel. HAL doit savoir quand tous les capteurs attendus ont terminé l'initialisation avant retour de getSensorsList(). Cette liste de les capteurs attendus peuvent être compilés dans le binaire HAL ou stockés dans un fichier de configuration dans le système de fichiers, et l'ordre d'apparition peut être utilisé pour obtenir des identifiants stables. Bien que la meilleure solution dépende de la configuration des détails spécifiques sur l'implémentation, la principale exigence est que le capteur ne changent pas lors des redémarrages HAL.

Configurer les capteurs

Avant d'activer un capteur, celui-ci doit être configuré avec un échantillonnage période et latence maximale des rapports à l'aide de la fonction batch().

Un capteur doit pouvoir être reconfiguré à tout moment à l'aide de batch() sans le la perte de données des capteurs.

Période d'échantillonnage

La période d'échantillonnage a une signification différente selon le type de capteur en cours de configuration:

  • Continu: les événements des capteurs sont générés en continu.
  • Lors de l'évolution: les événements sont générés au plus tôt que la période d'échantillonnage et peuvent être générées à un taux plus lent que la période d'échantillonnage si la valeur mesurée ne change pas.
  • One-shot: la période d'échantillonnage est ignorée.
  • Spécial: Pour en savoir plus, consultez Types de capteurs

Pour en savoir plus sur l'interaction entre une période d'échantillonnage et la température les modes de création de rapports, consultez Modes de création de rapports.

Latence maximale des rapports

La latence maximale des rapports définit la durée maximale, en nanosecondes, pendant laquelle peuvent être retardés et stockés dans le FIFO matériel avant d'être écrits dans l'événement FMQ via le HAL lorsque le SoC est activé.

La valeur zéro signifie que les événements doivent être consignés dès qu'ils sont soit sans le FIFO, soit en le vidant dès qu'il un événement du capteur est présent dans le FIFO.

Par exemple, un accéléromètre activé à 50 Hz avec un rapport maximal latence sur zéro déclenche 50 interruptions par seconde lorsque le SoC est activé.

Lorsque la latence maximale des rapports est supérieure à zéro, les événements de capteurs doivent être signalés dès leur détection. Les événements peuvent être temporaires stockés dans le FIFO matériel et transmis par lots, à condition qu'aucun événement ne soit plus tard que la latence maximale des rapports. Tous les événements depuis le le lot précédent sont enregistrés et renvoyés en même temps. Cela réduit le nombre de des interruptions envoyées au SoC et lui permet de passer à un mode d'économie d'énergie pendant la capture et le traitement par lot des données par le capteur.

Chaque événement est associé à un code temporel. En retardant le moment auquel une l'événement signalé ne doit pas avoir d'incidence sur son code temporel. Le code temporel doit être et correspondent à l'heure à laquelle l'événement s'est produit physiquement, et non à l'heure à laquelle elles ont été signalées.

Pour en savoir plus et connaître les exigences liées à la création de rapports sur les événements de capteurs avec une latence de création de rapports maximale différente de zéro, consultez la section Traitement par lot.

Activer les capteurs

Le framework active et désactive les capteurs à l'aide de la fonction activate(). Avant d'activer un capteur, l'infrastructure doit d'abord le configurer avec batch().

Lorsqu'un capteur est désactivé, aucun autre événement ne doit être associé à ce capteur. être écrit dans le FMQ de l'événement.

Vidage des capteurs

Si un capteur est configuré pour traiter les données par lot, le framework peut forcer un vidage immédiat des événements de capteurs par lot en appelant flush() ; Cela provoque les événements de capteur regroupés pour la poignée de capteur spécifiée écrit dans le FMQ de l'événement. Le HAL des capteurs doit ajouter un événement de vidage complet. à la fin des événements de capteurs écrits à la suite d'un appel à flush()

Le vidage s'effectue de manière asynchrone. En d'autres termes, cette fonction doit renvoyer immédiatement). Si l'implémentation utilise un seul FIFO pour plusieurs capteurs, celui-ci est et l'événement de vidage complet n'est ajouté que pour le capteur spécifié.

Si le capteur spécifié n'a pas de FIFO (mise en mémoire tampon impossible) ou si le FIFO était vide au moment de l'appel, flush() doit quand même réussir et envoyer un vidage l'événement complet associé à ce capteur. Cela s'applique à tous les capteurs autres que les capteurs uniques capteurs.

Si flush() est appelé pour un capteur one-shot, flush() doit renvoyer BAD_VALUE et ne pas générer d'événement de vidage complet.

Écrire les événements de capteurs dans le FMQ

Le FMQ des événements est utilisé par le HAL des capteurs pour transmettre les événements de capteurs à Android. de capteurs.

Le FMQ d'événement est un FMQ synchronisé, ce qui signifie que toute tentative d'écriture de données supplémentaires d'événements au FMQ que l'espace disponible ne le permet, l'écriture. Dans ce cas, le HAL doit déterminer s'il faut écrire l'ensemble actuel d'événements sous forme de deux plus petits groupes d'événements ou pour écrire tous les événements lorsque l'espace disponible est suffisant.

Lorsque l'HAL des capteurs a écrit le nombre souhaité d'événements de capteurs dans le FMQ d'événement, le HAL des capteurs doit avertir le framework que les événements sont prêts en écrivant le bit EventQueueFlagBits::READ_AND_PROCESS dans le FMQ de l'événement fonction EventFlag::wake. L'indicateur d'événement peut être créé à partir de l'instance FMQ de l'événement à l'aide de EventFlag::createEventFlag et du getEventFlagWord() de FMQ de l'événement .

Le HAL des capteurs AIDL est compatible avec write et writeBlocking sur le FMQ d'événement. L'implémentation par défaut fournit une référence pour l'utilisation de write. Si le writeBlocking est utilisée, l'option readNotification doit être définie sur EventQueueFlagBits::EVENTS_READ, qui est défini par le framework lorsqu'il lit des événements FMQ d'événement. L'indicateur de notification d'écriture doit être défini sur EventQueueFlagBits::READ_AND_PROCESS, qui informe le framework que les événements ont été écrites dans le FMQ de l'événement.

Événements WAKE_UP

Les événements WAKE_UP sont des événements de capteur qui amènent le processeur d'application (PA) et de gérer l'événement immédiatement. Chaque fois qu'un événement WAKE_UP est écrit à l'événement FMQ, les capteurs HAL doivent sécuriser un wakelock pour garantir que le système reste activé jusqu'à ce que le framework puisse gérer l'événement. À la réception d'un WAKE_UP, le framework sécurise son propre wakelock, ce qui permet Les capteurs HAL doivent déverrouiller son wakelock. Pour synchroniser les capteurs HAL lève son wakelock, utilisez Wake Lock FMQ.

Le HAL des capteurs doit lire le FMQ du wakelock pour déterminer le nombre de WAKE_UP gérés par le framework. Le HAL doit uniquement libérer son wakelock pour les événements WAKE_UP si le nombre total d'événements WAKE_UP non gérés est de zéro. Après avoir géré les événements de capteurs, le framework compte le nombre d'événements marqués comme événements WAKE_UP et réécrit ce nombre dans le FMQ de Wake Lock.

Le framework définit l'autorisation d'écriture WakeLockQueueFlagBits::DATA_WRITTEN sur Wake Lock FMQ chaque fois qu'il écrit des données dans Wake Lock FMQ.

Capteurs dynamiques

Les capteurs dynamiques sont des capteurs qui ne sont pas physiquement intégrés à l'appareil, mais qui peuvent peut servir d'entrée à l'appareil, par exemple une manette de jeu avec un accéléromètre.

Lorsqu'un capteur dynamique est connecté, la fonction onDynamicSensorConnected dans ISensorsCallback doit être appelé depuis le HAL des capteurs. Cela permet d'informer du nouveau capteur dynamique et de le contrôler via le framework et faire en sorte que les événements du capteur soient utilisés par les clients.

De même, lorsqu'un capteur dynamique est déconnecté, La fonction onDynamicSensorDisconnected dans ISensorsCallback doit être appelée ainsi que le framework puisse supprimer tout capteur qui n'est plus disponible.

Canal direct

Le canal direct est une méthode d'opération dans laquelle les événements de capteurs sont écrits une mémoire spécifique au lieu d'être transmis à l'événement FMQ, en contournant les capteurs Android Framework. Un client qui enregistre un canal direct doit lire les événements de capteurs directement à partir de la mémoire utilisée pour créer le canal direct et ne recevoir les événements de capteurs via le framework. configDirectReport() est semblable à batch() pour un fonctionnement normal et configure la fonction signaler un canal.

Les fonctions registerDirectChannel() et unregisterDirectChannel() créent ou supprimer un nouveau canal direct.

Modes de fonctionnement

La fonction setOperationMode() permet au framework de configurer un capteur afin que le framework puisse y injecter des données. Ceci est utile pour en particulier pour les algorithmes situés en dessous du framework.

En général, la fonction injectSensorData() permet de transférer dans le HAL des capteurs. Cette fonction peut aussi être utilisée pour injecter dans un capteur spécifique.

Validation

Pour valider votre implémentation du HAL des capteurs, exécutez les outils CTS et VTS du capteur. tests.

Tests CTS

Les tests CTS du capteur existent à la fois dans les tests CTS automatisés et dans le vérificateur CTS manuel l'application.

Les tests automatisés sont situés cts/tests/sensor/src/android/hardware/cts. Ces tests vérifient le fonctionnement standard des capteurs, comme l'activation les capteurs, le traitement par lot et les taux d'événements des capteurs.

Les tests du vérificateur CTS se trouvent cts/apps/CtsVerifier/src/com/android/cts/verifier/sensors Ces tests nécessitent une intervention manuelle de l'opérateur de test et s'assurent que les capteurs indiquent des valeurs précises.

Il est essentiel de réussir les tests CTS pour s'assurer que l'appareil soumis aux tests respecte les toutes les exigences du CDD.

Tests VTS

Les tests VTS pour le HAL des capteurs AIDL sont situés dans hardware/interfaces/sensors/aidl/vts/. Ces tests permettent de s'assurer que le HAL des capteurs est correctement implémenté et que tous les exigences dans ISensors.aidl et ISensorsCallback.aidl sont correctement satisfaites.

Initialiser l'HAL

La fonction initialize() doit être compatible pour établir des FMQ entre les framework et HAL.

Exposer les capteurs disponibles

Dans le HAL Sensors AIDL, la fonction getSensorsList() doit renvoyer la même valeur pendant le démarrage d'un seul appareil, même lors des redémarrages HAL des capteurs. Une nouvelle exigence de la fonction getSensorsList() est qu'elle doit renvoyer la même valeur pendant un seul démarrage d'appareil, même lors des redémarrages HAL des capteurs. Cela permet pour tenter de rétablir les connexions des capteurs si le serveur système redémarre automatiquement. La valeur renvoyée par getSensorsList() peut changer après que l'appareil effectue un redémarrage.

Écrire les événements de capteurs dans le FMQ

Au lieu d'attendre que poll() soit appelé, dans le HAL Sensors AIDL, les capteurs HAL doit écrire de manière proactive les événements de capteurs dans le FMQ d'événement chaque fois que des événements de capteur sont disponibles. Le HAL est également responsable de l'écriture des bits corrects dans EventFlag pour provoquer une lecture FMQ dans le framework.

Événements WAKE_UP

Dans la version 1.0 des capteurs HAL, le HAL a pu déverrouiller son wakelock pour n'importe quelle WAKE_UP lors de tout appel ultérieur à poll() après la publication d'un WAKE_UP sur poll(), car cela indique que l'infrastructure avait traité tous les capteurs et obtenu un wakelock, si nécessaire. En effet, dans Sensors AIDL, HAL, le HAL n'est plus averti lorsque le framework a traité des événements écrit dans le FMQ, le Wake Lock FMQ permet au framework de communiquer HAL lorsqu'il a géré des événements WAKE_UP.

Dans le HAL des capteurs AIDL, le wakelock sécurisé par le HAL des capteurs pour WAKE_UP les événements doivent commencer par SensorsHAL_WAKEUP.

Capteurs dynamiques

Les capteurs dynamiques ont été renvoyés à l'aide de la fonction poll() dans Sensors HAL 1.0. Le HAL des capteurs AIDL exige que onDynamicSensorsConnected et onDynamicSensorsDisconnected dans ISensorsCallback doit être appelé chaque fois que des éléments dynamiques les connexions des capteurs changent. Ces rappels sont disponibles Pointeur ISensorsCallback fourni via la fonction initialize().

Modes de fonctionnement

Le mode DATA_INJECTION des capteurs WAKE_UP doit être compatible.

Compatibilité multi-HAL

Le HAL des capteurs AIDL est compatible avec plusieurs HAL à l'aide de la Framework Multi-HAL pour les capteurs : Pour les détails de l'implémentation, consultez Transfert depuis Sensors HAL 2.1