DDC(Display Data Channel)通道用于HDMI發(fā)送和接收端之間交換一些配置信息。發(fā)送端通過(guò)DDC通道,讀取接收端保存在EEPROM中的EDID數(shù)據(jù),獲取接收端 的信息,確認(rèn)接收端終端顯示的設(shè)置和功能,決定跟接收端之間以什么格式傳輸音視頻數(shù)據(jù)。
CEC(Consumer Electronics Control)通道是可選通道。通過(guò)CEC通道,可以實(shí)現(xiàn)一些音視頻設(shè)備間的高級(jí)控制功能,比如支持視頻源和數(shù)字電視間的雙向通信,實(shí)現(xiàn)單鍵按下同時(shí)開(kāi)機(jī)、自動(dòng)上電、自動(dòng)信號(hào)路由、遠(yuǎn)程控制等功能。
圖1 HDMI系統(tǒng)結(jié)構(gòu)圖

E-EDID數(shù)據(jù)結(jié)構(gòu)
E-EDID是VESA組織定義的一種數(shù)據(jù)結(jié)構(gòu),是為PC顯示器設(shè)置的優(yōu)化顯示格式數(shù)據(jù)規(guī)范,它存儲(chǔ)在顯示器中專 用的EEPROM存儲(chǔ)器中,數(shù)據(jù)結(jié)構(gòu)是128Byte, PC主機(jī)和顯示器通過(guò)DDC通道訪問(wèn)存儲(chǔ)器中的數(shù)據(jù),以確定顯示器的顯示屬性,如分辨率、縱橫比等信息。此數(shù)據(jù)結(jié)構(gòu)被HDMI采用,在HDMI規(guī)范中,同 樣使用DDC通道訪問(wèn)EDID存儲(chǔ)器,以確定顯示設(shè)備的功能和屬性。
HDMI規(guī)范規(guī)定,EDID的第一個(gè)128Byte必須是符合EDID1.3 的數(shù)據(jù)結(jié)構(gòu),第二個(gè)128Byte必須是符合EIA/CEA-861B 的CEA EDID時(shí)序擴(kuò)展數(shù)據(jù)結(jié)構(gòu)。
http://mzywqwq.blog.163.com/blog/static/958701220106191849334/
http://www.cnblogs.com/TaigaCon/p/3840653.html
HDMI,全稱為(High Definition Multimedia Interface)高清多媒體接口,主要用于傳輸高清音視頻信號(hào)。
HDMI引腳:
HDMI有A,B,C,D,E五種引腳類型,目前市面中比較常見(jiàn)的就是Type A:

其中
1-9?都是TMDS數(shù)據(jù)傳輸實(shí)際上用到的引腳,分為0,1,2三組
10-12?為TMDS時(shí)鐘信號(hào),如當(dāng)前Video Timing為480p@60Hz(Htotal:800,Vtotal:525),則TMDS clock = 800x525x60 = 25.2MHz。TMDS clock就像是對(duì)像素的打包,一個(gè)clock分別在三個(gè)Channel傳輸一個(gè)像素的R、G、B(8bit)信號(hào)。
13?為CEC(consumer electronic control)類似一種擴(kuò)展的HDMI功能,供廠家自己定制HDMI消息,(比如說(shuō)你有一臺(tái)sony的DVD與TV,兩者用HDMI線接上,如果你用 TV的遙控器可以控制DVD,另DVD執(zhí)行某種功能,那么該功能的命令信號(hào)就是通過(guò)TV與DVD間的CEC引腳傳輸?shù)模?/p>
14?為保留引腳,未使用(或者也可以為CEC提供多一個(gè)引腳)
15-16?為I2C引腳,用于DDC(Display Data Channel,主要用于EDID與HDCP的傳輸)傳輸,具體可以查看。在HDMI的流程中,DDC通信幾乎是最先做的(前有Hotplug),因?yàn)镠DMI的主從兩個(gè)設(shè)備需要通過(guò)DDC來(lái)獲得他們對(duì)方設(shè)備的EDID,從而得到各種信息,并且通過(guò)比較timming以確定以后送出來(lái)的timming為最合適的
17?為接地引腳
? ??????18?為5v的AC引腳
19?為Hotplug(熱拔插)引腳(用于監(jiān)測(cè)HDMI設(shè)備有沒(méi)有存在,如果存在(Hotplug為high)那么可以通過(guò)DDC去讀EDID),HDMI 有規(guī)定在HDMI 5vAC斷電時(shí)source device可以讀reciever device的EDID,也就是需要Hotplug為High。其中有兩種Hotplug相關(guān)的情況會(huì)導(dǎo)致HDMI被識(shí)別為DVI:
Hotplug為High,不過(guò)EDID并沒(méi)有準(zhǔn)備好,那么信號(hào)源設(shè)備會(huì)由于無(wú)法讀到EDID而認(rèn)為接收設(shè)備為DVI,這樣會(huì)導(dǎo)致HDMI有圖像無(wú)聲的問(wèn)題。
Hotplug為L(zhǎng)ow,也會(huì)導(dǎo)致信號(hào)源無(wú)法讀到EDID而認(rèn)為接收設(shè)備為DVI,從而導(dǎo)致HDMI有圖無(wú)聲
傳輸流程:
HDMI TMDS傳輸?shù)臄?shù)據(jù)類型有三種(加上Hsync與Vsync就算4種):
Preamble(控制信息),主要用于控制接下來(lái)傳輸?shù)臄?shù)據(jù)是Data Island或者Video Data
Data Island(數(shù)據(jù)包),各種類型的包信息,包括音頻數(shù)據(jù)包,圖像信息包等
Video Data (視頻信息),視頻像素?cái)?shù)據(jù),HDMI可以傳輸RGB與YUV兩種格式的像素?cái)?shù)據(jù)
還有Hsync與Vsync
HDMI的數(shù)據(jù)傳輸有TMDS0,TMDS1,TMDS2三個(gè)通道,每個(gè)通道的傳輸流程都是一樣的:

如果是8bit的數(shù)據(jù)進(jìn)入TMDS編碼器,得到抗干擾性強(qiáng)的10bit TMDS信號(hào),然后再進(jìn)行串行化輸出;在接收端收到串行的HDMI信號(hào)后,進(jìn)行信號(hào)復(fù)原,得到10bit的TMDS信號(hào),最后用TMDS解碼器解碼得到原來(lái)的8bit數(shù)據(jù)。
總體傳輸流程如下:

如果傳輸?shù)氖?b>Video Data,并且格式為RGB,那么會(huì)占用三個(gè)通道的所有24bit輸入,Channel0[7:0]用于傳輸B,Channel1[7:0]用于傳輸G,Channel2[7:0]用于傳輸R。
如果傳輸?shù)氖?b>Data Island,則占用三個(gè)通道共10bit輸入,Channel0[3:2]用于傳輸Data Island Header(包頭),Channel1[0:3]與Channel2[0:3]用于傳輸Data Island Content(包內(nèi)數(shù)據(jù))。
如果傳輸?shù)氖?b>Preamble,則占用1,2兩個(gè)通道共4bit輸入,Channel1[1:0]與Channel2[1:0]分別為CTL0,CTL1,CTL2,CTL3,用于判斷接下來(lái)輸入的是Video Data或者Data Island
對(duì)于Hsync與VSync,會(huì)占用Channel0通道的兩個(gè)bit輸入,Channel0[0]為Hsync,Channel0[1]為Vsync

傳輸時(shí)期:
HDMI的TMDS數(shù)據(jù)傳輸可以分為三個(gè)傳輸時(shí)期:

Control Period期間會(huì)傳輸Hsync,Vsync,并且在該時(shí)期的最后階段會(huì)傳輸Preamble
Data Island Period期間會(huì)傳輸Data Island(數(shù)據(jù)包),也會(huì)有Hsync與Vsync
Video Data Period期間會(huì)傳輸Video Data(視頻像素?cái)?shù)據(jù))
某幀的總體時(shí)期如下:

三個(gè)傳輸時(shí)期的過(guò)渡如下:

左邊是Control Period,傳輸有Hsync,Vsync與Preamble
中間是Data Island Period,傳輸有Hsync,Vsync,以及兩個(gè)Packet Header與Packet(每32個(gè)clock 一個(gè)packet);另外Data Island的兩端會(huì)用Guard Band保護(hù)并隔開(kāi)Data Island的數(shù)據(jù),因?yàn)檫@個(gè)階段傳輸?shù)臄?shù)據(jù)大多是非常重要的,比如其中就有圖像分辨率,決定后面的Video Data數(shù)據(jù)的顯示方式
右邊是Video Data Island,傳輸視頻像素?cái)?shù)據(jù),在該時(shí)期的開(kāi)頭也有Guard Band
Data Island Packet結(jié)構(gòu)

所有Data Island Packet都以32個(gè)時(shí)鐘脈沖為一個(gè)周期,也就是說(shuō)每32 clk傳輸一個(gè)包。
以上圖為例,
包頭部是BCH block 4,由Channel0[2]傳輸,32clk表示有32bit,則為4byte,前三個(gè)byte為包頭,最后一byte為校驗(yàn)碼
包體為BCH block 0,1,2,3,分別由Channel1,Channel2共8根線傳輸,共有24byte與6byte的校驗(yàn)碼
Parity Bits校驗(yàn)碼是用于檢驗(yàn)HDMI Cable傳輸過(guò)程中是否發(fā)生了錯(cuò)誤,如果該P(yáng)acket在HDMI接收端校驗(yàn)錯(cuò)誤,如果只有一個(gè)bit的錯(cuò)誤,那么可以修正,超過(guò)1bit的錯(cuò)誤會(huì)被判 別為無(wú)效Packet(由于HDMI是一直在發(fā)送數(shù)據(jù)因此無(wú)法重發(fā)錯(cuò)誤Packet?)
所以說(shuō),在接收端,在解完包之后,需要取出各個(gè)BCH block的Parity bit,進(jìn)行Calibration(校驗(yàn))
Packet類型各種各樣,詳細(xì)請(qǐng)看HDMI Spec
Audio Clock
Audio的采樣率有44100,48000,192000等,是各種各樣,在HDMI傳輸時(shí),Audio是PCM級(jí)(無(wú)壓縮)傳輸,把PCM數(shù)據(jù)打散到各個(gè)包內(nèi),為了得到每個(gè)音頻幀的數(shù)據(jù),也需要知道Audio的采樣率。HDMI中規(guī)定Audio的傳輸方式:

Audio采樣率fs重建依靠的主要參數(shù)為:
TMDS Clock
CTS
N
在發(fā)送設(shè)備這端,已知參數(shù)有采樣率fs,視頻時(shí)鐘Video Clock(TMDS clock),以及預(yù)先設(shè)定好的參數(shù)N,求CTS:
CTS=N?fTMDS128×fx
在接收設(shè)備這端,TMDS clock通過(guò)硬件設(shè)備可以得到,N,與CTS通過(guò)Audio Packet傳輸過(guò)來(lái),求fs:
128?fs=N×fTMDSCTS
在接收端為了保持fs的穩(wěn)定與精確,需要進(jìn)行鎖相,即用VCO(Voltage-controlled oscillator壓控振蕩器,通過(guò)電壓控制產(chǎn)生的頻率)產(chǎn)生合適的頻率,然后用PFD(Phase Frequency Detector)來(lái)鎖頻

1. 首先,由于VCO有個(gè)最佳的工作區(qū)域如(200MHz~500MHz),那么為了保證VCO在最佳工作頻率內(nèi),我們可以從后倒推回來(lái),先對(duì)輸出的fa128做乘法得到
fvco=fa128×S×S2
由于fa128只有那么幾種(44.1k,48k等),所以比較容易得到S與S2
2. 然后,為了更快進(jìn)行頻率匹配,需要對(duì)近來(lái)的頻率fx(就是晶振時(shí)鐘fcrystal)或者fv(pixel clock)做除法,也對(duì)fvco做除法,令兩個(gè)趨向相等。對(duì)于細(xì)微的區(qū)別可以用D Code 進(jìn)行修正
fvcoM=fxK
3. 最后做PFD鎖相
4. 第2,3步的反饋操作循環(huán)地進(jìn)行,最后可以得出比較穩(wěn)定的fvco
5. 最終得到
fa128=fvcoS×S2
HotPlug
HotPlug即熱拔插,當(dāng)接上接口時(shí)就可以判定設(shè)備是否存在,以進(jìn)行后續(xù)工作。
HDMI source device會(huì)監(jiān)測(cè)receiver device的Hotplug端口,如果Hotplug為High,則證明設(shè)備可以工作,然后去讀取DCC,如果為low,則證明設(shè)備已斷開(kāi)
HDMI規(guī)定,HDMI 的5v引腳斷電時(shí),需要去讀DCC,即需要保證Hotplug為high
Hotplug接法:

上面用5V引腳進(jìn)行供電,當(dāng)5V電源斷開(kāi)時(shí),會(huì)有5v的電壓回灌給HDMI HPD與Hotplug,這時(shí)HPD偵測(cè)到5V電壓(High),就可以過(guò)來(lái)讀EDID。不過(guò)這樣做有一個(gè)缺點(diǎn),5V電壓會(huì)沖擊Hotplug,一旦 Hotplug引腳無(wú)法承受5V電壓的回灌,會(huì)被打穿,那么HPD就只能偵測(cè)到low。

上面用的是額外的GPIO引腳加上三極管控制HDMI HPD為0還是1,如果HDMI0_HPD_CTL輸出0,那么三極管斷開(kāi),HDMI0_HPD偵測(cè)到High,如果HDMI0_HPD_CTL輸出1,那么三極管打通,HDMI0_HPD偵測(cè)到low。
HDMI Receiver
例如像TV這種就是HDMI的接收端,那么HDMI接收端需要做些什么東西。
HDMI可以接收到的有三個(gè)通道的TMDS Data,TMDS Clock,可以設(shè)置Hotplug,還有DCC傳輸用的I2C引腳。上面已經(jīng)講了TMDS Data,與設(shè)置Hotplug,接下來(lái)分析TMDS Clock。
TMDS Clock 就是Pixel Clock,即一個(gè)像素點(diǎn)所用的時(shí)鐘頻率。TMDS Clock通過(guò)clk 引腳傳輸?shù)浇邮斩耍墙邮斩瞬⒉磺宄l(fā)送端發(fā)過(guò)來(lái)的TMDS Clock 頻率為多少,因此需要通過(guò)Phy(HDMI硬件頻率設(shè)置部分?)來(lái)進(jìn)行鎖相得到。但是由于HDMI頻寬太寬(480P@60Hz為 25.2MHz,1080P@60Hz為162MHz,甚至還有高達(dá)340MHz的),一般VCO(壓控振蕩器,通過(guò)電壓控制產(chǎn)生的頻率)無(wú)法覆蓋這么大 的范圍,因此需要分頻帶來(lái)設(shè)置Phy:
先偵測(cè)輸入頻率落在哪個(gè)頻帶,然后根據(jù)不同頻帶做不同設(shè)置。
用TV產(chǎn)生的晶振來(lái)數(shù)count,數(shù)得count后就知道TDMS Clock了
fcrystal=count×fTMDS??
或者用1024個(gè)TMDS Clock來(lái)數(shù)晶振個(gè)數(shù)
1024×fTMDS=count×fcrystal??
由于視頻信號(hào)從RGB個(gè)8bit通過(guò)TMDS編碼后變成了10bit,然后又串行化,所以實(shí)際用于接收TMDS Data所用的時(shí)鐘應(yīng)該為:
fReceiveClock=10×fTMDS
另外ReceiveClock也可以不用直接采用上面的乘法,而是采用TMDSClock為參考、硬件鎖相的方法來(lái)得到。
得到ReceiveClock后就可以去設(shè)置頻率PLL,然后對(duì)三個(gè)通道進(jìn)行采樣得到TMDS Data。
Timming Detect
在Receiver端還有需要進(jìn)行Timming Detect,因?yàn)槿绻O(shè)備可以支持(如chroma),HDMI可以自由更換Timming,而當(dāng)Timming更換了之后,Receiver需要重新 設(shè)定Phy。因此,通過(guò)偵測(cè)頻率的改變來(lái)檢測(cè)是否更換了Timing是必要的。一般會(huì)有一個(gè)中斷服務(wù)(或循環(huán))線程來(lái)偵測(cè)頻率的改變,一旦頻率改變后,該 進(jìn)程會(huì)通知重新設(shè)定Phy,保證HDMI的正確運(yùn)行
HDMI版權(quán)內(nèi)容保護(hù)之HDCP
HDCP通過(guò)DDC傳輸
HDCP主要用于版權(quán)視頻的保護(hù),舉例來(lái)說(shuō),如果有一臺(tái)藍(lán)光DVD播放機(jī)可以 播放blueray DVD,并且該DVD已經(jīng)獲得HDCP授權(quán),你現(xiàn)在想把該DVD影像輸出到某臺(tái)TV,但是該TV沒(méi)有獲得HDCP授權(quán),那么該TV可能就沒(méi)法播放影像,或 者播放質(zhì)量下降,如出現(xiàn)雪花,圖像從1080p變?yōu)?80p,或者沒(méi)有聲音,都有可能。
HDCP是靠?jī)蓚€(gè)設(shè)備的交互進(jìn)行HDCP授權(quán)認(rèn)證的,認(rèn)證流程如下

1. Transmitter會(huì)發(fā)送一個(gè)key An(64bit)與Aksv(key selection vector 40bit)給Receiver
2. Receiver接收到An后,也會(huì)發(fā)送一個(gè)Bkvs以及REPEATER(表明B設(shè)備是否為Repeater設(shè)備)給Transmitter
3. Transmitter開(kāi)始HDCP認(rèn)證碼算法:
要理解算法,首先我們需要知道ksv是用來(lái)干嘛的
在每個(gè)HDMI設(shè)備內(nèi)部,都會(huì)保存40組64bit的key,key[40]
40bit的kvs,每一個(gè)bit都是一個(gè)索引,當(dāng)kvs的某一位n為1時(shí),會(huì)把key[n]取出來(lái),
把所有的key[n]相加,得到km,
4. Receiver也會(huì)做HDCP認(rèn)證碼算法這個(gè)步驟得到km'
5. Transmitter與Receiver都會(huì)用km\km'去做hdcpBlkCipher,得到一個(gè)值R0與R0'
6. 100ms后Receiver把R0'發(fā)送到Transmitter與R0做比較,相等則認(rèn)為認(rèn)證完畢。當(dāng)然km = km'才能保證R0 = R0'。
7.此后的每一幀,Transmitter與Receiver都會(huì)運(yùn)行一次hdcpBlockCipher,不過(guò)參數(shù)為上次生成的Ks與M,生成的新參數(shù)為Ks,M,T

8. 在第128幀的時(shí)候,另R = T
9. 在間隔第一次通信的2s后,再次進(jìn)行認(rèn)證
10. 后續(xù)都采用7,8,9這三個(gè)步驟進(jìn)行迭代認(rèn)證

此外HDMI自1.1后還支持一個(gè)更快速與頻繁的認(rèn)證方式
就是上方設(shè)備通信圖的下半部分
1. 在每第16的倍數(shù)幀,用T與當(dāng)前幀的Channel0的0像素做異或得到Pj
2. Channel0的0像素到達(dá)Receiver后,也與Receiver的T‘做異或得到P'j
3. Receiver把P'j發(fā)送到Transmitter,與Pj做比較,相同則通過(guò)認(rèn)證

了解HDCP對(duì)于處理HDMI的異?,F(xiàn)象很有幫助,比如說(shuō)如果時(shí)而出現(xiàn)雪花,有可能是信號(hào)不好導(dǎo)致Channel0的0像素出錯(cuò),從而第二階段的認(rèn)證有時(shí)會(huì)不成功...
HDMI Receiver總流程

1. 提取與分割10bit的TMDS串行數(shù)據(jù)
2. 10bit的數(shù)據(jù),通過(guò)不同線路進(jìn)來(lái)的,判斷是那種類型的:DE,Data Island,RGB,Hs,Vs,Ctrl
3. TMDS解碼
4. HDCP解碼,同時(shí)Hs,Vs,DE做delay
5. RGB與DE,Hs,Vs...
6. BCH解碼得到Packet,錯(cuò)誤驗(yàn)證
7. Packet含義解析
8. 如果是信息,則存到內(nèi)存
9. 如果是Audio Data,生成采樣頻率
10. Audio輸出
HDCP
HDCP是高帶寬數(shù)字內(nèi)容保護(hù),TMDS訊號(hào)要經(jīng)過(guò)HDCP加密,保證數(shù)字訊號(hào)不能輕易被復(fù)制。
8b/10b
8b/10b是一個(gè)數(shù)字化處理方法,是由IBM最先提出的專利,現(xiàn)在其專利已經(jīng)超出保護(hù)期,成為了一個(gè)公眾技術(shù),其目的是提高數(shù)字訊號(hào)的抗電磁干擾(EMI)能力,提高訊號(hào)的準(zhǔn)確性;工作方式簡(jiǎn)單說(shuō),就是將8個(gè)0、1組成的數(shù)字訊號(hào),重新編碼,前5個(gè)重編成6個(gè),后3個(gè)重編成4個(gè),經(jīng)過(guò)這樣的轉(zhuǎn)換,將8個(gè)一組的數(shù)字訊號(hào)轉(zhuǎn)換成10個(gè)一組。傳輸完成后,接收端再進(jìn)行反編譯,將數(shù)字訊號(hào)還原。