赞
踩
HDMI,全称为(High Definition Multimedia Interface)高清多媒体接口,主要用于传输高清音视频信号。
HDMI有A,B,C,D,E五种引脚类型,目前市面中比较常见的就是Type A:
其中
DVI(24+1)支持视频信号,不支持音频输出。常见于电脑、显示器等设备上,是比较老的接口了,适用于输出设备连接显示设备,DVI最高可以支持2K。
HDMI TMDS传输的数据类型有三种(加上Hsync与Vsync就算4种):
HDMI的数据传输有TMDS0,TMDS1,TMDS2三个通道,每个通道的传输流程都是一样的:
如果是8bit的数据进入TMDS编码器,得到抗干扰性强的10bit TMDS信号,然后再进行串行化输出;在接收端收到串行的HDMI信号后,进行信号复原,得到10bit的TMDS信号,最后用TMDS解码器解码得到原来的8bit数据。
总体传输流程如下:
VSYNC: vertical synchronization,指与显示器的帧数同步。 简单来说就是启用了VSYNC的渲染过程,帧数不会超过显示器的帧数,一个同步会被执行。 同步的地方就是显示器扫描线结束最后一行扫描,并且准备开始第一行扫描的地方。
HSYNC: horizonal synchronization,相比于VSYNC来说,同步的单位从帧降到行,即是保证操作不是在扫描一行的中间出现,而是同步到下一行。
VBLANK: 显示器扫描线完成最后一行后,需要重返左上角。这个过程叫做: vblank,也叫VBI(vertical blank interval) ,因为扫描线变得blank,以防止看到一个斜线显示在屏幕上
VSYNC与HSYNC频率与什么有关系
HSYNC=VSYNC×总共的扫描行数
对于Hsync与VSync,会占用Channel0通道的两个bit输入,Channel0[0]为Hsync,Channel0[1]为Vsync
HDMI的TMDS数据传输可以分为三个传输周期:
某帧的总体周期如下:
三个传输周期的过渡如下:
所有Data Island Packet都以32个时钟脉冲为一个周期,也就是说每32 clk传输一个包。
以上图为例,
Packet类型各种各样,详细请看HDMI Spec
Audio的采样率有44100,48000,192000等,是各种各样,在HDMI传输时,Audio是PCM级(无压缩)传输,把PCM数据打散到各个包内,为了得到每个音频帧的数据,也需要知道Audio的采样率。HDMI中规定Audio的传输方式:
Audio采样率fs重建依靠的主要参数为:
在发送设备这端,已知参数有采样率fs,视频时钟Video Clock(TMDS clock),以及预先设定好的参数N,求CTS:
CTS=N∗fTMDS/128×fx
在接收设备这端,TMDS clock通过硬件设备可以得到,N,与CTS通过Audio Packet传输过来,求fs:
128∗fs=N×fTMDS/CTS
在接收端为了保持fs的稳定与精确,需要进行锁相,即用VCO(Voltage-controlled oscillator压控振荡器,通过电压控制产生的频率)产生合适的频率,然后用PFD(Phase Frequency Detector)来锁频:
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,有些Hotplug是直接接到5V上的(如下)。
Hotplug接法:(HDMI HPD(Hotplug detect ?)检测sink的Hotplug端)
上面用5V引脚进行供电,并接上Hotplug,这样做就能保证每次source device接上sink device时,都可以去读取到EDID。但是这样做有一个缺点,当5V电源断开时,会有5v的电压回灌给HDMI HPD与Hotplug,5V电压会冲击Hotplug,一旦Hotplug引脚无法承受5V电压的回灌,会被打穿。
下面有个较好的Hotplug接法:
上面用的是额外的GPIO引脚加上三极管控制HDMI HPD为0还是1,如果HDMI0_HPD_CTL输出0,那么三极管断开,HDMI0_HPD侦测到High,如果HDMI0_HPD_CTL输出1,那么三极管打通(导通),HDMI0_HPD侦测到low。
例如像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:
先侦测输入频率落在哪个频带,然后根据不同频带做不同设置。
用TV产生的晶振来数count,数得count后就知道TDMS Clock了
fcrystal=count×fTMDS
或者用1024个TMDS Clock来数晶振个数
1024×fTMDS=count×fcrystal
由于视频信号从RGB个8bit通过TMDS编码后变成了10bit,然后又串行化,所以实际用于接收TMDS Data所用的时钟应该为:
fReceiveClock=10×fTMDS
另外ReceiveClock也可以不用直接采用上面的乘法,而是采用TMDSClock为参考、硬件锁相的方法来得到。
得到ReceiveClock后就可以去设置频率PLL,然后对三个通道进行采样得到TMDS Data。
在Sink端还有需要进行Timming Detect,因为如果设备可以支持(如chroma),HDMI可以自由更换Timming,而当Timming更换了之后,Sink需要重新设定Phy。因此,通过侦测频率的改变来检测是否更换了Timing是必要的。一般会有一个中断服务(或循环)线程来侦测频率的改变,一旦频率改变后,该进程会通知重新设定Phy,保证HDMI的正确运行
HDCP通过DDC传输
HDCP主要用于版权视频的保护,举例来说,如果有一台蓝光DVD播放机可以播放blueray DVD,并且该DVD已经获得HDCP授权,你现在想把该DVD影像输出到某台TV,但是该TV没有获得HDCP授权,那么该TV可能就没法播放影像,或者播放质量下降,如出现雪花,图像从1080p变为480p,或者没有声音,都有可能。
HDCP是靠两个设备的交互进行HDCP授权认证的,认证流程如下
Transmitter会发送一个key An(64bit)与Aksv(key selection vector 40bit)给Receiver
Receiver接收到An后,也会发送一个Bkvs以及REPEATER(表明B设备是否为Repeater设备)给Transmitter
Transmitter开始HDCP认证码算法:
要理解算法,首先我们需要知道ksv是用来干嘛的
Receiver也会做HDCP认证码算法这个步骤得到km’
Transmitter与Receiver都会用km\km’去做hdcpBlkCipher,得到一个值R0与R0’
100ms后Receiver把R0’发送到Transmitter与R0做比较,相等则认为认证完毕。当然km = km’才能保证R0 = R0’。
7-此后的每一帧,Transmitter与Receiver都会运行一次hdcpBlockCipher,不过参数为上次生成的Ks与M,生成的新参数为Ks,M,T
此外HDMI自1.1后还支持一个更快速与频繁的认证方式,就是上方设备通信图的下半部分
了解HDCP对于处理HDMI的异常现象很有帮助,比如说如果时而出现雪花,有可能是信号不好导致Channel0的0像素出错,从而第二阶段的认证有时会不成功…
转自:https://www.cnblogs.com/TaigaCon/p/3840653.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。