HDMI接口
http://baike.c114.net/view.asp?id=17671-21565442
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:
其中
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通信幾乎是最先做的(前有Hotplug),因為HDMI的主從兩個設備需要通過DDC來獲得他們對方設備的EDID,從而得到各種信息,並且通過比較timming以確定以后送出來的timming為最合適的
17 為接地引腳
18 為5v的AC引腳
19 為Hotplug(熱拔插)引腳(用於監測HDMI設備有沒有存在,如果存在(Hotplug為high)那么可以通過DDC去讀EDID),HDMI 有規定在HDMI 5vAC斷電時source device可以讀reciever device的EDID,也就是需要Hotplug為High。其中有兩種Hotplug相關的情況會導致HDMI被識別為DVI:
- Hotplug為High,不過EDID並沒有准備好,那么信號源設備會由於無法讀到EDID而認為接收設備為DVI,這樣會導致HDMI有圖像無聲的問題。
- Hotplug為Low,也會導致信號源無法讀到EDID而認為接收設備為DVI,從而導致HDMI有圖無聲
傳輸流程:
HDMI TMDS傳輸的數據類型有三種(加上Hsync與Vsync就算4種):
- Preamble(控制信息),主要用於控制接下來傳輸的數據是Data Island或者Video Data
- Data Island(數據包),各種類型的包信息,包括音頻數據包,圖像信息包等
- Video Data (視頻信息),視頻像素數據,HDMI可以傳輸RGB與YUV兩種格式的像素數據
- 還有Hsync與Vsync
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:
C
在接收設備這端,TMDS clock通過硬件設備可以得到,N,與CTS通過Audio Packet傳輸過來,求fs:
128∗f
在接收端為了保持fs的穩定與精確,需要進行鎖相,即用VCO(Voltage-controlled oscillator壓控振盪器,通過電壓控制產生的頻率)產生合適的頻率,然后用PFD(Phase Frequency Detector)來鎖頻
1. 首先,由於VCO有個最佳的工作區域如(200MHz~500MHz),那么為了保證VCO在最佳工作頻率內,我們可以從后倒推回來,先對輸出的fa128做乘法得到
f
由於f只有那么幾種(44.1k,48k等),所以比較容易得到S與S
2. 然后,為了更快進行頻率匹配,需要對近來的頻率f(就是晶振時鍾f)或者f(pixel clock)做除法,也對f做除法,令兩個趨向相等。對於細微的區別可以用D Code 進行修正
f
3. 最后做PFD鎖相
4. 第2,3步的反饋操作循環地進行,最后可以得出比較穩定的f
5. 最終得到
f
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了
f??
或者用1024個TMDS Clock來數晶振個數
1024×f??
由於視頻信號從RGB個8bit通過TMDS編碼后變成了10bit,然后又串行化,所以實際用於接收TMDS Data所用的時鍾應該為:
f
另外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總流程
- 提取與分割10bit的TMDS串行數據
- 10bit的數據,通過不同線路進來的,判斷是那種類型的:DE,Data Island,RGB,Hs,Vs,Ctrl
- TMDS解碼
- HDCP解碼,同時Hs,Vs,DE做delay
- RGB與DE,Hs,Vs...
- BCH解碼得到Packet,錯誤驗證
- Packet含義解析
- 如果是信息,則存到內存
- 如果是Audio Data,生成采樣頻率
- Audio輸出
-
HDCP
HDCP是高帶寬數字內容保護,TMDS訊號要經過HDCP加密,保證數字訊號不能輕易被復制。8b/10b
8b/10b是一個數字化處理方法,是由IBM最先提出的專利,現在其專利已經超出保護期,成為了一個公眾技術,其目的是提高數字訊號的抗電磁干擾(EMI)能力,提高訊號的准確性;工作方式簡單說,就是將8個0、1組成的數字訊號,重新編碼,前5個重編成6個,后3個重編成4個,經過這樣的轉換,將8個一組的數字訊號轉換成10個一組。傳輸完成后,接收端再進行反編譯,將數字訊號還原。