CEC是提供给用户的一种用于各种视听设备之间的高级控制功能协议,条件是视听设备必须有HDMI信号接口,消费电子控制,也就是设备之间的通信协议.
词汇表
Broadcast Message:送到logcal address 15,所有device都可以收到
Clear: 设为empty/undenfined state, physical address则为F.F.F.F,logical address为15
Destination: 收cec message的device
Follower: 收到cec message且需做response
Initiator: 送cec message且等待response
Source Device: 正在提供av streaming的device
CEC基本概念
CEC命令的结构
Start + Header block(谁发给谁的)+Opcode(命令是什么)+Operand(带了什么参数)
Block Name | Description | Value |
---|---|---|
Start | Special Start ‘bit’ | N/A |
Header (谁发给谁的) | Source/Destination Logical address | 见Logical Addresses |
opcode (命令是什么) | 命令的操作码(可选) | 见Message Descriptions |
operand (带了什么参数) | 命令的操作码的参数(可选) | 见Operand Descriptions |
Start
Start Bit Timing
Data Timing
logical 0
logical 1
Header Block
Header Block Details
Header[0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9] |
---|---|---|---|---|---|---|---|---|---|
3 | 2 | 1 | 0 | 3 | 2 | 1 | 0 | - | - |
Initiator[0] | I[1] | I[2] | I[3] | Destination[0] | D[1] | D[2] | D[3] | EOM | ACK |
- Initiator Logical address:该字段由4 Bit组成,位于Header Block的0-3 Bit,用于标识当前帧的发起方的逻辑地址字段.
- Destination Logical address:该字段由4 Bit组成,位于Header Block的4-7 Bit,用于标识当前帧的目的地的地逻辑地址字段.
- End Of Message(EOM):该字段在每个10bit的block里面都会存在,代表结束位.当EOM为1的时候代表这个Frame结束.而位于Header Block的Bit 8的EOM为1的时候,代表ping某个device,即”polling message”.
- Acknowledge(ACK):该字段位于Header Block的Bit 9,TV利用枚举的方式,向所有LA送 Null cmd, 当某个LA存在时,它会将 ACK bit set to 0, chip有reg去获得这个ACK, 当收到 ACK 为 0 时, 就验证了此 Device 的存在.而如果是broadcast的msg,其他device不要把ACK置0,不然Initiator会认为msg被reject了.
比如, TV发”Polling Message”给Tuner 2的Header Block Frame如下(ACK的置取决于对Tuner2):
Header[0] | [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9] |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | - |
Initiator[0] | I[1] | I[2] | I[3] | Destination[0] | D[1] | D[2] | D[3] | EOM | ACK |
Physical Address(PA)
在一个固定的 CEC 网络中,每一台 CEC device 的唯一标识,它是 device 通过 DDC 读 EDID 得到的,由 2个byte 组成。
PhysicallAddress | Device |
---|---|
0.0.0.0(0x00) | TV |
- 物理地址的分配(Physical Address Allocation)
HDMI SPEC提供的伪代码
The following algorithm is used to allocate the physical address of each device whenever HPD is
de-asserted or upon power-up:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26Disable assertion of HPD to all source devices
If I am CEC root
Set my_address to 0.0.0.0
Else
Wait for HPD from sink
Query sink for my_address of my connection (Section 8.7.4)
The device shall retain this physical address until HPD is
removed (or the device is powered off).
End if
If device has connections for source devices then
Label all possible connections to source devices uniquely starting
from connection_label = 1 to the number of source input connections
If device has separate EDIDs for each source connection then
If my_address ends with 0 then
Set each source_physical_address to my_address with the
first 0 being replaced with connection_label.
Else (i.e. beyond the fifth layer of the tree)
Set each source_physical_address to F.F.F.F
End if
Else
Set each source_physical_address to my_address
End if
Write source_physical_address to HDMI VSDB in EDID for each source
connection
End if
Allow HPD to be asserted for source devices
Logical Address(LA)
每个设备还有一个唯一的逻辑地址, 它定义了设备类型. 它出现在 CEC Bus 每条 CEC cmd 的 signal line 上, 用以标识每条 cmd 到达的目的地.
一个设备通过一个逻辑地址来表示一个功能, 如果一个物理设备包含有超过一个设备类型的功能, 它将给每个功能分配一个逻辑地址. 比如当一个可以录像的DVD设备, LA=4 or 8 那么它录像功能将无法通过CEC来使用, 必须用LA=1 or 2才行.
LA由 4 bit 组成,spec规定只有如下几种 LA 的 device:
LogicalAddress | Device |
---|---|
0 | TV |
1 | Recording Device 1 |
2 | Recording Device 2 |
3 | Tuner 1 |
4 | Playback Device 1 |
5 | Audio System |
6 | Tuner 2 |
7 | Tuner 3 |
8 | Playback Device 2 |
9 | Recording Device 3 |
10 | Tuner 4 |
11 | Playback Device 3 |
12 | Reserved |
13 | Reserved |
14 | Specific Use |
15 | Unregistered(as Initator address) / Broadcast(as Destination address) |
- 逻辑地址的分配(Logical Address Allocation)
只有当设备具有有效的物理地址(即不是F.F.F.F)时,才应该分配逻辑地址,在其他所有时间,设备LA应该设置为15(Unregistered(as Initator address)).
只有物理地址为0.0.0.0的设备可以采用LA=0(TV),任何其他PA的TV应采用LA=14(Specific Use)。如果14已经被分配,就设置LA=15.
在对于给定设备类型(例如,调谐器1,调谐器2等)可用的多于一个可能的逻辑地址的情况下,将由新连接的设备执行地址分配过程。设备获取该设备类型的第一个分配地址,并向同一个地址(例如Tuner 1→Tuner 1)发送”Polling Message”。如果未确认”Polling Message”,则设备停止过程并保留该地址。
如果第一个地址被确认,则设备获取该设备类型的下一个地址,并重复该过程(例如,Tuner 2→Tuner 2)。再次,如果消息未被确认,则设备保留该地址。
该过程继续,直到所有可能的“类型特定”地址被检查;如果没有“类型特定”地址可用,则设备应该取得LA=15。请注意,多个物理设备可能共享此地址。
设备断开或关闭时可能会丢失其逻辑地址。然而,它可以记住其先前的逻辑地址,使得下次重新连接或打开它时,它可以在其先前逻辑地址开始轮询过程,并在获取未注册地址之前依次尝试每个其他可允许的逻辑地址。
例如,如果先前分配了地址Tuner 2的STB被重新连接,则它将在获取Unregistered之前轮询Tuner 2,Tuner 3,Tuner 4和Tuner 1。
如果设备在任何时间丢失其物理地址(例如,其被拔出),则其LA=15(Unregistered).
通过LA和PA可以唯一确定一台CEC device的物理空间位置,并实现控制该CEC device
opcode Block
CEC常用的opcode如下表:
Category | Opcode | value | Description |
---|---|---|---|
One Touch Play | <Active Source> 1 |
0x82 | 被一个新接入的设备所使用,表示它已开始传输流或者用于响应<Resquest Active Source> |
Routing Control | <Active Source> 2 |
0x82 | 同上? |
Routing Control | <Request Active Source> |
0x85 | TV告诉设备需要切换source |
Routing Control | <Routing Change> |
0x80 | 从non-HDMI source切到HDMI source或HDMI source之间互切需要发送给设备 |
Routing Control | <Routing Information> |
0x81 | TV询问设备当前活动的route是哪一个 |
Standby | <Standby> |
0x36 | TV告诉设备需要待机 |
System Information | <Give Physical Address> |
0x83 | 请求某个设备的物理地址 |
System Information | <Polling Message> |
- | 用于TV发现是否存在设备,类似于ping等其他协议 |
System Information | <Report Physical Address> |
0x84 | 用于告诉其他所有其他设备它自己的物理地址 |
Deck Control | <Play> |
0x41 | 用于TV控制设备的播放行为 |
Vendor Specific Commands | <Device Vendor ID> |
0x87 | 报告本设备的供应商ID |
Device Menu Control | <User Control Pressed> 10 |
0x44 | 用于表示用户按下远程控制按钮或从一个远程控制按钮切换到另一个远程控制按钮,也可以作为一个不直接由用户发起的命令 |
Device Menu Control | <User Control Released> 11 |
0x45 | 表示用户松开了一个远程控制按钮(最后一个被User Control Pressed发出的按钮),也可以用在作为一个不直接由用户发起的命令之后 |
Power Status | <Give Device Power Status> |
0x8F | 设备报告自己的电源状态 |
Power Status | <Report Power Status> |
0x90 | TV请求设备报告电源状态,一般有Standby、On等状态 |
System Audio Control | <Give Audio Status> |
0x71 | TV请求设备报告音量的大小 |
System Audio Control | <Give System Audio Mode Status> |
0x7D | TV请求设备报告当前声音模式的状态 |
System Audio Control | <Report Audio Status> |
0x7A | 设备报告自己音量大小是多少 |
System Audio Control | <System Audio Mode Request> |
0x70 | TV请求特定物理地址的功放报告:系统声音模式 |
System Audio Control | <System Audio Mode Status> |
0x7E | 活动的功放回应它当前的系统声音模式是什么,有S/PDIF、ARC |
TIF CEC:
1.LA需要提前设置:1
2
3
4
5device manufacturers need to set ro.hdmi.device_type in device.mk
forHdmiControlService to work correctly.
For HDMI sink devices, like panel TVs, set:
device/mstar/muskmelon_tif/device.mk:
PRODUCT_PROPERTY_OVERRIDES += ro.hdmi.device_type=0