Hotplug-Handhabung

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Anzeigefunktionen (z. B. Anzeigemodi und unterstützte HDR-Typen) können sich auf Geräten mit extern angeschlossenen Displays (mit HDMI oder DisplayPort), z. B. Android-TV-Set-Top-Boxen (STBs) und Over-the-Top (OTT), dynamisch ändern. Geräte. Diese Änderung kann als Ergebnis eines HDMI-Hotplug-Signals erfolgen, z. B. wenn der Benutzer von einem Display zu einem anderen wechselt oder das Gerät ohne angeschlossenes Display hochfährt. Android 12 und höher enthält Änderungen im Framework, um Hotplugging- und dynamische Anzeigefunktionen zu handhaben.

Diese Seite beschreibt die Handhabung von Anzeige-Hotplugs und Änderungen der Anzeigefunktionen in der Composer HAL-Implementierung. Außerdem wird erläutert, wie der zugehörige Framebuffer verwaltet und Race-Conditions in diesen Situationen verhindert werden.

Aktualisieren Sie die Anzeigefunktionen

In diesem Abschnitt wird beschrieben, wie das Android-Framework Änderungen an Anzeigefunktionen handhabt, die von Composer HAL initiiert wurden.

Bevor Android Änderungen der Anzeigefunktionen ordnungsgemäß handhaben kann, muss der OEM Composer HAL so implementieren, dass er onHotplug(display, connection=CONNECTED) verwendet, um das Framework über alle Änderungen der Anzeigefunktionen zu benachrichtigen. Nachdem dies implementiert wurde, behandelt Android Änderungen an den Anzeigefunktionen wie folgt:

  1. Beim Erkennen einer Änderung der Anzeigefähigkeiten erhält das Framework eine onHotplug(display, connection=CONNECTED) .
  2. Beim Empfang der Benachrichtigung löscht das Framework seinen Anzeigestatus und erstellt ihn mit den neuen Funktionen aus der HAL neu, indem es die getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities und getDisplayCapabilities verwendet.
  3. Nachdem das Framework einen neuen Anzeigezustand neu erstellt hat, sendet es den onDisplayChanged Callback an die Apps, die auf solche Ereignisse warten.

Das Framework weist die Framebuffer bei nachfolgenden onHotplug(display, connection=CONNECTED) zu. Weitere Informationen zur ordnungsgemäßen Verwaltung des Framebuffer-Speichers zur Vermeidung von Fehlern bei der Zuweisung neuer Framebuffer finden Sie unter Client-Framebuffer-Verwaltung .

Umgang mit gängigen Verbindungsszenarien

In diesem Abschnitt wird beschrieben, wie Sie verschiedene Verbindungsszenarien in Ihren Implementierungen richtig handhaben, wenn die primäre Anzeige verbunden und getrennt wird.

Das Android-Framework wurde für mobile Geräte entwickelt und bietet keine integrierte Unterstützung für eine getrennte primäre Anzeige. Stattdessen muss die HAL die primäre Anzeige durch eine Platzhalteranzeige in ihren Interaktionen mit dem Framework ersetzen, falls eine primäre Anzeige physisch getrennt ist.

Die folgenden Szenarien können in STBs und TV-Dongles auftreten, die extern angeschlossene Displays haben, die getrennt werden können. Um die Unterstützung für diese Szenarien zu implementieren, verwenden Sie die Informationen in der folgenden Tabelle:

Szenario Handhabung
Kein verbundenes Display beim Booten
  • Senden Sie ein onHotplug(display, connection=CONNECTED) -Signal von der Composer-HAL an das Framework.
  • Ersetzen Sie den physischen Anzeigestatus in der Composer-HAL durch einen Platzhalter-Anzeigestatus.
Das primäre Display ist physisch verbunden
Das primäre Display ist physisch getrennt
  • Senden Sie ein weiteres onHotplug(display, connection=CONNECTED) von der Composer-HAL an das Framework.
  • Ersetzen Sie den physischen Anzeigestatus in der Composer-HAL durch einen Platzhalter-Anzeigestatus. Die Platzhalteranzeige muss über einen einzigen Anzeigemodus verfügen, damit das Framework den onDisplayChanged Callback an Apps sendet (da sich der Satz unterstützter Modi geändert hat). Dieser einzelne Anzeigemodus muss mit dem letzten aktiven Modus der physischen Anzeige vor der Trennung übereinstimmen, damit Apps keine Konfigurationsänderungsereignisse erhalten.

Verwenden Sie sequenzielle Konfigurations-IDs, um Race-Conditions zu verhindern

Es können Racebedingungen auftreten, wenn die Composer-HAL die unterstützten Anzeigekonfigurationen gleichzeitig mit dem Framework aktualisiert, das setActiveConfig oder setActiveConfigWithConstraints . Die Lösung besteht darin, Composer HAL zu implementieren, um sequenzielle IDs zu verwenden und dieses Problem zu vermeiden.

In diesem Abschnitt wird beschrieben, wie die Race-Bedingungen auftreten können, gefolgt von Details zur Implementierung von Composer HAL, sodass es sequenzielle IDs verwendet, um solche Bedingungen zu verhindern.

Betrachten Sie die folgende Abfolge von Ereignissen, wenn den neuen Anzeigekonfigurationen KEINE neuen, sequentiellen IDs zugewiesen werden, was zu einer Race-Bedingung führt:

  1. Die unterstützten Anzeigekonfigurations-IDs sind:

    • id=1 , 1080 x 1920 60 Hz
    • id=2 , 1080 x 1920 50 Hz
  2. Das Framework ruft setActiveConfig(display, config=1) .

  3. Gleichzeitig verarbeitet der Composer HAL eine Änderung der Anzeigekonfigurationen und aktualisiert seinen internen Zustand auf einen neuen Satz von Anzeigekonfigurationen, der wie folgt dargestellt wird:

    • id=1 , 2160 x 3840 60 Hz
    • id=2 , 2160 x 3840 50 Hz
    • id=3 , 1080 x 1920 60 Hz
    • id=4 , 1080 x 1920 50 Hz
  4. Composer HAL sendet ein onHotplug -Ereignis an das Framework, um zu benachrichtigen, dass sich der Satz unterstützter Modi geändert hat.

  5. Die Composer-HAL empfängt setActiveConfig(display, config=1) (aus Schritt 2).

  6. Die HAL interpretiert, dass das Framework eine Konfigurationsänderung auf 2160 x 3840 60 Hz angefordert hat, obwohl in Wirklichkeit 1080 x 1920 60 Hz gewünscht war.

Der Prozess mit nicht sequentiellen ID-Zuweisungen endet hier mit einer Fehlinterpretation der gewünschten Konfigurationsänderung.

Konfigurieren Sie Composer HAL für die Verwendung sequenzieller IDs

Um solche Rennbedingungen zu vermeiden, muss der OEM die Composer HAL wie folgt implementieren:

  • Wenn die Composer-HAL die unterstützten Anzeigekonfigurationen aktualisiert, weist sie den neuen Anzeigekonfigurationen neue, fortlaufende IDs zu.
  • Wenn das Framework setActiveConfig oder setActiveConfigWithConstraints mit einer ungültigen Konfigurations-ID aufruft, ignoriert die Composer-HAL den Aufruf.

Diese Schritte dienen dazu, Rennbedingungen zu verhindern, wie in der folgenden Erörterung gezeigt.

Betrachten Sie die folgende Abfolge von Ereignissen, wenn den neuen Anzeigekonfigurationen neue, fortlaufende IDs zugewiesen werden:

  1. Die unterstützten Anzeigekonfigurations-IDs sind:

    • id=1 , 1080 x 1920 60 Hz
    • id=2 , 1080 x 1920 50 Hz
  2. Das Framework ruft setActiveConfig(display, config=1) .

  3. Wenn eine Änderung der Anzeigekonfigurationen verarbeitet wird, wird der nächste Satz von Konfigurations-IDs beginnend mit der nächsten nicht verwendeten Ganzzahl zugewiesen, wie folgt dargestellt:

    • id=3 , 2160 x 3840 60 Hz

    • id=4 , 2160 x 3840 50 Hz

    • id=5 , 1080 x 1920 60 Hz

    • id=6 , 1080 x 1920 50 Hz

  4. Die Composer-HAL sendet ein onHotplug -Ereignis an das Framework, um zu benachrichtigen, dass sich der Satz unterstützter Modi geändert hat.

  5. Die Composer-HAL empfängt setActiveConfig(display, config=1) (aus Schritt 2).

  6. Der Composer HAL ignoriert den Aufruf, da die ID nicht mehr gültig ist.

  7. Das Framework empfängt und verarbeitet das onHotplug Ereignis aus Schritt 4. Es ruft die Composer-HAL mithilfe der Funktionen getDisplayConfigs und getDisplayAttribute . Mit diesen Funktionen ermittelt das Framework die neue ID (5) für die gewünschte Auflösung und Bildwiederholfrequenz von 1080x1920 und 60 Hz.

  8. Das Framework sendet ein weiteres setActiveConfig Ereignis mit einer aktualisierten ID von 5.

  9. Die Composer-HAL erhält setActiveConfig(display, config=5) aus Schritt 5.

  10. Die HAL interpretiert korrekt, dass das Framework eine Konfigurationsänderung auf 1080 x 1920 60 Hz angefordert hat.

Wie im obigen Beispiel gezeigt, stellt der Prozess, der sequenzielle ID-Zuweisungen verwendet, sicher, dass die Race-Bedingung verhindert wird und die richtige Anzeigekonfigurationsänderung aktualisiert wird.