USB HAL implementieren

Mit Android 8.0 wird die Verarbeitung von USB-Befehlen aus init-Skripten in einen nativen USB-Daemon verlagert, um die Konfiguration und die Zuverlässigkeit des Codes zu verbessern. Für die Konfiguration der Gadget-Funktion werden init-Skripte (Attribut-Trigger) verwendet, um gerätespezifische Gadget-Vorgänge auszuführen.

In früheren Versionen wurden diese gerätespezifischen Konfigurationen über gerätespezifische init-Skripte (mit Attribut-Triggern) erreicht. Die Umstellung auf ein Hardwareabstraktionsschicht-Design (HAL) 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önnen fehlschlagen, werden aber nicht an den Framework-Code zurückgegeben, der den Attribut-Trigger festlegt. Daher geht das Framework fälschlicherweise davon aus, dass die Vorgänge erfolgreich waren, obwohl sie im Hintergrund fehlgeschlagen sind.
  2. In init-Skripten kann nur eine begrenzte Anzahl von Vorgängen ausgeführt werden.

Mit Android 12 wird die USB Gadget HAL-Unterstützung für Network Control Models (NCM) und API-Aufrufe hinzugefügt, 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 Zusammenfassung des Pakets android.hardware.usb.

HAL und Treble

Die gerätespezifischen init-Skripte wurden als Ersatz für HAL-Ebenen verwendet, um gerätespezifische USB-Vorgänge auszuführen. USB (über ADB) ist eine primäre Schnittstelle zum Debuggen von Systemproblemen. Mit einem nativen Daemon zur Ausführung der USB-Konfiguration ist keine Abhängigkeit vom Framework-Code mehr erforderlich. Selbst wenn das Framework abstürzt, sollte USB weiterhin ausgeführt werden.

Im Rahmen des Treble -Modells, das ebenfalls in Android 8.0 eingeführt wurde, sind alle HALs von System -Diensten isoliert und müssen in eigenen nativen Daemons ausgeführt werden. Dadurch ist kein exklusiver USB-Daemon mehr erforderlich, da die HAL-Ebene auch als USB-Daemon fungiert.

Die Standard-HAL-Implementierung kümmert sich um alle Geräte vor Android 8.0. Daher sind für Geräte vor Android 8.0 keine gerätespezifischen Arbeiten erforderlich. Android 8.0 verwendet die HAL-Schnittstelle, um den Status von USB-Anschlüssen abzufragen und Daten- und Leistungsrollen zu tauschen.

Implementierung

Die neue USB HAL-Schnittstelle muss auf jedem Gerät implementiert werden, auf dem Android 8.0 ausgeführt wird. Die Standardimplementierung sollte sich um Geräte vor Android 8.0 kümmern. Die Standardimplementierung ist ausreichend, wenn das Gerät die Klasse dual_role_usb verwendet, um den Status des Typ-C-Anschlusses zu melden. In gerätespezifischen USB-Skripten sind möglicherweise triviale Änderungen erforderlich, um das Eigentum an den Typ-C-Knoten an das System zu übertragen.