HDMI-CEC 控制服务

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

借助 Android 12,HDMI 连接显示器的电源控制与内部显示器的电源控制保持一致。当 HDMI 播放设备唤醒时,它会尝试唤醒连接的电视,并通过 HDMI CEC 一键播放成为当前活动源。如果设备在作为当前活动源时进入休眠状态,则会尝试关闭连接的电视。

通常,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) 实现的描述。

Diagram that shows how HDMI-CEC was implemented before and after Android 5.0

图 1. HDMI 控制服务替换

实现

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

Image that shows how HDMI Control service details

图 2. HDMI 控制服务详情

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

  • 管理器类 HdmiControlManager 为特权应用提供 API。电视输入管理器服务和音频服务等系统服务可以直接使用该服务。
  • 该服务旨在允许托管多种类型的逻辑设备。
  • 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 源设备(例如 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)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 测试进行测试和验证,具体依据 HDMI-CEC CTS 文档

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 行为可以在构建时(由 OEM 使用 RRO)和运行时(由 HdmiControlManager @SystemApi)配置。

HDMI-CEC 设置示例

设置 选项
HDMI-CEC 是否启用。 已启用
已停用
播放设备发送的 HDMI-CEC 电源控制消息的范围。 仅限电视
电视和音频系统
广播

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