HDMI-CEC控制服务

高清多媒体接口消费电子控制 (HDMI-CEC) 标准允许多媒体消费产品相互通信和交换信息。 HDMI-CEC 支持许多功能,例如远程控制直通和系统音频控制,但最受欢迎的功能之一是 One Touch Play。 One Touch Play 允许媒体源设备打开电视并自动切换其输入端口,因此您无需搜索电视遥控器即可从 Chromecast 切换到蓝光播放器。

在 Android 12 中,连接 HDMI 的显示器的电源控制与内部显示器的电源控制一致。当 HDMI 播放设备唤醒时,它会尝试唤醒连接的电视并通过 HDMI CEC One Touch Play 成为当前活动源。如果设备在当前处于活动状态时进入睡眠状态,则会尝试关闭连接的电视。

支持 HDMI-CEC 通常是可选的。但是,大多数制造商都采用了 HDMI-CEC,因此他们的设备可以与其他公司的设备配合使用。每个制造商以不同的方式实施 HDMI-CEC 标准,因此设备并不总是相互理解,并且支持的功能因设备而异。由于这种差异,消费者不能安全地假设声称支持 CEC 的两种产品是完全兼容的。

如果发送和接收设备都支持此版本的标准,则对 HDMI-CEC 2.0 的支持有助于提高 HDMI 设备之间的兼容性。

解决方案

随着 Android TV 输入框架 (TIF) 的推出,HDMI-CEC 汇集了所有连接的设备并最大限度地减少了兼容性问题。 Android 创建了一个名为HdmiControlService的系统服务来缓解这些痛点。

通过HdmiControlService作为 Android 生态系统的一部分提供,Android 希望提供:

  • 适用于所有制造商的 HDMI-CEC 标准实施,这将减少设备不兼容性。以前,制造商必须开发自己的 HDMI-CEC 实施或使用第三方解决方案。
  • 一项针对市场上已有的众多 HDMI-CEC 设备进行了良好测试的服务。 Android 一直在对产品之间发现的兼容性问题进行严格的研究,并从具有该技术经验的设备实施者那里收集有用的建议。 CEC 服务旨在保持标准和对该标准的修改之间的健康平衡,以便它与人们已经使用的产品一起使用。

整体设计

HdmiControlService与电视输入框架 (TIF)、音频服务和电源服务等系统的其余部分相连,以实现标准规定的各种功能。

有关从自定义 CEC 控制器切换到更简单的 HDMI-CEC 硬件抽象层 (HAL) 实现的描述,请参见下图。

显示在 Android 5.0 之前和之后如何实现 HDMI-CEC 的图表

图 1. HDMI 控制服务替换

执行

有关 HDMI 控制服务的详细视图,请参见下图。

显示 HDMI 控制服务详细信息的图像

图 2. HDMI 控制服务详细信息

以下是正确实现 Android HDMI-CEC 的关键要素:

  • 管理器类HdmiControlManager为特权应用程序提供 API。 TV Input Manager 服务和 Audio 服务等系统服务可以直接使用该服务。
  • 该服务旨在允许托管一种以上类型的逻辑设备。
  • HDMI-CEC 通过硬件抽象层 (HAL) 与硬件连接,以简化处理设备之间协议和信令机制的差异。 HAL 定义可供设备制造商用于实现 HAL 层。

注意:设备制造商应在device.mk中的PRODUCT_COPY_FILES中添加以下行。

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

根据您的设备是 HDMI 接收设备还是 HDMI 源设备,设备制造商需要在device.mk中设置ro.hdmi.device_type才能使HdmiControlService正常工作。

对于 HDMI 源设备,例如 Over the Top (OTT) 或机顶盒 (STB) 设备,设置:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=4

对于 HDMI 接收设备,如平板电视,设置:

PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=0
  • 设备制造商提供的专有 CEC 控制器不能与HdmiControlService共存。它必须被禁用或删除。对此的共同要求来自处理制造商特定命令的需要。应通过扩展/修改将制造商特定的命令处理程序合并到服务中。这项工作留给设备制造商,Android 未指定。请注意,对制造商特定命令的服务所做的任何更改都不得干扰标准命令的处理方式,否则设备将不兼容 Android。
  • 对 HDMI-CEC 服务的访问受到保护级别SignatureOrSystem的保护。只有系统组件或放置在/system/priv-app中的应用程序才能访问该服务。这是为了保护服务免受恶意应用程序的滥用。

Android 支持TV/Display(0)类型、可以发出 One Touch Play 命令成为活动源的Playback device(4)和处理系统音频模式和 ARC 的Audio System (5) 。目前不支持其他设备类型(调谐器和录音机)。

HDMI-CEC HAL

HDMI-CEC HAL API 让HdmiControlService利用硬件资源来发送/接收 HDMI-CEC 命令,配置必要的设置,并(可选)与底层平台中的微处理器通信,后者将在 Android 系统中接管 CEC 控制系统处于待机模式。

版本特征HAL 文件
1.0配置 HAL 数据(地址、功能)。发送 HDMI-CEC 命令。注册回调以接收 HDMI-CEC 命令和热插拔事件。 IHdmiCec.hal
IHdmiCecCallback.hal
1.1介绍 HDMI-CEC 2.0 类型@1.1::IHdmiCec.hal
@1.1::IHdmiCecCallback.hal

测试

根据HDMI-CEC CTS 文档,通过 CTS 测试对设备的 HDMI-CEC 实施进行测试和验证。

HDMI-CEC 2.0

Android 源(播放)和接收器(电视面板)设备支持 HDMI-CEC 2.0。 HDMI-CEC 2.0 提供了 HDMI 设备之间更好的互操作性、远程控制直通的改进以及更广泛的认证测试。一般来说,HDMI-CEC 2.0 与其他设备的交互效率更高,从而减少 HDMI-CEC 流量并加快交互速度。

对于支持 HDMI-CEC 2.0 的设备,必须将设备和用户配置设置为使用 HDMI-CEC 2.0。 HAL 实现还必须在对IHdmiCec#getCecVersion的调用中报告对 HDMI-CEC 2.0 的支持。

CEC 配置

HDMI-CEC 行为可以在构建时(由使用 RRO 的 OEM)和运行时(由HdmiControlManager @SystemApi)配置。

HDMI-CEC 设置示例:

环境选项
HDMI-CEC 是启用还是禁用。启用
已禁用
播放设备发送的 HDMI-CEC 功率控制消息的范围。仅限电视
至电视和音响系统
播送
没有任何

对于当前可用和允许的每个设置,应用程序可以在运行时查询。