Serviço de controle HDMI-CEC

O padrão de interface multimídia de alta definição para controle de eletrônicos de consumo (HDMI-CEC) permite que produtos multimídia de consumo se comuniquem e troquem informações entre si. O HDMI-CEC oferece suporte a muitos recursos, como transmissão de controle remoto e controle de áudio do sistema, mas um dos mais populares é o One Touch Play. Com o recurso One Touch Play, um dispositivo de fonte de mídia pode ligar a TV e mudar a porta de entrada automaticamente. Assim, você não precisa procurar o controle remoto da TV para mudar do Chromecast para o player de Blu-ray.

Com o Android 12, o controle de energia da tela conectada por HDMI é alinhado ao controle de energia da tela interna. Quando um dispositivo de reprodução HDMI é ativado, ele tenta ativar a TV conectada e se tornar a fonte ativa atual pelo recurso HDMI CEC One Touch Play. Se o dispositivo entrar no modo de suspensão enquanto estiver a fonte ativa no momento, ele tentará desligar a smart TV.

O suporte a HDMI-CEC geralmente é opcional. No entanto, a maioria dos fabricantes adotou o HDMI-CEC para que os dispositivos funcionem com os de outras empresas. Cada fabricante implementa o padrão HDMI-CEC de maneiras diferentes. Por isso, os dispositivos nem sempre se entendem, e os recursos compatíveis variam de acordo com o dispositivo. Por causa dessa variação, os consumidores não podem assumir com segurança que dois produtos que afirmam ter suporte ao CEC são totalmente compatíveis.

O suporte a HDMI-CEC 2.0 ajuda a melhorar a compatibilidade entre dispositivos HDMI se o dispositivo de envio e o de recebimento forem compatíveis com essa versão do padrão.

Solução

Com a introdução do Android TV Input Framework (TIF), o HDMI-CEC reúne todos os dispositivos conectados e minimiza os problemas de compatibilidade. O Android criou um serviço do sistema chamado HdmiControlService para aliviar esses problemas.

Ao oferecer HdmiControlService como parte do ecossistema Android, o Android espera oferecer:

  • Uma implementação padrão do HDMI-CEC para todos os fabricantes, o que reduz a incompatibilidade de dispositivos. Antes, os fabricantes precisavam desenvolver as próprias implementações de HDMI-CEC ou usar soluções de terceiros.
  • Um serviço bem testado em relação a vários dispositivos HDMI-CEC que já estão no mercado. O Android tem realizado pesquisas rigorosas sobre problemas de compatibilidade encontrados entre os produtos e coletado conselhos úteis de implementadores de dispositivos com experiência na tecnologia. O serviço CEC foi projetado para manter um equilíbrio saudável entre o padrão e as modificações dessa norma, para que funcione com os produtos que as pessoas já usam.

Design em geral

O HdmiControlService está conectado ao restante do sistema, como o TV Input Framework (TIF), o serviço de áudio e o serviço de energia, para implementar os vários recursos especificados pelo padrão.

Consulte o diagrama a seguir para conferir uma representação da mudança de um controlador CEC personalizado para uma implementação da camada de abstração de hardware HDMI-CEC mais simples (HAL).

Diagrama que mostra como o HDMI-CEC foi implementado antes e depois do Android 5.0

Figura 1. Substituição do serviço de controle de HDMI

Implementação

Consulte o diagrama a seguir para conferir uma visão detalhada do serviço de controle HDMI.

Imagem que mostra como os detalhes do serviço de controle HDMI

Figura 2. Detalhes do serviço de controle HDMI

Estes são os principais ingredientes para uma implementação adequada do HDMI-CEC do Android:

  • Uma classe de gerenciador HdmiControlManager fornece apps privilegiados com a API. Serviços do sistema, como o serviço de gerenciamento de entrada de TV e o serviço de áudio, podem usar o serviço diretamente.
  • O serviço foi projetado para permitir a hospedagem de mais de um tipo de dispositivo lógico.
  • O HDMI-CEC é conectado ao hardware por uma camada de abstração de hardware (HAL) para simplificar o processamento de diferenças do protocolo e dos mecanismos de sinalização entre os dispositivos. A definição de HAL está disponível para fabricantes de dispositivos usar para implementar a camada HAL.

Observação: os fabricantes de dispositivos precisam adicionar a linha a seguir a PRODUCT_COPY_FILES em device.mk.

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

Dependendo de o dispositivo ser um dispositivo de coletor HDMI ou um dispositivo de origem HDMI, os fabricantes precisam definir ro.hdmi.device_type em device.mk para que o HdmiControlService funcione corretamente.

Para dispositivos de origem HDMI, como dispositivos over-the-top (OTT) ou conversores (STB), defina:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=4

Para dispositivos de sink HDMI, como TVs de painel, defina:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=0
  • Um controlador CEC proprietário fornecido pelo fabricante do dispositivo não pode coexistir com HdmiControlService. Ele precisa ser desativado ou removido. Os requisitos comuns para isso vêm da necessidade de processar comandos específicos do fabricante. O gerenciador de comandos específico do fabricante precisa ser incorporado ao serviço por meio de extensão/modificação. Esse trabalho é deixado para o fabricante do dispositivo e não é especificado pelo Android. Qualquer mudança feita no serviço para comandos específicos do fabricante não pode interferir na forma como os comandos padrão são processados, ou o dispositivo não será compatível com o Android.
  • O acesso ao serviço HDMI-CEC é protegido com o nível de proteção SignatureOrSystem. Somente os componentes do sistema ou os apps colocados em /system/priv-app podem acessar o serviço. Isso protege o serviço contra abuso de apps com intenção maliciosa.

O Android oferece suporte ao tipo TV/Display(0), Playback device(4), que pode emitir o comando "One Touch Play" para se tornar a fonte ativa, e Audio System (5), que processa o modo de áudio do sistema e o ARC. Outros tipos de dispositivos (sintonizador e gravador) não são compatíveis no momento.

HAL do HDMI-CEC

A API HAL HDMI-CEC permite que o HdmiControlService use o recurso de hardware para enviar/receber comandos HDMI-CEC, configurar as configurações necessárias e (opcionalmente) se comunicar com o microprocessador na plataforma que vai assumir o controle CEC enquanto o sistema Android estiver no modo de espera.

Versão Recursos Arquivos HAL
1.0 Configure os dados da HAL (endereços, recursos). Enviar comandos HDMI-CEC. Registre o callback para receber comandos HDMI-CEC e eventos de hotplug. IHdmiCec.hal
IHdmiCecCallback.hal
1.1 Apresentação dos tipos de HDMI-CEC 2.0 @1.1::IHdmiCec.hal
@1.1::IHdmiCecCallback.hal

Teste

As implementações de dispositivos HDMI-CEC são testadas e verificadas por testes CTS de acordo com a documentação do HDMI-CEC CTS.

HDMI-CEC 2.0

Os dispositivos de origem (reprodução) e sink (painel de TV) do Android são compatíveis com HDMI-CEC 2.0. O HDMI-CEC 2.0 oferece melhor interoperabilidade entre dispositivos HDMI, melhorias no controle remoto e testes de certificação mais abrangentes. Em geral, as interações do HDMI-CEC 2.0 com outros dispositivos são mais eficientes, resultando em menos tráfego do HDMI-CEC e interações mais rápidas.

Para que um dispositivo ofereça suporte ao HDMI-CEC 2.0, a configuração do dispositivo e do usuário precisa ser definida para usar o HDMI-CEC 2.0. A implementação do HAL também precisa informar o suporte a HDMI-CEC 2.0 em chamadas para IHdmiCec#getCecVersion.

Configuração do CEC

O comportamento do HDMI-CEC pode ser configurado no tempo de build (por OEMs que usam RROs) e no ambiente de execução (por HdmiControlManager @SystemApi).

Exemplos de configurações de HDMI-CEC:

Configuração Opção
Se o HDMI-CEC está ativado ou desativado. Ativado
Desativado
Escopo das mensagens de controle de energia do HDMI-CEC enviadas por um dispositivo de reprodução. Para TV somente
Para TV e sistema de áudio
Transmissão
Nenhuma

Para cada configuração disponível e permitida, as opções podem ser consultadas por apps no momento da execução.