Implementierung von USB HAL

Die Android 8.0-Version verlagert die Handhabung von USB-Befehlen aus init Skripten in einen nativen USB-Daemon, um eine bessere Konfiguration und Codezuverlässigkeit zu gewährleisten. Für die Konfiguration der Gadget-Funktion werden init Skripte (Eigenschaftsauslöser) verwendet, um gerätespezifische Gadget-Vorgänge auszuführen.

In früheren Versionen wurden diese gerätespezifischen Konfigurationen durch gerätespezifische init Skripts (unter Verwendung von Eigenschaftsauslösern) erreicht. Der Wechsel zu einem HAL-Design (Hardware Abstraction Layer) führt zu einer viel saubereren Implementierung, die diese Probleme löst:

  1. Vorgänge wie Schreibvorgänge in die sysfs-Knoten des Kernels könnten fehlschlagen, aber nicht an den Framework-Code zurückgegeben werden, der den Eigenschaftsauslöser festlegt. Daher gehen Frameworks fälschlicherweise davon aus, dass die Vorgänge erfolgreich waren, obwohl sie stillschweigend fehlgeschlagen sind.
  2. init Skripte verfügen über eine begrenzte Anzahl von Operationen, die ausgeführt werden können.

Die Android 12-Version fügt USB Gadget HAL-Unterstützung für Network Control Models (NCM) und API-Aufrufe hinzu, die sowohl die HAL-Versionsnummer als auch die USB-Geschwindigkeit zurückgeben. Weitere Informationen zu den API-Aufrufen, die über die USB-HAL verfügbar sind, finden Sie in der Paketzusammenfassung android.hardware.usb .

HAL und Höhen

Die gerätespezifischen init -Skripte wurden als Ersatz für HAL-Schichten verwendet, um gerätespezifische USB-Vorgänge auszuführen. USB (über ADB) ist eine primäre Schnittstelle zum Debuggen von Systemproblemen. Wenn ein nativer Daemon zur Durchführung der USB-Konfiguration vorhanden ist, entfällt die Abhängigkeit vom Framework-Code, sodass USB auch dann ausgeführt werden sollte, wenn das Framework abstürzt.

Unter dem ebenfalls in Android 8.0 eingeführten Treble- Modell sind alle HALs von den Systemdiensten isoliert und müssen in ihren eigenen nativen Daemons ausgeführt werden. Dadurch entfällt die Notwendigkeit, einen exklusiven USB-Daemon zu haben, da die HAL-Schicht gleichzeitig als USB-Daemon fungiert.

Die Standard-HAL-Implementierung kümmert sich um alle Geräte vor Android 8.0. Daher würde es für die Geräte vor Android 8.0 keine gerätespezifischen Arbeiten geben. Android 8.0 nutzt die HAL-Schnittstelle, um den Status von USB-Anschlüssen abzufragen und Daten- und Leistungsrollenwechsel durchzuführen.

Implementierung

Auf jedem Gerät, das mit Android 8.0 startet, muss eine neue USB-HAL-Schnittstelle implementiert werden. Die Standardimplementierung sollte für Geräte vor Android 8.0 geeignet sein. Die Standardimplementierung ist ausreichend, wenn das Gerät die Klasse dual_role_usb verwendet, um den Typ-C-Portstatus zu melden. In gerätespezifischen USB-Skripten können geringfügige Änderungen erforderlich sein, um den Besitz der Typc-C-Knoten auf das System zu übertragen.