Implémentation d'USB HAL

La version Android 8.0 déplace la gestion des commandes USB des scripts d' 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 réalisées via des scripts d' init spécifiques à l'appareil (à l'aide de déclencheurs de propriété). Le passage à une conception de couche d'abstraction matérielle (HAL) se traduit par 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 vers le code des infrastructures 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 silence.
  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 réseau (NCM) et les appels d'API qui renvoient à la fois le numéro de version HAL et la vitesse USB. Pour plus d'informations sur les appels d'API disponibles via la couche HAL USB, consultez le résumé du package android.hardware.usb .

HAL et aigus

Les scripts d' init spécifiques à l'appareil ont été utilisés en remplacement des couches HAL pour effectuer des opérations USB spécifiques à l'appareil. 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 plante, l'USB devrait fonctionner.

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 démons natifs. Cela élimine la nécessité d'avoir un démon USB exclusif car la couche HAL se double bien d'un démon USB.

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

Mise en œuvre

La nouvelle interface USB HAL 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 pré-Android 8.0. L'implémentation par défaut est suffisante si le périphérique 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 à l'appareil pour transférer la propriété des nœuds typc-c au système.