Implémenter une clé USB HAL

La version Android 8.0 transfère 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, les scripts init (déclencheurs de propriété) sont utilisés pour effectuer des opérations de gadget spécifiques à l'appareil.

Dans les versions précédentes, ces configurations spécifiques à l'appareil étaient obtenues via des scripts init spécifiques à l'appareil (à l'aide de déclencheurs de propriété). Le passage à une couche d'abstraction matérielle (HAL) permet d'obtenir une implémentation beaucoup plus propre qui résout les problèmes suivants:

  1. Les opérations telles que l'écriture sur les nœuds sysfs du noyau pourraient échouer, mais ne pas être propagées au code du framework qui définit le déclencheur de propriété. Par conséquent, les frameworks supposent à tort que les opérations ont réussi, même si elles ont échoué en mode silencieux.
  2. Le nombre d'opérations pouvant être exécutées dans les scripts init est limité.

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

HAL et Treble

Les scripts init spécifiques à l'appareil étaient utilisés à la place des couches HAL pour effectuer des opérations USB spécifiques à l'appareil. L'USB (via ADB) est une interface principale pour déboguer les problèmes système. Le fait de disposer d'un daemon natif pour effectuer la configuration USB élimine la dépendance au code du framework. Ainsi, même si le framework plante, USB devrait être en cours d'exécution.

Sous le 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 daemons natifs. Cela évite d'avoir à disposer d'un daemon USB exclusif, car la couche HAL sert également de daemon USB.

L'implémentation HAL par défaut s'applique à tous les appareils antérieurs à Android 8.0. Par conséquent, il n'y aurait pas de tâche spécifique à chaque appareil 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 changements de rôle de données et de rôle d'alimentation.

Implémentation

La nouvelle interface HAL USB doit être implémentée sur chaque appareil lancé sur 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 mineures peuvent être nécessaires dans les scripts USB spécifiques à l'appareil pour transférer la propriété des nœuds typc-c au système.