HDMI,全稱為(High Definition Multimedia Interface)高清多媒體接口,,主要用于傳輸高清音視頻信號,。
HDMI引腳:
HDMI有A,B,C,D,E五種引腳類型,目前市面中比較常見的就是Type A:
其中
- 1-9 都是TMDS數(shù)據(jù)傳輸實際上用到的引腳,,分為0,1,2三組
- 10-12 為TMDS時鐘信號,,如當前Video Timing為480p@60Hz(Htotal:800,Vtotal:525),,則TMDS clock = 800x525x60 = 25.2MHz,。TMDS clock就像是對像素的打包,一個clock分別在三個Channel傳輸一個像素的R,、G,、B(8bit)信號。
- 13 為CEC(consumer electronic control)類似一種擴展的HDMI功能,,供廠家自己定制HDMI消息,,(比如說你有一臺sony的DVD與TV,,兩者用HDMI線接上,如果你用TV的遙控器可以控制DVD,,另DVD執(zhí)行某種功能,,那么該功能的命令信號就是通過TV與DVD間的CEC引腳傳輸?shù)模?/li>
- 14 為保留引腳,未使用(或者也可以為CEC提供多一個引腳)
- 15-16 為I2C引腳,,用于DDC(Display Data Channel,,主要用于EDID與HDCP的傳輸)傳輸,具體可以查看,。在HDMI的流程中,,DDC通信幾乎是最先做的(前有Hotplug),因為HDMI的主從兩個設(shè)備需要通過DDC來獲得他們對方設(shè)備的EDID,,從而得到各種信息,,并且通過比較timming以確定以后送出來的timming為最合適的
- 17 為接地引腳
- 18 為5v的AC引腳
- 19 為Hotplug(熱拔插)引腳(用于監(jiān)測HDMI設(shè)備有沒有存在,如果存在(Hotplug為high)那么可以通過DDC去讀EDID),,HDMI有規(guī)定在HDMI 5vAC斷電時source device可以讀reciever device的EDID,,也就是需要Hotplug為High。其中有兩種Hotplug相關(guān)的情況會導致HDMI被識別為DVI:
- Hotplug為High,,不過EDID并沒有準備好,,那么信號源設(shè)備會由于無法讀到EDID而認為接收設(shè)備為DVI,這樣會導致HDMI有圖像無聲的問題,。
- Hotplug為Low,,也會導致信號源無法讀到EDID而認為接收設(shè)備為DVI,從而導致HDMI有圖無聲
- 在TV這種有多個HDMI通道的情況下,,有時會在多個HDMI通道進行切換,,切換后HDMI通道應當先初始化,即先把Hotplug拉低,,通知HDMI source device之前所用的EDID已經(jīng)改變,,需要重新讀取,那么source device在Hotplug被拉高的時候會去讀取新的EDID,,但是拉低這個過程至少需要100ms,,否則source device有可能不會去讀取新的EDID,從而輸出DVI信號
傳輸流程
HDMI TMDS傳輸?shù)臄?shù)據(jù)類型有三種(加上Hsync與Vsync就算4種):
- Preamble(控制信息),,主要用于控制接下來傳輸?shù)臄?shù)據(jù)是Data Island或者Video Data
- Data Island(數(shù)據(jù)包),,各種類型的包信息,包括音頻數(shù)據(jù)包,,圖像信息包等
- Video Data (視頻信息),,視頻像素數(shù)據(jù),HDMI可以傳輸RGB與YUV兩種格式的像素數(shù)據(jù)
- 還有Hsync與Vsync
HDMI的數(shù)據(jù)傳輸有TMDS0,TMDS1,,TMDS2三個通道,,每個通道的傳輸流程都是一樣的:
如果是8bit的數(shù)據(jù)進入TMDS編碼器,得到抗干擾性強的10bit TMDS信號,,然后再進行串行化輸出,;在接收端收到串行的HDMI信號后,進行信號復原,,得到10bit的TMDS信號,,最后用TMDS解碼器解碼得到原來的8bit數(shù)據(jù)。
總體傳輸流程如下:
- 如果傳輸?shù)氖荲ideo Data,,并且格式為RGB,,那么會占用三個通道的所有24bit輸入,Channel0[7:0]用于傳輸B,,Channel1[7:0]用于傳輸G,,Channel2[7:0]用于傳輸R。
- 如果傳輸?shù)氖荄ata Island,,則占用三個通道共10bit輸入,,Channel0[3:2]用于傳輸Data Island Header(包頭),Channel1[0:3]與Channel2[0:3]用于傳輸Data Island Content(包內(nèi)數(shù)據(jù)),。
- 如果傳輸?shù)氖荘reamble,,則占用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數(shù)據(jù)傳輸可以分為三個傳輸周期:
- Control Period期間會傳輸Hsync,,Vsync,,并且在該時期的最后階段會傳輸Preamble
- Data Island Period期間會傳輸Data Island(數(shù)據(jù)包),也會有Hsync與Vsync
- Video Data Period期間會傳輸Video Data(視頻像素數(shù)據(jù))
某幀的總體周期如下:
三個傳輸周期的過渡如下:
- 左邊是Control Period,,傳輸有Hsync,,Vsync與Preamble
- 中間是Data Island Period,傳輸有Hsync,,Vsync,,以及兩個Packet Header與Packet(每32個clock 一個packet);另外Data Island的兩端會用Guard Band保護并隔開Data Island的數(shù)據(jù),,因為這個階段傳輸?shù)臄?shù)據(jù)大多是非常重要的,,比如其中就有圖像分辨率,決定后面的Video Data數(shù)據(jù)的顯示方式
- 右邊是Video Data Island,傳輸視頻像素數(shù)據(jù),,在該時期的開頭也有Guard Band
Data Island Packet結(jié)構(gòu)
所有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傳輸過程中是否發(fā)生了錯誤,,如果該Packet在HDMI接收端校驗錯誤,,如果只有一個bit的錯誤,那么可以修正,,超過1bit的錯誤會被判別為無效Packet(由于HDMI是一直在發(fā)送數(shù)據(jù)因此無法重發(fā)錯誤Packet,?)
所以說,在接收端,,在解完包之后,,需要取出各個BCH block的Parity bit,進行Calibration(校驗)
Packet類型各種各樣,,詳細請看HDMI Spec
Audio Clock
Audio的采樣率有44100,48000,,192000等,是各種各樣,,在HDMI傳輸時,,Audio是PCM級(無壓縮)傳輸,把PCM數(shù)據(jù)打散到各個包內(nèi),,為了得到每個音頻幀的數(shù)據(jù),,也需要知道Audio的采樣率。HDMI中規(guī)定Audio的傳輸方式:
Audio采樣率fs重建依靠的主要參數(shù)為:
- TMDS Clock
- CTS
- N
在發(fā)送設(shè)備這端,,已知參數(shù)有采樣率fs,,視頻時鐘Video Clock(TMDS clock),以及預先設(shè)定好的參數(shù)N,,求CTS:
CTS=N?fTMDS128×fx
在接收設(shè)備這端,,TMDS clock通過硬件設(shè)備可以得到,N,,與CTS通過Audio Packet傳輸過來,,求fs:
128?fs=N×fTMDSCTS
在接收端為了保持fs的穩(wěn)定與精確,需要進行鎖相,即用VCO(Voltage-controlled oscillator壓控振蕩器,,通過電壓控制產(chǎn)生的頻率)產(chǎn)生合適的頻率,,然后用PFD(Phase Frequency Detector)來鎖頻
- 首先,由于VCO有個最佳的工作區(qū)域如(200MHz~500MHz),,那么為了保證VCO在最佳工作頻率內(nèi),,我們可以從后倒推回來,先對輸出的fa128做乘法得到
fvco=fa128×S×S2
由于fa128只有那么幾種(44.1k,,48k等),,所以比較容易得到S與S2
- 然后,為了更快進行頻率匹配,,需要對近來的頻率fx(就是晶振時鐘fcrystal)或者fv(pixel clock)做除法,,也對fvco做除法,令兩個趨向相等,。對于細微的區(qū)別可以用D Code 進行修正
fvcoM=fxK
- 最后做PFD鎖相
- 第2,3步的反饋操作循環(huán)地進行,,最后可以得出比較穩(wěn)定的fvco
- 最終得到
fa128=fvcoS×S2
HotPlug
HotPlug即熱拔插,當接上接口時就可以判定設(shè)備是否存在,,以進行后續(xù)工作,。
HDMI source device(HDMI HPD)會監(jiān)測sink device的Hotplug端口,如果Hotplug為High,,則證明設(shè)備可以工作,,然后去讀取DCC,如果為low,,則證明設(shè)備已斷開,。
HDMI sink device應該通過把Hotplug拉低,來通知source device EDID已經(jīng)被改變,,那么source device在Hotplug被拉高后,,就會重新來讀取新的EDID,拉低這段時間應該多于100ms,。
HDMI規(guī)定,,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,。
HDMI Sink
例如像TV這種就是HDMI的接收端,那么HDMI接收端需要做些什么東西,。
HDMI可以接收到的有三個通道的TMDS Data,,TMDS Clock,可以設(shè)置Hotplug,,還有DCC傳輸用的I2C引腳,。上面已經(jīng)講了TMDS Data,與設(shè)置Hotplug,,接下來分析TMDS Clock,。
TMDS Clock 就是Pixel Clock,即一個像素點所用的時鐘頻率,。TMDS Clock通過clk 引腳傳輸?shù)浇邮斩?,但是接收端并不清楚發(fā)送端發(fā)過來的TMDS Clock 頻率為多少,因此需要通過Phy(PHY是模擬數(shù)字轉(zhuǎn)換部分,,不同于ADC,,PHY是不知道采樣頻率的,需要自己鎖頻,、鎖相,,偵測確切的輸入頻率)來進行鎖相得到。但是由于HDMI頻寬太寬(480P@60Hz為25.2MHz,,1080P@60Hz為162MHz,,甚至還有高達340MHz的),一般VCO(壓控振蕩器,,通過電壓控制產(chǎn)生的頻率)無法覆蓋這么大的范圍,,因此需要分頻帶來設(shè)置Phy:
先偵測輸入頻率落在哪個頻帶,然后根據(jù)不同頻帶做不同設(shè)置,。
用TV產(chǎn)生的晶振來數(shù)count,,數(shù)得count后就知道TDMS Clock了
fcrystal=count×fTMDS,??
或者用1024個TMDS Clock來數(shù)晶振個數(shù)
1024×fTMDS=count×fcrystal,?,?
由于視頻信號從RGB個8bit通過TMDS編碼后變成了10bit,然后又串行化,,所以實際用于接收TMDS Data所用的時鐘應該為:
fReceiveClock=10×fTMDS
另外ReceiveClock也可以不用直接采用上面的乘法,,而是采用TMDSClock為參考、硬件鎖相的方法來得到,。
得到ReceiveClock后就可以去設(shè)置頻率PLL,,然后對三個通道進行采樣得到TMDS Data。
Timming Detect
在Sink端還有需要進行Timming Detect,,因為如果設(shè)備可以支持(如chroma),,HDMI可以自由更換Timming,而當Timming更換了之后,,Sink需要重新設(shè)定Phy,。因此,通過偵測頻率的改變來檢測是否更換了Timing是必要的,。一般會有一個中斷服務(或循環(huán))線程來偵測頻率的改變,,一旦頻率改變后,該進程會通知重新設(shè)定Phy,,保證HDMI的正確運行
HDMI版權(quán)內(nèi)容保護之HDCP
HDCP通過DDC傳輸
HDCP主要用于版權(quán)視頻的保護,,舉例來說,如果有一臺藍光DVD播放機可以播放blueray DVD,,并且該DVD已經(jīng)獲得HDCP授權(quán),,你現(xiàn)在想把該DVD影像輸出到某臺TV,但是該TV沒有獲得HDCP授權(quán),,那么該TV可能就沒法播放影像,,或者播放質(zhì)量下降,如出現(xiàn)雪花,,圖像從1080p變?yōu)?80p,,或者沒有聲音,都有可能,。
HDCP是靠兩個設(shè)備的交互進行HDCP授權(quán)認證的,,認證流程如下
- Transmitter會發(fā)送一個key An(64bit)與Aksv(key selection vector 40bit)給Receiver
- Receiver接收到An后,也會發(fā)送一個Bkvs以及REPEATER(表明B設(shè)備是否為Repeater設(shè)備)給Transmitter
- Transmitter開始HDCP認證碼算法:
- 在每個HDMI設(shè)備內(nèi)部,,都會保存40組64bit的key,,key[40]
- 40bit的kvs,,每一個bit都是一個索引,,當kvs的某一位n為1時,會把key[n]取出來,,
- 把所有的key[n]相加,,得到km,
- Receiver也會做HDCP認證碼算法這個步驟得到km'
- Transmitter與Receiver都會用km\km'去做hdcpBlkCipher,,得到一個值R0與R0'
- 100ms后Receiver把R0'發(fā)送到Transmitter與R0做比較,,相等則認為認證完畢。當然km = km'才能保證R0 = R0',。
- 此后的每一幀,,Transmitter與Receiver都會運行一次hdcpBlockCipher,不過參數(shù)為上次生成的Ks與M,,生成的新參數(shù)為Ks,M,T
- 在第128幀的時候,,另R = T
- 在間隔第一次通信的2s后,再次進行認證
- 后續(xù)都采用7,8,9這三個步驟進行迭代認證
此外HDMI自1.1后還支持一個更快速與頻繁的認證方式,,就是上方設(shè)備通信圖的下半部分
- 在每第16的倍數(shù)幀,,用T與當前幀的Channel0的0像素做異或得到Pj
- Channel0的0像素到達Sink后,也與Sink的T‘做異或得到P'j
- Sink把P'j發(fā)送到Source,,與Pj做比較,,相同則通過認證
了解HDCP對于處理HDMI的異常現(xiàn)象很有幫助,,比如說如果時而出現(xiàn)雪花,,有可能是信號不好導致Channel0的0像素出錯,從而第二階段的認證有時會不成功...
HDMI Sink總流程
- 提取與分割10bit的TMDS串行數(shù)據(jù)
- 10bit的數(shù)據(jù),,通過不同線路進來的,,判斷是那種類型的:DE,Data Island,,RGB,,Hs,Vs,,Ctrl
- TMDS解碼
- HDCP解碼,,同時Hs,Vs,,DE做delay
- RGB與DE,,Hs,Vs...
- BCH解碼得到Packet,,錯誤驗證
- Packet含義解析
- 如果是信息,,則存到內(nèi)存
- 如果是Audio Data,生成采樣頻率
- Audio輸出
|