Skip to main content

HDMI-CEC 软件说明

本文档基于瑞芯微官方文档 Rockchip_Developer_Guide_HDMI-CEC_CN.pdf(V1.1.0, 2020-08-11)整理,介绍 Rockchip 平台 HDMI-CEC 的基本概念、软件架构与调试方法。

适用范围
  • 芯片平台:RK322X / RK3328 / RK3368 / RK3399 / RK3288
  • 系统版本:Android 5.X 以上 / Linux kernel 4.4 / 4.19
  • 读者对象:技术支持工程师、软件开发工程师

一、CEC 简介

1.1 CEC 的定义

CEC 全称 Consumer Electronics Control(消费类电子控制),为用户环境中所有通过 HDMI 线连接的家庭视听设备提供高级控制功能。用户通过一个遥控器即可对所有连接的设备进行控制。

典型应用: 用电视遥控器同时控制电视和盒子,或用盒子遥控器同时控制电视和盒子。

1.2 CEC 协议简介

网络拓扑

CEC 假定系统内所有音视频信号源产品直接或间接连接到一个"根"显示设备,通过 HDMI 线连接成自上而下的树状结构:

  • 显示设备作为"根"
  • 信号开关设备作为"枝"
  • 信号源产品作为"叶"节点

物理地址

每个设备有且仅有一个物理地址,软件通过 EDID 为 CEC 网络中的所有设备分配物理地址。

逻辑地址

每个连接到 CEC 总线上的设备必须绑定一个逻辑地址,定义设备类型。

  • 每个逻辑地址只能绑定唯一一个设备(15 除外)
  • 大多数设备只绑定一个逻辑地址,少数设备最多可绑定两个

逻辑地址分配流程: 发送 SRC 和 DST 地址相同的 POLL MSG 来确认地址是否已被占用。

CEC 消息格式

CEC 设备通过发送 CEC MSG 通信。CEC MSG 由多个或单个 Block 组成:

Block 格式:

  • 8 bit Header/Data
  • 1 bit EOM(End of Message,1 表示消息结束)
  • 1 bit ACK(响应位,发送方置 1,接收方成功收到后置 0)

Header Block(第一个 Block):

  • 高 4 位:发送方 Logical address
  • 低 4 位:接收方 Logical address

Data Block:OPCODE 或参数。


二、CEC 代码介绍

2.1 Android CEC 框架介绍

2.1.1 Android CEC 框架概述

Android TIF(TV Input Framework)引入了 HDMI-CEC,让连接设备能够相互通信并降低兼容性问题。

核心组成部分:

  1. HdmiControlManager — 向有权限的应用提供 API
    • 路径:frameworks/base/core/java/android/hardware/hdmi
  2. HdmiControlService — 系统服务,实现 CEC 标准
    • 路径:frameworks/base/services/core/java/com/android/server/hdmi
  3. HDMI-CEC HAL — 硬件抽象层,抽象硬件差异

2.1.1.1 HdmiControlService

与系统其他部分(TIF、Audio 服务、电源管理服务等)协作实现 CEC 标准。设计用于支持多种类型的逻辑设备。

2.1.1.2 HDMI-CEC HAL

设备制造商必须按照 Android 定义实现 HAL。HAL 提供以下 API:

TX/RX/事件:

  • send_message — 发送 CEC 消息
  • register_event_callback — 注册事件回调

信息:

  • get_physical_address — 获取物理地址
  • get_version — 获取 CEC 版本
  • get_vendor_id — 获取厂商 ID
  • get_port_info — 获取 HDMI 端口信息

逻辑地址:

  • add_logical_address — 添加逻辑地址
  • clear_logical_address — 清除逻辑地址

状态:

  • is_connected — 连接状态
  • set_option — 设置选项
  • set_audio_return_channel — 设置 ARC

2.2 Linux HDMI CEC 应用说明

2.2.1 v4l-utils 的安装

Linux 下使用 v4l-utils 工具进行 CEC 调试。

2.2.2 相关命令

使用 cec-ctl 等命令进行 CEC 控制和调试。

2.3 CEC 软件流程介绍

2.3.1 CEC 初始化流程

驱动注册流程
初始化设置流程

2.3.2 CEC 消息发送流程

2.3.3 CEC 消息接收流程

2.3.4 CEC 事件处理流程

2.4 新增 CEC Feature 常用接口


三、常用 DEBUG 方法

3.1 DEBUG 脚本

3.1.1 log 内容说明

3.1.2 CEC DEBUG 节点说明

# 查看 CEC 相关 debug 节点
ls /sys/class/cec/

3.1.3 CEC kernel log 开启方法

echo 0x1f > /sys/module/cec/parameters/debug

3.2 常见异常排查方法

3.2.1 所有 CEC 功能都失效的场景

排查方向:

  • CEC 物理连接是否正常
  • CEC 驱动是否加载
  • 逻辑地址分配是否成功
  • CEC 总线电平是否正常

3.2.2 电视待机,盒子未进入待机

排查方向:

  • 电视是否发送了正确的 CEC 待机命令
  • 盒子是否正确接收并解析命令
  • 电源管理服务是否响应

3.2.3 盒子待机,电视未进入待机

排查方向:

  • 盒子是否发送了待机命令
  • 电视是否支持待机命令
  • CEC 消息是否成功传输

3.2.4 盒子唤醒,电视未被唤醒

排查方向:

  • 盒子是否发送了唤醒命令
  • 电视是否支持 CEC 唤醒
  • CEC 总线在待机状态下是否保持供电

3.2.5 电视遥控器无法控制盒子的 UI

排查方向:

  • 电视是否发送了正确的按键消息
  • 盒子是否正确接收并映射按键
  • HdmiControlService 是否正常工作

参考资料

  • 原始文档:Rockchip_Developer_Guide_HDMI-CEC_CN.pdf V1.1.0
  • 瑞芯微官网:www.rock-chips.com