一、hdmi cec简介
CEC,全称是Consumer Electronics Control,消费类电子控制。为用户环境中所有通过HDMI线连接的家庭视听设备提供高级控制功能的一种协议,用户通过一个遥控器即可对这些连接的设备进行控制。
如图所示,可以只用电视遥控器同时控制电视和盒子,或是只用盒子遥控器同时控制电视和盒子。
二 CEC架构
HDMI连接的一个系统内所有音视频信号源产品都直接或间接的连接到一个“根”显示设备,通过HDMI线连接成一个自上而下的树,显示设备作为“根”,不同的信号源产品作为“叶”节点。
CEC物理地址
为了使CEC能够寻址及控制拥有特定物理地址的设备,所有系统内的设备必须拥有物理地址。软件通过EDID为CEC网络中的所有设备分配物理地址。每个设备有且只能有一个物理地址。
内核中相关的函数:
cec_notifier_set_phys_addr_from_edid
cec_get_edid_phys_addr
cec_notifier_set_phys_addr
CEC逻辑地址
每一个连接到CEC控制总线上的设备都必须绑定逻辑地址,定义该设备的类型。每一个逻辑地址都只能绑定唯一一个设备(15除外)。大多数设备都只绑定一个逻辑地址,少数设备最多可以绑定两个逻辑地址。
Cec逻辑地址对应的设备类型
逻辑地址申请过程
根据cec协议logic address的绑定需要cec设备发出poll msg,当某个地址对poll msg无响应(nack)时,则说明改地址无设备占用,选定该地址为本设备的logic address。
内核中相关的函数:
cec_claim_log_addrs
cec_config_thread_func
dw_hdmi_cec_log_addr
CEC通信
cec设备之间的通信通过发送cec msg来实现。
cec msg由多个或单个block组成,block的格式如下,由8bit的header/data和1bit的EOM位和ACK位组成。其中EOM表示后续是否还有数据,为1时表示本条cec msg已经结束后续没有数据了。ACK为响应位,发送方将其置为1,接收方若成功收到该msg,则将其置为0,表示已经收到数据。
header block为cec msg的第一个block,information bits高4位为发送方的logical address,第4位为接收方的logical address。data block的information bits则是opcode或参数。
Linux kernel的hdmi cec驱动会建立一个字符设备/dev/cec0节点,提供open close ioctl poll标准接口,供上层调用操作;
cec_ioctl
cec_transmit(adap, fh, block, parg);
cec_receive(adap, fh, block, parg);
/sys/kernel/debug/cec/cec0/status节点可以查看cec的状态:如是否连接 地址信息等