Serviço de controle HDMI-CEC

O padrão de controle de eletrônicos de consumo de interface multimídia de alta definição (HDMI-CEC) permite que produtos de consumo multimídia se comuniquem e troquem informações entre si. O HDMI-CEC oferece suporte a muitos recursos, como Remote Control Passthrough e System Audio Control, mas um dos mais usados é o One Touch Play. Com o recurso "Tocar para reproduzir", 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 um player de Blu-ray.

Com o Android 12, o controle de energia da tela conectada por HDMI se alinha 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 usando o recurso de reprodução com um toque do HDMI CEC. Se o dispositivo entrar em modo de espera enquanto for a fonte ativa, ele tentará desligar a TV conectada.

O suporte ao 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 entre eles. Devido a essa variação, os consumidores não podem presumir com segurança que dois produtos que afirmam ter suporte a CEC são totalmente compatíveis.

O suporte ao HDMI-CEC 2.0 ajuda a melhorar a compatibilidade entre dispositivos HDMI se os dispositivos de envio e 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 problemas de compatibilidade. O Android criou um serviço de sistema chamado HdmiControlService para aliviar esses problemas.

Ao oferecer o HdmiControlService como parte do ecossistema do Android, esperamos fornecer:

  • Uma implementação padrão do HDMI-CEC para todos os fabricantes, o que vai reduzir a incompatibilidade de dispositivos. Antes, os fabricantes precisavam desenvolver as próprias implementações do HDMI-CEC ou usar soluções de terceiros.
  • Um serviço bem testado em 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 experientes 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 TV Input Framework (TIF), serviço de áudio e serviço de energia, para implementar os vários recursos especificados pelo padrão.

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

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 HDMI

Implementação

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

Imagem que mostra 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 gerenciadora HdmiControlManager fornece aos apps privilegiados a API. Serviços do sistema, como o serviço TV Input Manager 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, na sigla em inglês) para simplificar o processamento das diferenças do protocolo e dos mecanismos de sinalização entre os dispositivos. A definição de HAL está disponível para os fabricantes de dispositivos usarem na implementação da camada HAL.

Observação: os fabricantes de dispositivos precisam adicionar a seguinte linha 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 receptor ou uma fonte HDMI, os fabricantes precisam definir ro.hdmi.device_type em device.mk para que HdmiControlService funcione corretamente.

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

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=4

Para dispositivos de receptor HDMI, como TVs de tela plana, 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 manipulador de comandos específico do fabricante precisa ser incorporado ao serviço estendendo/modificando-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. Caso contrário, 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 componentes do sistema ou os apps colocados em /system/priv-app podem acessar o serviço. Isso protege o serviço contra abusos de apps com intenções maliciosas.

O Android é compatível com os tipos TV/Display(0) e Playback device(4), que podem emitir o comando "Tocar com um toque" para se tornarem 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 HDMI-CEC

A API HAL HDMI-CEC permite que o HdmiControlService use o recurso de hardware para enviar/receber comandos HDMI-CEC, configurar as definições necessárias e (opcionalmente) se comunicar com o microprocessador na plataforma subjacente que assumirá o controle do 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 um callback para receber comandos HDMI-CEC e eventos de hotplug. IHdmiCec.hal
IHdmiCecCallback.hal
1.1 Apresentar os 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 com testes do CTS de acordo com a documentação do CTS de HDMI-CEC.

HDMI-CEC 2.0

Os dispositivos de origem (reprodução) e de destino (painel da TV) Android são compatíveis com HDMI-CEC 2.0. O HDMI-CEC 2.0 oferece melhor interoperabilidade entre dispositivos HDMI, melhorias no Remote Control Passthrough 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 de HDMI-CEC e interações mais rápidas.

Para que um dispositivo seja compatível com 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 da HAL também precisa informar a compatibilidade com HDMI-CEC 2.0 em chamadas para IHdmiCec#getCecVersion.

Configuração do CEC

O comportamento do HDMI-CEC pode ser configurado durante a criação (por OEMs usando RROs) e a 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 HDMI-CEC enviadas por um dispositivo de mídia. Somente para a TV
Para a TV e o sistema de áudio
Transmissão
Nenhum

Para cada configuração disponível, as opções permitidas podem ser consultadas pelos apps durante a execução.