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. O recurso "Reprodução com um toque" permite que um dispositivo de fonte de mídia ligue a TV e mude a porta de entrada automaticamente, para que você não precise procurar o controle remoto da TV para mudar do Chromecast para o Blu-ray player.

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 for a fonte ativa, ele tentará desligar a TV conectada.

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 com suporte variam de um para o outro. 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 ao 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 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 já 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 dele, para que funcione com os produtos que as pessoas já usam.

Design em geral

O HdmiControlService está conectado ao restante do sistema, como o framework de entrada de TV (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 no 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 se o dispositivo é um sink ou uma fonte HDMI, os fabricantes de dispositivos precisam definir ro.hdmi.device_type em device.mk para que 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 serve para proteger o serviço contra abuso por apps com intenções maliciosas.

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 do 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 Introdução aos tipos de HDMI-CEC 2.0 @1.1::IHdmiCec.hal
@1.1::IHdmiCecCallback.hal

Teste

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

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 a HDMI-CEC 2.0, a configuração do dispositivo e do usuário precisa ser definida para usar 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 momento da criação (por OEMs que usam RROs) e na 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 no momento, as opções permitidas podem ser consultadas pelos apps no momento da execução.