Servizio di controllo HDMI-CEC

Lo standard HDMI-CEC (High-Definition Multimedia Interface Consumer Electronics Control) consente ai prodotti multimediali di consumo di comunicare e scambiarsi informazioni. HDMI-CEC supporta molte funzionalità, come il passthrough del telecomando e il controllo audio del sistema, ma una delle più diffuse è One Touch Play. One Touch Play consente a un dispositivo di origine multimediale di accendere la TV e cambiare automaticamente la porta di input, in modo da non dover cercare il telecomando della TV per passare da Chromecast al lettore Blu-ray.

Con Android 12, il controllo risparmio energia del display collegato tramite HDMI è allineato al controllo risparmio energia del display interno. Quando un dispositivo di riproduzione HDMI si riattiva, tenta di riattivare la TV collegata e di diventare la sorgente attiva corrente tramite HDMI CEC One Touch Play. Se il dispositivo va in stato di sospensione mentre è la sorgente attiva corrente, tenta di spegnere la TV collegata.

Il supporto di HDMI-CEC è generalmente facoltativo. Tuttavia, la maggior parte dei produttori ha adottato HDMI-CEC in modo che i propri dispositivi funzionino con quelli di altre aziende. Ogni produttore implementa lo standard HDMI-CEC in modi diversi, quindi i dispositivi non sempre si capiscono e le funzionalità supportate variano da dispositivo a dispositivo. A causa di questa varianza, i consumatori non possono dare per scontato che due prodotti che dichiarano di supportare CEC siano completamente compatibili.

Il supporto di HDMI-CEC 2.0 contribuisce a migliorare la compatibilità tra i dispositivi HDMI se sia il dispositivo di invio sia quello di ricezione supportano questa versione dello standard.

Soluzione

Con l'introduzione di Android TV Input Framework (TIF), HDMI-CEC riunisce tutti i dispositivi connessi e riduce al minimo i problemi di compatibilità. Android ha creato un servizio di sistema chiamato HdmiControlService per alleviare questi problemi.

Offrendo HdmiControlService come parte dell'ecosistema Android, Android spera di fornire:

  • Un'implementazione standard di HDMI-CEC per tutti i produttori, che ridurrà l'incompatibilità dei dispositivi. In precedenza, i produttori dovevano sviluppare le proprie implementazioni di HDMI-CEC o utilizzare soluzioni di terze parti.
  • Un servizio che è stato testato a fondo con numerosi dispositivi HDMI-CEC già in commercio. Android ha condotto ricerche rigorose sui problemi di compatibilità riscontrati tra i prodotti e ha raccolto consigli utili da implementatori di dispositivi esperti nella tecnologia. Il servizio CEC è progettato per mantenere un sano equilibrio tra lo standard e le modifiche apportate a quest'ultimo, in modo che funzioni con i prodotti che le persone utilizzano già.

Design generale

HdmiControlService è connesso al resto del sistema, come TV Input Framework (TIF), al servizio audio e al servizio di alimentazione, per implementare le varie funzionalità specificate dallo standard.

Il seguente diagramma mostra il passaggio da un controller CEC personalizzato a un'implementazione del livello di astrazione hardware (HAL) HDMI-CEC più semplice.

Diagramma che mostra come è stato implementato HDMI-CEC prima e dopo Android 5.0

Figura 1. Sostituzione del servizio di controllo HDMI

Implementazione

Il seguente diagramma mostra una visualizzazione dettagliata del servizio di controllo HDMI.

Immagine che mostra i dettagli del servizio di controllo HDMI

Figura 2. Dettagli del servizio di controllo HDMI

Di seguito sono riportati gli elementi chiave per una corretta implementazione di HDMI-CEC su Android:

  • Una classe di gestione HdmiControlManager fornisce le API alle app con privilegi. I servizi di sistema come il servizio TV Input Manager e il servizio audio possono utilizzare il servizio direttamente.
  • Il servizio è progettato per consentire l'hosting di più di un tipo di dispositivo logico.
  • HDMI-CEC è connesso all'hardware tramite un livello di astrazione hardware (HAL) per semplificare la gestione delle differenze tra i meccanismi di protocollo e di segnalazione tra i dispositivi. La definizione HAL è disponibile per i produttori di dispositivi che possono utilizzarla per implementare il livello HAL.

Nota: i produttori di dispositivi devono aggiungere la seguente riga a PRODUCT_COPY_FILES in device.mk.

PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.hdmi.cec.xml:system/etc/permissions/android.hardware.hdmi.cec.xml

A seconda che il dispositivo sia un dispositivo sink HDMI o un dispositivo sorgente HDMI, i produttori di dispositivi devono impostare ro.hdmi.device_type in device.mk affinché HdmiControlService funzioni correttamente.

Per i dispositivi sorgente HDMI, come i dispositivi OTT (Over the Top) o STB (Set-top box), imposta:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=4

Per i dispositivi sink HDMI, come le TV a schermo piatto, imposta:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=0
  • Un controller CEC proprietario fornito dal produttore del dispositivo non può coesistere con HdmiControlService. Deve essere disattivato o rimosso. I requisiti comuni per questo derivano dalla necessità di gestire i comandi specifici del produttore. Il gestore di comandi specifici del produttore deve essere incorporato nel servizio estendendolo o modificandolo. Questo lavoro è lasciato al produttore del dispositivo e non è specificato da Android. Tieni presente che qualsiasi modifica apportata al servizio per i comandi specifici del produttore non deve interferire con la modalità di gestione dei comandi standard, altrimenti il dispositivo non sarà compatibile con Android.
  • L'accesso al servizio HDMI-CEC è protetto dal livello di protezione SignatureOrSystem. Solo i componenti di sistema o le app inserite in /system/priv-app possono accedere al servizio. Questo serve a proteggere il servizio da abusi da parte di app con intenti dannosi.

Android supporta i tipi TV/Display(0), Playback device(4) che possono emettere il comando One Touch Play per diventare la sorgente attiva e Audio System (5) che gestisce la modalità audio del sistema e ARC. Al momento non sono supportati altri tipi di dispositivi (sintonizzatore e registratore).

HAL HDMI-CEC

L'API HAL HDMI-CEC consente a HdmiControlService di utilizzare la risorsa hardware per inviare/ricevere comandi HDMI-CEC, configurare le impostazioni necessarie e (facoltativamente) comunicare con il microprocessore nella piattaforma sottostante che assumerà il controllo CEC mentre il sistema Android è in modalità standby.

Versione Funzionalità File HAL
1,0 Configura i dati HAL (indirizzi, funzionalità). Invia comandi HDMI-CEC. Registra il callback per ricevere comandi HDMI-CEC ed eventi hotplug. IHdmiCec.hal
IHdmiCecCallback.hal
1.1 Introduci i tipi HDMI-CEC 2.0 @1.1::IHdmiCec.hal
@1.1::IHdmiCecCallback.hal

Test

Le implementazioni HDMI-CEC dei dispositivi vengono testate e verificate tramite i test CTS in base alla documentazione CTS HDMI-CEC.

HDMI-CEC 2.0

I dispositivi sorgente (riproduzione) e sink (pannello TV) Android supportano HDMI-CEC 2.0. HDMI-CEC 2.0 offre una migliore interoperabilità tra i dispositivi HDMI, miglioramenti al passthrough del telecomando e test di certificazione più estesi. In genere, le interazioni HDMI-CEC 2.0 con altri dispositivi sono più efficienti, con conseguente riduzione del traffico HDMI-CEC e interazioni più rapide.

Affinché un dispositivo supporti HDMI-CEC 2.0, la configurazione del dispositivo e dell'utente deve essere impostata per utilizzare HDMI-CEC 2.0. L'implementazione HAL deve anche segnalare il supporto di HDMI-CEC 2.0 nelle chiamate a IHdmiCec#getCecVersion.

Configurazione CEC

Il comportamento di HDMI-CEC può essere configurato sia in tempo di compilazione (dai produttori OEM che utilizzano RRO) sia in tempo di esecuzione (da HdmiControlManager @SystemApi).

Esempi di impostazioni HDMI-CEC:

Impostazione Opzione
Indica se HDMI-CEC è attivato o disattivato. Attivato
Disattivato
Ambito dei messaggi di controllo risparmio energia HDMI-CEC inviati da un dispositivo di riproduzione. Solo alla TV
A TV e sistema audio
Trasmissione
Nessuno

Per ogni impostazione attualmente disponibile, le opzioni consentite possono essere richieste dalle app in fase di runtime.