HDMI简介
HDMI接口全稱為High Definition Multimedia Interface,中文為高清晰度多媒體接口,是一種全數位化影像和聲音傳送接口,可以傳送無壓縮的音頻信號及視頻信號。HDMI最遠可傳輸15米。
引腳定義
HDMI有A,B,C,D,E五種引腳類型,目前市面中比較常見的就是Type A:
? 1-9 都是TMDS數據傳輸實際上用到的引腳,分為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執行某種功能,那么該功能的命令信號就是通過TV與DVD間的CEC引腳傳輸的)
? 14 為保留引腳,未使用(或者也可以為CEC提供多一個引腳)
? 15-16 為I2C引腳,用于DDC(Display Data Channel,主要用于EDID與HDCP的傳輸)傳輸。在HDMI的流程中,DDC通信幾乎是最先做的(前有Hot plug),因為HDMI的主從兩個設備需要通過DDC來獲得他們對方設備的EDID,從而得到各種信息,并且通過比較timming以確定以后送出來的timming為最合適的
? 17 為接地引腳
? 18 為5v的AC引腳
? 19 為Hot plug(熱拔插)引腳(用于監測HDMI設備有沒有存在,如果存在(Hot plug為high)那么可以通過DDC去讀EDID),HDMI有規定在HDMI 5v AC斷電時source device可以讀receiver device的EDID,也就是需要Hotplug為High。其中有兩種Hot plug相關的情況會導致HDMI被識別為DVI:
? Hot plug為High,不過EDID并沒有準備好,那么信號源設備會由于無法讀到EDID而認為接收設備為DVI,這樣會導致HDMI有圖像無聲的問題。
? Hot plug為Low,也會導致信號源無法讀到EDID而認為接收設備為DVI,從而導致HDMI有圖無聲
? 在TV這種有多個HDMI通道的情況下,有時會在多個HDMI通道進行切換,切換后HDMI通道應當先初始化,即先把Hotplug拉低,通知HDMI
source device之前所用的EDID已經改變,需要重新讀取,那么source
device在Hotplug被拉高的時候會去讀取新的EDID,但是拉低這個過程至少需要100ms,否則source
device有可能不會去讀取新的EDID,從而輸出DVI信號
傳輸流程
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根線傳輸,共有24 byte與6 byte的校驗碼
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重建依靠的主要參數為:
在發送設備這端,已知參數有采樣率fs,視頻時鐘Video Clock(TMDS clock),以及預先設定好的參數N,求CTS:
在接收設備這端,TMDS clock通過硬件設備可以得到,N,與CTS通過Audio Packet傳輸過來,求fs:
在接收端為了保持fs的穩定與精確,需要進行鎖相,即用VCO(Voltage-controlled oscillator壓控振蕩器,通過電壓控制產生的頻率)產生合適的頻率,然后用PFD(Phase Frequency Detector)來鎖頻
首先,由于VCO有個最佳的工作區域如(200MHz~500MHz),那么為了保證VCO在最佳工作頻率內,我們可以從后倒推回來,先對輸出的fa128做乘法得到
由于fa128只有那么幾種(44.1k,48k等),所以比較容易得到S與S2
然后,為了更快進行頻率匹配,需要對近來的頻率fx(就是晶振時鐘fcrystal)或者fv(pixel clock)做除法,也對fvco做除法,令兩個趨向相等。對于細微的區別可以用D Code 進行修正
最后做PFD鎖相
第2,3步的反饋操作循環地進行,最后可以得出比較穩定的fvco
最終得到
HotPlug
HDMI (Pin 19)/DVI(Pin16)的功能是熱插拔檢測(HPD),這個信號將作為HDMI 源端(Source)是否發起EDID讀,是否開始發送TMDS信號的依據。HPD是從HDMI顯示器端(Sink)生成并輸出送往HDMI 源端(Source)的一個檢測信號。熱插拔檢測的作用是當顯示器等HDMI接口的顯示設備通過HDMI/DVI接口與HDMI 源端(Source)相連或斷開連接時,HDMI源端(Source)能夠通過HDMI/DVI的HPD引腳檢測出這一事件,并做出響應。下面以HDMI為例講述HPD的原理和實現方式。
顯示器通過HDMI連接HDMI源端設備,當HDMI 源端(Source)通過HDMI接口的HPD引腳檢測到顯示器與HDMI源端(Source)相連時(HPD從低電平到高電平),HDMI 源端(Source)認為已經有顯示設備連接,并通過HDMI接口中的顯示器數據通道DDC(DDC I2C總線)讀取顯示器EDID存儲器中存儲的EDID數據(擴展顯示器識別數據),如果檢測到顯示器的工作模式范圍與HDMI 源端(Source)的輸出設置相適應,則HDMI 源端(Source)就激活TMDS信號發送電路發送正常的HDMI信號給顯示設備。所以**Sink端的EDID是在HPD從低電平到高電平的轉換時被HDMI Source端讀取的。**如果需要強制刷新EDID, 可以發起一個HPD信號(拉低HPD,**拉低這段時間應該多于100ms;**再拉高HPD),讓HDMI source來讀取新的EDID內容。
顯示器斷開HDMI連接時,當HDMI 源端(Source)通過HPD引腳檢測到顯示器的HDMI接口與HDMI 源端(Source)斷開時,HDMI 源端(Source)就斷開TMDS信號發送電路,停止發送HDMI信號。
HDMI 源端(Source)對HPD信號的要求,當HDMI 源端(Source)檢測到HDMI/DVI接口上的HPD引腳電壓大于2V時,判斷為HDMI顯示設備(Sink)通過HDMI/DVI接口與HDMI源端(Source)連接:當檢測到HPD引腳電壓小于0.8V時,則判斷為HDMI顯示設備(Sink)通過HDMI/DVI接口與HDMI 源端(Source)之間的連接已經斷開。
HPD信號的實現一般是在HDMI的Sink端,通過一個1K歐姆的電阻上拉到HDMI +5V,同時,本地的主處理器可以通過一個GPIO來控制它,如下圖所示
當HDMI 源端(Source)通過HDMI接口與HDMI Sink端連接時,HDMI源端(Source)通過HDMI的第18腳(PWR_CON,PIN18,也就是 HDMI_5V)將+5V電壓加到HDMISink端的DDC存儲器(EDID數據存儲器)向DDC存儲器供電,確保即使HDMI Sink端不開機,HDMI 源端(Source)也能通過HDMI接口讀取EDID數據。 HDMI 源端(Source)開機后產生 +5V并通過第18腳向HDMISink端(HDMI顯示器)供電,此時HDMISink端(HDMI顯示器)接收到5V電壓后通過內部電路使HDMI接口第19腳HPD轉變為高電平(1K歐姆電阻上拉)。此時HDMI源端(Source)通過第19 Pin接收到HPD高電平,判斷HDMI Sink端(HDMI顯示器)通過HDMI接口與HDMI 源端連接,于是通過HDMI接口的第15、16腳DDC通道(I2C)讀取顯示器中的EDID數據,并使HDMI 源端的TMDS信號發送電路開始工作。當HDMI顯示器與HDMI 源端之間的HDMI連接斷開時,HDMI 源端一側的HDP信號為低電平,那么HDMI源端的TMDS信號發送電路停止工作。
由于在判斷HDMI Sink端的HPD電路預留了一個控制端,如果HDMI Sink端的主處理器需要復位HDMI鏈接(包括重新HDCP握手認證),就可以拉低并再次拉高HPD來實現這個功能。
如前面介紹EDID時所述,HDMI規范規定,發送設備要檢測接收設備的第一個CEAEDID 擴展塊中是否包含HDMI VSDB,這個HDMIVSDB中是否包含IEEE 數據標識符0x000C03, 只有包含這個數據標識符的設備,才會被認為是HDMI設備,否則,被當作DVI設備處理。
一個HDMI設備的EDID 通常包含兩個模塊,第一個是EDID1.3的數據模塊,第二個是CEA 861B模塊,這個861B模塊中,一定要包含數據標示符 0x000C03。HDMI發送設備(Source)檢測到HPD 信號由低變高時,就會去讀取Sink端的EDID 數據,來確認接收裝置是否出現變化,并確定是工作在HDMI模式還是DVI模式。
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:
先偵測輸入頻率落在哪個頻帶,然后根據不同頻帶做不同設置。
用TV產生的晶振來數count,數得count后就知道TDMS Clock了
或者用1024個TMDS Clock來數晶振個數
由于視頻信號從RGB個8bit通過TMDS編碼后變成了10bit,然后又串行化,所以實際用于接收TMDS Data所用的時鐘應該為:
另外ReceiveClock也可以不用直接采用上面的乘法,而是采用TMDSClock為參考、硬件鎖相的方法來得到。
得到ReceiveClock后就可以去設置頻率PLL,然后對三個通道進行采樣得到TMDS Data。
Timming Detect
在Sink端還有需要進行Timming Detect,因為如果設備可以支持(如chroma),HDMI可以自由更換Timming,而當Timming更換了之后,Sink需要重新設定Phy。因此,通過偵測頻率的改變來檢測是否更換了Timing是必要的。一般會有一個中斷服務(或循環)線程來偵測頻率的改變,一旦頻率改變后,該進程會通知重新設定Phy,保證HDMI的正確運行
HDMI版權內容保護之HDCP
HDCP通過DDC傳輸
HDCP主要用于版權視頻的保護,舉例來說,如果有一臺藍光DVD播放機可以播放blueray DVD,并且該DVD已經獲得HDCP授權,你現在想把該DVD影像輸出到某臺TV,但是該TV沒有獲得HDCP授權,那么該TV可能就沒法播放影像,或者播放質量下降,如出現雪花,圖像從1080p變為480p,或者沒有聲音,都有可能。
HDCP是靠兩個設備的交互進行HDCP授權認證的,認證流程如下
給Receiver
要理解算法,首先我們需要知道ksv是用來干嘛的
Receiver也會做HDCP認證碼算法這個步驟得到km’
Transmitter與Receiver都會用km\km’去做hdcpBlkCipher,得到一個值R0與R0’
100ms后Receiver把R0’發送到Transmitter與R0做比較,相等則認為認證完畢。當然km = km’才能保證R0 = R0’。
此后的每一幀,Transmitter與Receiver都會運行一次hdcpBlockCipher,不過參數為上次生成的Ks與M,生成的新參數為Ks,M,T
在第128幀的時候,另R = T
在間隔第一次通信的2s后,再次進行認證
后續都采用7,8,9這三個步驟進行迭代認證
此外HDMI自1.1后還支持一個更快速與頻繁的認證方式,就是上方設備通信圖的下半部分
1. 在每第16的倍數幀,用T與當前幀的Channel0的0像素做異或得到Pj2. Channel0的0像素到達Sink后,也與Sink的T‘做異或得到P'j3. Sink把P'j發送到Source,與Pj做比較,相同則通過認證
了解HDCP對于處理HDMI的異常現象很有幫助,比如說如果時而出現雪花,有可能是信號不好導致Channel0的0像素出錯,從而第二階段的認證有時會不成功…
HDMI Sink總流程
總結
- 上一篇: HDMI 数据包简析
- 下一篇: 图灵奖得主大全