HDMI简介

HDMI简介

  • [1 HDMI引脚](#1 HDMI引脚)
  • TMDS传输原理
  • [2 传输流程](#2 传输流程)
  • [3 传输周期](#3 传输周期)
  • [4 Data Island Packet结构](#4 Data Island Packet结构)
  • [5 Audio Clock](#5 Audio Clock)
  • [6 HotPlug](#6 HotPlug)
  • [7 HDMI Sink](#7 HDMI Sink)
  • [8 Timing Detect](#8 Timing Detect)
  • [9 HDMI版权内容保护HDCP](#9 HDMI版权内容保护HDCP)
  • [10 HDMI Sink总流程](#10 HDMI Sink总流程)
  • [11 HDMI的时钟与带宽](#11 HDMI的时钟与带宽)
    • [11.1 像素时钟](#11.1 像素时钟)
    • [11.2 理论带宽](#11.2 理论带宽)
    • [11.3 TMDS时钟](#11.3 TMDS时钟)
  • [12 EDID](#12 EDID)

1 HDMI引脚

HDMI有A\B\C\D\E五种引脚类型

目前市面上比较常见的是Type A

  • TMDS Data0/1/2(1-9脚):共3对为数据传输实际上用到的脚,用TMDS编码格式
  • TMDS Clock(10-12脚):共1对TMDS时钟线,为TMDS时钟信号
  • CEC(13脚):HDMI的CEC通道引脚,可以通过CEC信号控制HDMI接口上所连的设备。(类似一种扩展的HDMI功能,供厂家自己定制HDMI消息,(比如说你有一台sony的DVD与TV,两者用HDMI线接上,如果你用TV的遥控器可以控制DVD,另DVD执行某种功能,那么该功能的命令信号就是通过TV与DVD间的CEC引脚传输的)
  • 14脚为保留引脚,未使用(也可以为CEC多提供一个脚)
  • IIC(15-16脚):用于DDC(Display Data Channel,主要用于EDID与HDCP的传输)传输。在HDMI流程中,DDC通信几乎是最先做的(此前有Hotplug),因为HDMI的主从设备需要通过DDC来获得对方设备的EDID,从而获得各种信息,并且通过比较timing以确定之后送出的timing为最合适的。
  • 17脚为接地引脚
  • 18脚为5v的AC引脚
  • 19为Hotplug(热插拔)引脚:用于检测HDMI设备有没有存在,如果存在(Hotplug为High)那么可以通过DDC去读EDID),HDMI有规定在HDMI 5vAC断电时source device可以读reciever device的EDID,也就是需要Hotplug为High。其中有两种Hotplug相关的情况会导致HDMI被识别为DVI:
    • Hotplug为High,不过EDID并没有准备好,那么信号源设备会由于无法读到EDID而认为接收设备为DVI,这样会导致HDMI有图像无声的问题。
    • Hotplug为Low,也会导致信号源无法读到EDID而认为接收设备为DVI,从而导致HDMI有图无声。
    • 在TV这种有多个HDMI通道的情况下,有时会在多个HDMI通道进行切换,切换后HDMI通道应当先初始化,即先把Hotplug拉低,通知HDMI source device之前所用的EDID已经改变,需要重新读取,那么source device在Hotplug被拉高的时候会去读取新的EDID,但是拉低这个过程至少需要100ms,否则source device有可能不会去读取新的EDID,从而输出DVI信号。

TMDS传输原理

电路结构

TMDS 通过差分信号传输数据,其电路由发射端(Transmitter)和接收端(Receiver)组成,关键设计如下:

  1. 发射端
    • 恒流源:10mA 恒流源驱动差分对(D+和D-)。
    • 开关控制:通过导通/断开切换电流路径,改变差分电压极性。
  2. 接收端
    • 上拉电阻:两个 50Ω 电阻(RT)将差分信号上拉到 3.3V(AVcc)。
    • 高阻抗输入 :接收端输入阻抗极高,电流几乎全部流经 RT。

2 传输流程

HDMI TMDS传输的数据类型有三种(加上Hsync与Vsync就算4种):

  1. Preamble(控制信息),主要用于控制接下来传输的数据是Data Island或者Video Data
  2. Data Island(数据包),各种类型的包信息,包括音频数据包,图像信息包等
  3. Video Data (视频信息),视频像素数据,HDMI可以传输RGB与YUV两种格式的像素数据
  4. 还有Hsync与Vsync

TMDS一个通道由2根差分线来传输信号,信号的"0"和"1"由两根线的电压差来决定:

  • TMDS差分线+为高电平 TMDS差分线-为低电平 => 1
  • TMDS差分线+为低电平 TMDS差分线-为高电平 => 0

HDMI的数据传输有TMDS0、TMDS1、TMDS2三个通道,每个通道的传输流程都是一样的。

如果是8bit的数据进入TMDS编码器,得到抗干扰性强的10bit TMDS信号,然后再进行串行化输出;在接收端收到串行的HDMI信号后,进行信号复原,得到10bit的TMDS信号,最后用TMDS解码器解码得到原来的8bit数据。

总体传输流程如下:

1、如果传输的是Video Data,并且格式为RGB,那么会占用三个通道的所有24bit输入,Channel0[7:0]用于传输B分量,Channel1[7:0]用于传输G分量,Channel2[7:0]用于传输R分量。

2、如果传输的是Data Island,则占用三个通道共10bit输入,Channel0[3:0]用于传输Data Island Header(包头),Channel1[0:3]与Channel2[0:3]用于传输Data Island Content(包内数据)。

3、如果是Preamble传输,则占用1,2两个通道共4bit输入,Channel1[1:0]与Channel2[1:0]分别为CTL0,CTL1,CTL2,CTL3,用于判断接下来输入的是Video Data或者Data Island

对于Hsync与VSync,会占用Channel0通道的两个bit输入,Channel0[0]为Hsync,Channel0[1]为Vsync


3 传输周期

HDMI的TMDS数据传输可以分为三个传输周期

  1. Control Period:(控制信号传输阶段)期间会传输Hsync,Vsync,并且在该时期的最后阶段会传输Preamble。
  2. Data Island Period:(音频和额外数据传输阶段)期间会传输Data Island(数据包),也会有Hsync与Vsync。对应D[3:0]会将4bit的数据串行化为10bit发出。
  3. Video Data Period:(视频数据传输阶段)期间会传输Video Data(视频像素数据)。此阶段传输实际的图像数据。对应D[7:0],会将8bit的数据编码并串行化为10bit发出

三个传输周期过渡如下:

1、左边是Control Period,传输有Hsync,Vsync与Preamble

2、中间是Data Island Period,传输有Hsync,Vsync,以及两个Packet Header与Packet(每32个clock 一个packet);另外Data Island的两端会用Guard Band保护并隔开Data Island的数据,因为这个阶段传输的数据大多是非常重要的,比如其中就有图像分辨率,决定后面的Video Data数据的显示方式

3、右边是Video Data Island,传输视频像素数据,在该时期的开头也有Guard Band


4 Data Island Packet结构

所有Data Island Packet都以32个时钟脉冲为一个周期,也就是说每32 clk传输一个包。

以上图为例,

  1. 包头部是BCH block 4,由Channel0[2]传输,32clk表示有32bit,则为4byte,前三个byte为包头,最后一byte为校验码
  2. 包体为BCH block 0,1,2,3,分别由Channel1,Channel2共8根线传输,共有24byte与6byte的校验码
  3. Parity Bits校验码是用于检验HDMI Cable传输过程中是否发生了错误,如果该Packet在HDMI接收端校验错误,如果只有一个bit的错误,那么可以修正,超过1bit的错误会被判别为无效Packet(由于HDMI是一直在发送数据因此无法重发错误Packet?)

所以说,在接收端,在解完包之后,需要取出各个BCH block的Parity bit,进行Calibration(校验)

Packet类型各种各样,详细请看HDMI Spec


5 Audio Clock

Audio的采样率有44100,48000,192000等,是各种各样,在HDMI传输时,Audio是PCM级(无压缩)传输,把PCM数据打散到各个包内,为了得到每个音频帧的数据,也需要知道Audio的采样率。HDMI中规定Audio的传输方式:

Audio采样率fs重建依靠的主要参数为:

  1. TMDS Clock
  2. CTS
  3. N

在发送设备这端,已知参数有采样率fs,视频时钟Video Clock(TMDS clock),以及预先设定好的参数N,求CTS:

在接收设备这端,TMDS clock通过硬件设备可以得到,N与CTS通过Audio Packet传输过来,求fs:

在接收端为了保持fs的稳定与精确,需要进行锁相,即用VCO(Voltage-controlled oscillator压控振荡器,通过电压控制产生的频率)产生合适的频率,然后用PFD(Phase Frequency Detector)来锁频


6 HotPlug

HotPlug即热拔插,当接上接口时就可以判定设备是否存在,以进行后续工作。

HDMI source device(HDMI HPD)会监测sink device的Hotplug端口,如果Hotplug为High,则证明设备可以工作,然后去读取DCC,如果为low,则证明设备已断开。

HDMI sink device应该通过把Hotplug拉低,来通知source device EDID已经被改变,那么source device在Hotplug被拉高后,就会重新来读取新的EDID,拉低这段时间应该多于100ms。

HDMI规定,HDMI 的5v引脚通电时,可以通过DCC去读取EDID,即需要保证Hotplug为high。


7 HDMI Sink

例如像TV这种就是HDMI的接收端,那么HDMI接收端需要做些什么东西。

HDMI可以接收到的有三个通道的TMDS Data,TMDS Clock,可以设置Hotplug,还有DCC传输用的I2C引脚。上面已经讲了TMDS Data,与设置Hotplug,接下来分析TMDS Clock。

TMDS Clock 就是Pixel Clock,即一个像素点所用的时钟频率。TMDS Clock通过clk 引脚传输到接收端,但是接收端并不清楚发送端发过来的TMDS Clock 频率为多少,因此需要通过Phy(PHY是模拟数字转换部分,不同于ADC,PHY是不知道采样频率的,需要自己锁频、锁相,侦测确切的输入频率)来进行锁相得到。但是由于HDMI频宽太宽(480P@60Hz为25.2MHz,1080P@60Hz为162MHz,甚至还有高达340MHz的),一般VCO(压控振荡器,通过电压控制产生的频率)无法覆盖这么大的范围,因此需要分频带来设置Phy:

先侦测输入频率落在哪个频带,然后根据不同频带做不同设置。


8 Timing Detect

在Sink端还有需要进行Timming Detect,因为如果设备可以支持(如chroma),HDMI可以自由更换Timming,而当Timming更换了之后,Sink需要重新设定Phy。因此,通过侦测频率的改变来检测是否更换了Timing是必要的。一般会有一个中断服务(或循环)线程来侦测频率的改变,一旦频率改变后,该进程会通知重新设定Phy,保证HDMI的正确运行


9 HDMI版权内容保护HDCP

HDCP通过DDC传输

HDCP主要用于版权视频的保护,举例来说,如果有一台蓝光DVD播放机可以播放blueray DVD,并且该DVD已经获得HDCP授权,你现在想把该DVD影像输出到某台TV,但是该TV没有获得HDCP授权,那么该TV可能就没法播放影像,或者播放质量下降,如出现雪花,图像从1080p变为480p,或者没有声音,都有可能。

HDCP是靠两个设备的交互进行HDCP授权认证的,认证流程如下

  1. Transmitter会发送一个key An(64bit)与Aksv(key selection vector 40bit)给Receiver

  2. Receiver接收到An后,也会发送一个Bksv以及REPEATER(表明B设备是否为Repeater设备)给Transmitter

  3. Transmitter开始HDCP认证码算法:

    要理解算法,首先我们需要知道ksv是用来干嘛的

    1. 在每个HDMI设备内部,都会保存40组64bit的key,key[40]
    2. 40bit的kvs,每一个bit都是一个索引,当kvs的某一位n为1时,会把key[n]取出来,
    3. 把所有的key[n]相加,得到km,
  4. Receiver也会做HDCP认证码算法这个步骤得到km'

  5. Transmitter与Receiver都会用km\km'去做hdcpBlkCipher,得到一个值R0与R0'

  6. 100ms后Receiver把R0'发送到Transmitter与R0做比较,相等则认为认证完毕。当然km = km'才能保证R0 = R0'。

  7. 此后的每一帧,Transmitter与Receiver都会运行一次hdcpBlockCipher,不过参数为上次生成的Ks与M,生成的新参数为Ks,M,T

  1. 在第128帧的时候,另R = T
  2. 在间隔第一次通信的2s后,再次进行认证
  3. 后续都采用7,8,9这三个步骤进行迭代认证

此外HDMI自1.1后还支持一个更快速与频繁的认证方式,就是上方设备通信图的下半部分

  1. 在每第16的倍数帧,用T与当前帧的Channel0的0像素做异或得到Pj
  2. Channel0的0像素到达Sink后,也与Sink的T`做异或得到P`j
  3. Sink把P'j发送到Source,与Pj做比较,相同则通过认证

了解HDCP对于处理HDMI的异常现象很有帮助,比如说如果时而出现雪花,有可能是信号不好导致Channel0的0像素出错,从而第二阶段的认证有时会不成功...


10 HDMI Sink总流程

  1. 提取与分割10bit的TMDS串行数据
  2. 10bit的数据,通过不同线路进来的,判断是哪种类型的:DE,Data Island,RGB,Hs,Vs,Ctrl
  3. TMDS解码
  4. HDCP解码,同时Hs,Vs,DE做delay
  5. RGB与DE,Hs,Vs...
  6. BCH解码得到Packet,错误验证
  7. Packet含义解析
  8. 如果是信息,则存到内存
  9. 如果是Audio Data,生成采样频率
  10. Audio输出

11 HDMI的时钟与带宽

11.1 像素时钟

我们分别以 RK3568 所支持的 1920x1080p@120Hz 和 4096x2304@60fps 这两个分辨率来算下对应的像素时钟:

1920x1080p@120Hz:1920×1080×120=248832000≈248.832MHz。

4096x2304@60Hz:4096×2304×60=566231040≈566.2MHz。

上面算出来的就是 1S 中要传输的像素数,也就是像素时钟。

11.2 理论带宽

前面我们计算出的是像素时钟,假设像素格式为 RGB888,也就是一个像素 24bit,那么对应的理论带宽就是:

1920x1080p@120Hz:1920 × 1080 × 120 × 24 = 5971968000 ≈ 6.0Gbps

4096x2304@60Hz:4096 × 2304 × 60 x 24 = 13589544960 ≈ 13.6Gbps。

可以看出仅传输视频最少就需要 13.6Gbps 的带宽,而 HDMI 不仅仅要传输视频,还要传输音频等其他信号,所以 HDMI 的实际带宽要大于 13.6Gpbs。

11.3 TMDS时钟

HDMI1.4b协议规定TMDS时钟最高340MHz,HDMI2.0协议将TMDS时钟加到了600MHz。

RK3568 的 HDMI 接口为 2.0 版本,我们就以 600MHz 的 TMDS 时钟计算一下 HDMI 接口实际提供的带宽。一个 TMDS 时钟单个通道传输 10bit 的数据,所以单个通道的带宽就是:

600000000×10 = 6Gpbs

一共有 3 个 TMDS 数据通道,所以总带宽就是:

6Gpbs×3=18Gbps

这个就是大家找 HDMI2.0 资料的时候,说的 18Gbps 带宽的来源。但是前面我们说了,TMDS 在传输的时候会将原始的 8bit 有效数据编码为 10bit,所以真实的有效带宽要再乘一个0.8,因此实际有效带宽为:

18Gpbs×0.8=14.4 Gbps

可以看出,实际有效带宽为 14.4Gbps,大于我们前面算出来的 13.6Gbps 要求。


12 EDID

HDMI 屏幕初始化的时候主控会读取屏幕的 EDID 信息,EDID 信息存放在显示器里面,主控通过 DDC 接口,也就是 IIC 接口来读取显示里面的 EDID 信息。EDID 信息包含了显示器特性、特点、分辨率、厂商、序列号、显示器的时序信息等。

现在的显示器发展非常快,显示器种类越来越多,不同尺寸、不同分辨率,甚至有些显示器还支持其他功能,比如 HDR 等。不同的显示器其分辨率和时序都不同,这个时候如果主控输出一个固定的分辨率和时序参数,这样的话会导致无法达到最佳显示效果,更严重的可能会损坏显示器。最好是显示器能主动告诉主控,它所支持的分辨率以及相应的时序参数,主控然后针对不同的显示器设置最佳的驱动参数。而这个就是 EDID 的功能,主动告诉主控显示器的参数信息,主控就可以使用最佳的参数驱动屏幕。

EDID 也发展迭代了很多版本,EDID 1.0~1.3 都是 128 个字节。后面提出了 EDID 1.4 和 E-EDID(增强型 EDID),将长度增加到 256 字节,不管哪个版本的 EDID,其前 128 字节内容是一样的。在 HDMI 显示器热插拔的时候会通过 DDC 通道读取显示器的 EDID 数据,其中前 128个字节必须符合 1.3 版本的 EDID,后 128 个字节必须符合 CEA-861 规定的结构。

EDID 前 128 个字节的含义如表所示:

以下链接是一个可以在线解析EDID的网站。
Web Based EDID Reader


相关推荐
2401_892070981 天前
【Linux C++ 日志系统实战】LogFile 日志文件管理核心:滚动策略、线程安全与方法全解析
linux·c++·日志系统·日志滚动
fie88891 天前
基于51单片机的航模遥控器6通道接收机程序
单片机·嵌入式硬件·51单片机
lwx9148521 天前
Linux-Shell算术运算
linux·运维·服务器
somi71 天前
ARM-驱动-02-Linux 内核开发环境搭建与编译
linux·运维·arm开发
bu_shuo1 天前
嵌入式硬件工程师VS单板硬件工程师
嵌入式硬件·电子工程师·单板硬件
llilian_161 天前
选择北斗导航卫星信号模拟器注意事项总结 北斗导航卫星模拟器 北斗导航信号模拟器
功能测试·单片机·嵌入式硬件·测试工具·51单片机·硬件工程
BoomHe1 天前
Android AOSP13 原生 Launcher3 壁纸获取方式
android
双份浓缩馥芮白1 天前
【Docker】Linux 迁移 docker 目录(软链接)
linux·docker
Yyq130208696821 天前
MH2457,‌国产 32 位屏驱 MCU‌芯片,支持‌1080P 高清显示‌与‌以太网通信‌,广泛应用于两轮车仪表盘及工控屏等领域
单片机·嵌入式硬件
黄昏晓x1 天前
Linux ---- UDP和TCP
linux·tcp/ip·udp