7. HDMI接口
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7. HDMI接口相关的知识,希望对你有一定的参考价值。
参考技术A DDC(Display Data Channel)通道用于HDMI发送和接收端之间交换一些配置信息。发送端通过DDC通道,读取接收端保存在EEPROM中的EDID数据,获取接收端 的信息,确认接收端终端显示的设置和功能,决定跟接收端之间以什么格式传输音视频数据。CEC(Consumer Electronics Control)通道是可选通道。通过CEC通道,可以实现一些音视频设备间的高级控制功能,比如支持视频源和数字电视间的双向通信,实现单键按下同时开机、自动上电、自动信号路由、远程控制等功能。
图1 HDMI系统结构图
E-EDID数据结构
E-EDID是VESA组织定义的一种数据结构,是为PC显示器设置的优化显示格式数据规范,它存储在显示器中专 用的EEPROM存储器中,数据结构是128Byte, PC主机和显示器通过DDC通道访问存储器中的数据,以确定显示器的显示属性,如分辨率、纵横比等信息。此数据结构被HDMI采用,在HDMI规范中,同 样使用DDC通道访问EDID存储器,以确定显示设备的功能和属性。
HDMI规范规定,EDID的第一个128Byte必须是符合EDID1.3 的数据结构,第二个128Byte必须是符合EIA/CEA-861B 的CEA EDID时序扩展数据结构。
http://mzywqwq.blog.163.com/blog/static/958701220106191849334/
http://www.cnblogs.com/TaigaCon/p/3840653.html
HDMI,全称为(High Definition Multimedia Interface)高清多媒体接口,主要用于传输高清音视频信号。
HDMI引脚:
HDMI有A,B,C,D,E五种引脚类型,目前市面中比较常见的就是Type A:
其中
传输流程:
HDMI TMDS传输的数据类型有三种(加上Hsync与Vsync就算4种):
HDMI的数据传输有TMDS0,TMDS1,TMDS2三个通道,每个通道的传输流程都是一样的:
如果是8bit的数据进入TMDS编码器,得到抗干扰性强的10bit TMDS信号,然后再进行串行化输出;在接收端收到串行的HDMI信号后,进行信号复原,得到10bit的TMDS信号,最后用TMDS解码器解码得到原来的8bit数据。
总体传输流程如下:
如果传输的是 Video Data ,并且格式为RGB,那么会占用三个通道的所有 24bit 输入,Channel0[7:0]用于传输B,Channel1[7:0]用于传输G,Channel2[7:0]用于传输R。
如果传输的是 Data Island ,则占用三个通道共 10bit 输入,Channel0[3:2]用于传输Data Island Header(包头),Channel1[0:3]与Channel2[0:3]用于传输Data Island Content(包内数据)。
如果传输的是 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
传输时期:
HDMI的TMDS数据传输可以分为三个传输时期:
Control Period期间会传输Hsync,Vsync,并且在该时期的最后阶段会传输Preamble
Data Island Period期间会传输Data Island(数据包),也会有Hsync与Vsync
Video Data Period期间会传输Video Data(视频像素数据)
某帧的总体时期如下:
三个传输时期的过渡如下:
左边是Control Period,传输有Hsync,Vsync与Preamble
中间是Data Island Period,传输有Hsync,Vsync,以及两个Packet Header与Packet(每32个clock 一个packet);另外Data Island的两端会用Guard Band保护并隔开Data Island的数据,因为这个阶段传输的数据大多是非常重要的,比如其中就有图像分辨率,决定后面的Video Data数据的显示方式
右边是Video Data Island,传输视频像素数据,在该时期的开头也有Guard Band
Data Island Packet结构
所有Data Island Packet都以32个时钟脉冲为一个周期,也就是说每32 clk传输一个包。
以上图为例,
包头部是BCH block 4,由Channel0[2]传输,32clk表示有32bit,则为4byte,前三个byte为包头,最后一byte为校验码
包体为BCH block 0,1,2,3,分别由Channel1,Channel2共8根线传输,共有24byte与6byte的校验码
Parity Bits校验码是用于检验HDMI Cable传输过程中是否发生了错误,如果该Packet在HDMI接收端校验错误,如果只有一个bit的错误,那么可以修正,超过1bit的错误会被判 别为无效Packet(由于HDMI是一直在发送数据因此无法重发错误Packet?)
所以说,在接收端,在解完包之后,需要取出各个BCH block的Parity bit,进行Calibration(校验)
Packet类型各种各样,详细请看HDMI Spec
Audio Clock
Audio的采样率有44100,48000,192000等,是各种各样,在HDMI传输时,Audio是PCM级(无压缩)传输,把PCM数据打散到各个包内,为了得到每个音频帧的数据,也需要知道Audio的采样率。HDMI中规定Audio的传输方式:
Audio采样率fs重建依靠的主要参数为:
TMDS Clock
CTS
N
在发送设备这端,已知参数有采样率fs,视频时钟Video Clock(TMDS clock),以及预先设定好的参数N,求CTS:
CTS=N∗fTMDS128×fx
在接收设备这端,TMDS clock通过硬件设备可以得到,N,与CTS通过Audio Packet传输过来,求fs:
128∗fs=N×fTMDSCTS
在接收端为了保持fs的稳定与精确,需要进行锁相,即用VCO( Voltage-controlled oscillator 压控振荡器,通过电压控制产生的频率)产生合适的频率,然后用PFD( Phase Frequency Detector )来锁频
1. 首先,由于VCO有个最佳的工作区域如(200MHz~500MHz),那么为了保证VCO在最佳工作频率内,我们可以从后倒推回来,先对输出的fa128做乘法得到
fvco=fa128×S×S2
由于fa128只有那么几种(44.1k,48k等),所以比较容易得到S与S2
2. 然后,为了更快进行频率匹配,需要对近来的频率fx(就是晶振时钟fcrystal)或者fv(pixel clock)做除法,也对fvco做除法,令两个趋向相等。对于细微的区别可以用D Code 进行修正
fvcoM=fxK
3. 最后做PFD锁相
4. 第2,3步的反馈操作循环地进行,最后可以得出比较稳定的fvco
5. 最终得到
fa128=fvcoS×S2
HotPlug
HotPlug即热拔插,当接上接口时就可以判定设备是否存在,以进行后续工作。
HDMI source device会监测receiver device的Hotplug端口,如果Hotplug为High,则证明设备可以工作,然后去读取DCC,如果为low,则证明设备已断开
HDMI规定,HDMI 的5v引脚断电时,需要去读DCC,即需要保证Hotplug为high
Hotplug接法:
上面用5V引脚进行供电,当5V电源断开时,会有5v的电压回灌给HDMI HPD与Hotplug,这时HPD侦测到5V电压(High),就可以过来读EDID。不过这样做有一个缺点,5V电压会冲击Hotplug,一旦 Hotplug引脚无法承受5V电压的回灌,会被打穿,那么HPD就只能侦测到low。
上面用的是额外的GPIO引脚加上三极管控制HDMI HPD为0还是1,如果HDMI0_HPD_CTL输出0,那么三极管断开,HDMI0_HPD侦测到High,如果HDMI0_HPD_CTL输出1,那么三极管打通,HDMI0_HPD侦测到low。
HDMI Receiver
例如像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(HDMI硬件频率设置部分?)来进行锁相得到。但是由于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。
Timming Detect
在Receiver端还有需要进行Timming Detect,因为如果设备可以支持(如chroma),HDMI可以自由更换Timming,而当Timming更换了之后,Receiver需要重新 设定Phy。因此,通过侦测频率的改变来检测是否更换了Timing是必要的。一般会有一个中断服务(或循环)线程来侦测频率的改变,一旦频率改变后,该 进程会通知重新设定Phy,保证HDMI的正确运行
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后,也会发送一个Bkvs以及REPEATER(表明B设备是否为Repeater设备)给Transmitter
3. Transmitter开始HDCP认证码算法:
要理解算法,首先我们需要知道ksv是用来干嘛的
在每个HDMI设备内部,都会保存40组64bit的key,key[40]
40bit的kvs,每一个bit都是一个索引,当kvs的某一位n为1时,会把key[n]取出来,
把所有的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
8. 在第128帧的时候,另R = T
9. 在间隔第一次通信的2s后,再次进行认证
10. 后续都采用7,8,9这三个步骤进行迭代认证
此外HDMI自1.1后还支持一个更快速与频繁的认证方式
就是上方设备通信图的下半部分
1. 在每第16的倍数帧,用T与当前帧的Channel0的0像素做异或得到Pj
2. Channel0的0像素到达Receiver后,也与Receiver的T‘做异或得到P'j
3. Receiver把P'j发送到Transmitter,与Pj做比较,相同则通过认证
了解HDCP对于处理HDMI的异常现象很有帮助,比如说如果时而出现雪花,有可能是信号不好导致Channel0的0像素出错,从而第二阶段的认证有时会不成功...
HDMI Receiver总流程
HDCP
HDCP是 高带宽数字内容保护 ,TMDS讯号要经过HDCP加密,保证数字讯号不能轻易被复制。
8b/10b
8b/10b是一个数字化处理方法,是由IBM最先提出的专利,现在其专利已经超出保护期,成为了一个公众技术,其目的是提高数字讯号的抗 电磁干扰 (EMI)能力,提高讯号的准确性;工作方式简单说,就是将8个0、1组成的数字讯号,重新编码,前5个重编成6个,后3个重编成4个,经过这样的转换,将8个一组的数字讯号转换成10个一组。传输完成后,接收端再进行反编译,将数字讯号还原。
如何设计API接口,请求接口时需要进行身份验证,防止第三方随意调用接口?
参考技术A 接口使用方法:1.接口调用者先申请分配一个clientid,clientsecret,并提供给接口提供者(服务器)一个可访问的callbackURL(用于接口access_token)。
2.接口调用者使用clientid, clientsecret作为参数,向接口提供者发送请求。
接口提供者访问callbackURL发送access_token(有时间限制,超时后重新获取)。
3.接口调用者使用access_token作为参数,调用其他接口获取相关信息。
4.接口调用者在access_token超时后重新获取access_token。
有个疑问:
仅为了防止非法用户随意使用接口,需要这个复杂的机制吗?
接口使用https连接,可以确保数据保密性。
所以是否可以简化上面的流程,仅在接口服务者中配置一个 access_token,
接口使用者只需要提供正确的access_token即可正常使用其他接口。
以上是关于7. HDMI接口的主要内容,如果未能解决你的问题,请参考以下文章