Implémentation de HAL USB

La version Android 8.0 déplace la gestion des commandes USB des scripts init vers un démon USB natif pour une meilleure configuration et une meilleure fiabilité du code. Pour la configuration de la fonction Gadget, des scripts init (déclencheurs de propriétés) sont utilisés pour effectuer des opérations de gadget spécifiques au périphérique.

Dans les versions précédentes, ces configurations spécifiques au périphérique étaient réalisées via des scripts init spécifiques au périphérique (à l'aide de déclencheurs de propriétés). Le passage à une conception HAL (Hardware Abstraction Layer) entraîne une implémentation beaucoup plus propre qui résout ces problèmes :

  1. Les opérations telles que les écritures sur les nœuds sysfs du noyau peuvent échouer mais ne pas être propagées au code du framework qui définit le déclencheur de propriété. En conséquence, les frameworks supposent à tort que les opérations ont réussi même si elles ont échoué silencieusement.
  2. les scripts init ont un nombre limité d'opérations pouvant être exécutées.

La version Android 12 ajoute la prise en charge USB Gadget HAL pour les modèles de contrôle de réseau (NCM) et les appels API qui renvoient à la fois le numéro de version HAL et la vitesse USB. Pour plus d'informations sur les appels API disponibles via USB HAL, consultez le résumé du package android.hardware.usb .

HAL et aigus

Les scripts init spécifiques au périphérique ont été utilisés en remplacement des couches HAL pour effectuer des opérations USB spécifiques au périphérique. L'USB (via ADB) est une interface principale pour le débogage des problèmes du système. Avoir un démon natif pour effectuer la configuration USB élimine la dépendance au code du framework, donc même si le framework tombe en panne, l'USB doit être en cours d'exécution.

Dans le cadre du modèle Treble également introduit dans Android 8.0, tous les HAL sont isolés des services système et doivent s'exécuter dans leurs propres démons natifs. Cela élimine la nécessité d'avoir un démon USB exclusif, car la couche HAL fait également office de démon USB.

L'implémentation HAL par défaut prend en charge tous les appareils antérieurs à Android 8.0. Par conséquent, il n’y aurait aucun travail spécifique aux appareils pour les appareils antérieurs à Android 8.0. Android 8.0 utilise l'interface HAL pour interroger l'état des ports USB et pour effectuer des échanges de rôles de données et de rôles d'alimentation.

Mise en œuvre

La nouvelle interface USB HAL doit être implémentée sur chaque appareil lancé sous Android 8.0. L'implémentation par défaut devrait prendre en charge les appareils antérieurs à Android 8.0. L'implémentation par défaut est suffisante si l'appareil utilise la classe dual_role_usb pour signaler l'état du port de type C. Des modifications triviales peuvent être nécessaires dans les scripts USB spécifiques au périphérique pour transférer la propriété des nœuds typc-c au système.