Gestione dell'hot plug

Le funzionalità di visualizzazione (come le modalità di visualizzazione e i tipi HDR supportati) possono cambiare dinamicamente sui dispositivi dotati di display collegati esternamente (con HDMI o DisplayPort), come set-top-box Android TV (STB) e over-the-top (OTT) dispositivi. Questo cambiamento può verificarsi come risultato di un segnale hotplug HDMI, ad esempio quando l'utente passa da uno schermo all'altro o avvia il dispositivo senza uno schermo collegato. Android 12 e versioni successive includono modifiche al framework per gestire le funzionalità di hotplug e visualizzazione dinamica.

Questa pagina descrive la gestione degli hotplug di visualizzazione e le modifiche alle funzionalità di visualizzazione nell'implementazione HAL di Composer. Inoltre viene illustrato come gestire il framebuffer associato e prevenire le race conditions in queste situazioni.

Aggiorna le funzionalità di visualizzazione

Questa sezione descrive il modo in cui il framework Android gestisce le modifiche nelle funzionalità di visualizzazione avviate da Composer HAL.

Prima che Android possa gestire correttamente le modifiche alle funzionalità di visualizzazione, l'OEM deve implementare Composer HAL in modo tale da utilizzare onHotplug(display, connection=CONNECTED) per notificare al framework eventuali modifiche alle funzionalità di visualizzazione. Dopo l'implementazione, Android gestisce le modifiche alle funzionalità di visualizzazione come segue:

  1. Quando rileva un cambiamento nelle capacità di visualizzazione, il framework riceve una notifica onHotplug(display, connection=CONNECTED) .
  2. Alla ricezione della notifica, il framework elimina il proprio stato di visualizzazione e lo ricrea con le nuove funzionalità dell'HAL utilizzando i metodi getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities e getDisplayCapabilities .
  3. Dopo che il framework ha ricreato un nuovo stato di visualizzazione, invia il callback onDisplayChanged alle app che sono in ascolto per tali eventi.

Il framework rialloca i framebuffer sui successivi eventi onHotplug(display, connection=CONNECTED) . Vedere Gestione del framebuffer del client per ulteriori informazioni su come gestire correttamente la memoria del framebuffer per evitare errori durante l'allocazione di nuovi framebuffer.

Gestire scenari di connessione comuni

Questa sezione illustra come gestire correttamente vari scenari di connessione nelle implementazioni quando il display principale è connesso e disconnesso.

Essendo stato creato per i dispositivi mobili, il framework Android non dispone del supporto integrato per un display principale disconnesso. L'HAL deve invece sostituire il display primario con un display segnaposto nelle sue interazioni con il framework nel caso in cui un display primario sia fisicamente disconnesso.

I seguenti scenari possono verificarsi nei decoder e nei dongle TV dotati di display collegati esternamente che possono essere disconnessi. Per implementare il supporto per questi scenari, utilizzare le informazioni nella tabella seguente:

Scenario Gestione
Nessun display collegato al momento dell'avvio
  • Invia un segnale onHotplug(display, connection=CONNECTED) dall'HAL Composer al framework.
  • Sostituisci lo stato di visualizzazione fisico all'interno dell'HAL di Composer con uno stato di visualizzazione segnaposto.
Il display principale è fisicamente collegato
Il display principale è fisicamente disconnesso
  • Invia un altro evento onHotplug(display, connection=CONNECTED) dall'HAL Composer al framework.
  • Sostituisci lo stato di visualizzazione fisico all'interno dell'HAL di Composer con uno stato di visualizzazione segnaposto. La visualizzazione del segnaposto deve avere un'unica modalità di visualizzazione, in modo che il framework invii il callback onDisplayChanged alle app (perché il set di modalità supportate è cambiato). Questa modalità di visualizzazione singola deve corrispondere all'ultima modalità attiva del display fisico prima della disconnessione, in modo che le app non ricevano eventi di modifica della configurazione .

Utilizza ID di configurazione sequenziali per evitare condizioni di competizione

Possono verificarsi condizioni di competizione se l'HAL del compositore aggiorna le configurazioni di visualizzazione supportate contemporaneamente al framework che chiama setActiveConfig o setActiveConfigWithConstraints . La soluzione è implementare Composer HAL per utilizzare ID sequenziali e prevenire questo problema.

Questa sezione descrive come potrebbero verificarsi le condizioni di competizione, seguita da dettagli su come implementare Composer HAL in modo che utilizzi ID sequenziali per impedire tali condizioni.

Considera la seguente sequenza di eventi, quando nuovi ID sequenziali NON vengono assegnati alle nuove configurazioni di visualizzazione, causando una condizione di competizione:

  1. Gli ID di configurazione dello schermo supportati sono:

    • id=1 , 1080x1920 60 Hz
    • id=2 , 1080x1920 50 Hz
  2. Il framework chiama setActiveConfig(display, config=1) .

  3. Contemporaneamente, l'HAL Composer elabora una modifica delle configurazioni di visualizzazione e aggiorna il suo stato interno a un nuovo set di configurazioni di visualizzazione, mostrato come segue:

    • id=1 , 2160x3840 60 Hz
    • id=2 , 2160x3840 50 Hz
    • id=3 , 1080x1920 60 Hz
    • id=4 , 1080x1920 50 Hz
  4. L'HAL del compositore invia un evento onHotplug al framework, per notificare che l'insieme delle modalità supportate è cambiato.

  5. L'HAL del compositore riceve setActiveConfig(display, config=1) (dal passaggio 2).

  6. L'HAL interpreta che il framework ha richiesto una modifica della configurazione a 2160x3840 60 Hz , anche se in realtà si desiderava 1080x1920 60 Hz .

Il processo che utilizza assegnazioni di ID non sequenziali termina qui con un'errata interpretazione della modifica di configurazione desiderata.

Configurare l'HAL del compositore per utilizzare ID sequenziali

Per evitare tali condizioni di competizione, l'OEM deve implementare l'HAL del compositore come segue:

  • Quando l'HAL Composer aggiorna le configurazioni di visualizzazione supportate, assegna nuovi ID sequenziali alle nuove configurazioni di visualizzazione.
  • Quando il framework chiama setActiveConfig o setActiveConfigWithConstraints con un ID di configurazione non valido, l'HAL Composer ignora la chiamata.

Questi passaggi servono a prevenire le condizioni di competizione, come mostrato nella discussione seguente.

Considera la seguente sequenza di eventi, quando nuovi ID sequenziali vengono assegnati alle nuove configurazioni di visualizzazione:

  1. Gli ID di configurazione dello schermo supportati sono:

    • id=1 , 1080x1920 60Hz
    • id=2 , 1080x1920 50 Hz
  2. Il framework chiama setActiveConfig(display, config=1) .

  3. Quando viene elaborata una modifica delle configurazioni di visualizzazione, il set successivo di ID di configurazione viene assegnato a partire dal successivo numero intero inutilizzato, mostrato come segue:

    • id=3 , 2160x3840 60 Hz

    • id=4 , 2160x3840 50 Hz

    • id=5 , 1080x1920 60Hz

    • id=6 , 1080x1920 50Hz

  4. L'HAL Composer invia un evento onHotplug al framework, per notificare che l'insieme delle modalità supportate è cambiato.

  5. L'HAL del compositore riceve setActiveConfig(display, config=1) (dal passaggio 2).

  6. L'HAL del compositore ignora la chiamata poiché l'ID non è più valido.

  7. Il framework riceve ed elabora l'evento onHotplug dal passaggio 4. Chiama l'HAL Composer utilizzando le funzioni getDisplayConfigs e getDisplayAttribute . Con queste funzioni il framework identifica il nuovo ID (5) per la risoluzione desiderata e frequenza di aggiornamento di 1080x1920 e 60 Hz.

  8. Il framework invia un altro evento setActiveConfig con un ID aggiornato pari a 5.

  9. L'HAL Composer riceve setActiveConfig(display, config=5) dal passaggio 5.

  10. L'HAL interpreta correttamente che il framework ha richiesto una modifica della configurazione a 1080x1920 60 Hz.

Come mostrato nell'esempio precedente, il processo che utilizza le assegnazioni di ID sequenziali garantisce che la condizione di competizione venga impedita e che venga aggiornata la modifica corretta della configurazione del display.