1. 程式人生 > >【轉】 HDMI介紹與流程

【轉】 HDMI介紹與流程

接收 獲得 www gpo rac math ... dev smi

轉自:https://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為[email protected](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:
    1. Hotplug為High,不過EDID並沒有準備好,那麽信號源設備會由於無法讀到EDID而認為接收設備為DVI,這樣會導致HDMI有圖像無聲的問題。
    2. Hotplug為Low,也會導致信號源無法讀到EDID而認為接收設備為DVI,從而導致HDMI有圖無聲
    3. 在TV這種有多個HDMI通道的情況下,有時會在多個HDMI通道進行切換,切換後HDMI通道應當先初始化,即先把Hotplug拉低,通知HDMI source device之前所用的EDID已經改變,需要重新讀取,那麽source device在Hotplug被拉高的時候會去讀取新的EDID,但是拉低這個過程至少需要100ms,否則source device有可能不會去讀取新的EDID,從而輸出DVI信號

傳輸流程

HDMI TMDS傳輸的數據類型有三種(加上Hsync與Vsync就算4種):

  1. Preamble(控制信息),主要用於控制接下來傳輸的數據是Data Island或者Video Data
  2. Data Island(數據包),各種類型的包信息,包括音頻數據包,圖像信息包等
  3. Video Data (視頻信息),視頻像素數據,HDMI可以傳輸RGB與YUV兩種格式的像素數據
  4. 還有Hsync與Vsync

HDMI的數據傳輸有TMDS0,TMDS1,TMDS2三個通道,每個通道的傳輸流程都是一樣的:

  技術分享圖片

如果是8bit的數據進入TMDS編碼器,得到抗幹擾性強的10bit TMDS信號,然後再進行串行化輸出;在接收端收到串行的HDMI信號後,進行信號復原,得到10bit的TMDS信號,最後用TMDS解碼器解碼得到原來的8bit數據。

總體傳輸流程如下:

  技術分享圖片

  

  1. 如果傳輸的是Video Data,並且格式為RGB,那麽會占用三個通道的所有24bit輸入,Channel0[7:0]用於傳輸B,Channel1[7:0]用於傳輸G,Channel2[7:0]用於傳輸R。
  2. 如果傳輸的是Data Island,則占用三個通道共10bit輸入,Channel0[3:2]用於傳輸Data Island Header(包頭),Channel1[0:3]與Channel2[0:3]用於傳輸Data Island Content(包內數據)。
  3. 如果傳輸的是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數據傳輸可以分為三個傳輸周期:

技術分享圖片

  1. Control Period期間會傳輸Hsync,Vsync,並且在該時期的最後階段會傳輸Preamble
  2. Data Island Period期間會傳輸Data Island(數據包),也會有Hsync與Vsync
  3. Video Data Period期間會傳輸Video Data(視頻像素數據)

某幀的總體周期如下:

技術分享圖片  

三個傳輸周期的過渡如下:

技術分享圖片  

  1. 左邊是Control Period,傳輸有Hsync,Vsync與Preamble
  2. 中間是Data Island Period,傳輸有Hsync,Vsync,以及兩個Packet Header與Packet(每32個clock 一個packet);另外Data Island的兩端會用Guard Band保護並隔開Data Island的數據,因為這個階段傳輸的數據大多是非常重要的,比如其中就有圖像分辨率,決定後面的Video Data數據的顯示方式
  3. 右邊是Video Data Island,傳輸視頻像素數據,在該時期的開頭也有Guard Band

Data Island Packet結構

技術分享圖片

  

所有Data Island Packet都以32個時鐘脈沖為一個周期,也就是說每32 clk傳輸一個包。

以上圖為例,

  1. 包頭部是BCH block 4,由Channel0[2]傳輸,32clk表示有32bit,則為4byte,前三個byte為包頭,最後一byte為校驗碼
  2. 包體為BCH block 0,1,2,3,分別由Channel1,Channel2共8根線傳輸,共有24byte與6byte的校驗碼
  3. 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重建依靠的主要參數為:

  1. TMDS Clock
  2. CTS
  3. N

在發送設備這端,已知參數有采樣率fs,視頻時鐘Video Clock(TMDS clock),以及預先設定好的參數N,求CTS:

CTS=NfTMDS128×fxCTS=N∗fTMDS128×fx

在接收設備這端,TMDS clock通過硬件設備可以得到,N,與CTS通過Audio Packet傳輸過來,求fs:

128fs=N×fTMDSCTS128∗fs=N×fTMDSCTS

在接收端為了保持fs的穩定與精確,需要進行鎖相,即用VCO(Voltage-controlled oscillator壓控振蕩器,通過電壓控制產生的頻率)產生合適的頻率,然後用PFD(Phase Frequency Detector)來鎖頻

技術分享圖片

  1. 首先,由於VCO有個最佳的工作區域如(200MHz~500MHz),那麽為了保證VCO在最佳工作頻率內,我們可以從後倒推回來,先對輸出的fa128做乘法得到 fvco=fa128×S×S2fvco=fa128×S×S2 由於fa128fa128只有那麽幾種(44.1k,48k等),所以比較容易得到SS與S2S2
  2. 然後,為了更快進行頻率匹配,需要對近來的頻率fxfx(就是晶振時鐘fcrystalfcrystal)或者fvfv(pixel clock)做除法,也對fvcofvco做除法,令兩個趨向相等。對於細微的區別可以用D Code 進行修正 fvcoM=fxKfvcoM=fxK
  3. 最後做PFD鎖相
  4. 第2,3步的反饋操作循環地進行,最後可以得出比較穩定的fvcofvco
  5. 最終得到 fa128=fvcoS×S2fa128=fvcoS×S2

HotPlug

HotPlug即熱拔插,當接上接口時就可以判定設備是否存在,以進行後續工作。

HDMI source device(HDMI HPD)會監測sink device的Hotplug端口,如果Hotplug為High,則證明設備可以工作,然後去讀取DCC,如果為low,則證明設備已斷開。

HDMI sink device應該通過把Hotplug拉低,來通知source device EDID已經被改變,那麽source device在Hotplug被拉高後,就會重新來讀取新的EDID,拉低這段時間應該多於100ms。

HDMI規定,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,可以設置Hotplug,還有DCC傳輸用的I2C引腳。上面已經講了TMDS Data,與設置Hotplug,接下來分析TMDS Clock。

TMDS Clock 就是Pixel Clock,即一個像素點所用的時鐘頻率。TMDS Clock通過clk 引腳傳輸到接收端,但是接收端並不清楚發送端發過來的TMDS Clock 頻率為多少,因此需要通過Phy(PHY是模擬數字轉換部分,不同於ADC,PHY是不知道采樣頻率的,需要自己鎖頻、鎖相,偵測確切的輸入頻率)來進行鎖相得到。但是由於HDMI頻寬太寬([email protected]為25.2MHz,[email protected]為162MHz,甚至還有高達340MHz的),一般VCO(壓控振蕩器,通過電壓控制產生的頻率)無法覆蓋這麽大的範圍,因此需要分頻帶來設置Phy:

先偵測輸入頻率落在哪個頻帶,然後根據不同頻帶做不同設置。

用TV產生的晶振來數count,數得count後就知道TDMS Clock了

fcrystal=count×fTMDSfcrystal=count×fTMDS??

或者用1024個TMDS Clock來數晶振個數

1024×fTMDS=count×fcrystal1024×fTMDS=count×fcrystal??

由於視頻信號從RGB個8bit通過TMDS編碼後變成了10bit,然後又串行化,所以實際用於接收TMDS Data所用的時鐘應該為:

fReceiveClock=10×fTMDSfReceiveClock=10×fTMDS

另外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授權認證的,認證流程如下

技術分享圖片

  1. Transmitter會發送一個key An(64bit)與Aksv(key selection vector 40bit)給Receiver
  2. Receiver接收到An後,也會發送一個Bkvs以及REPEATER(表明B設備是否為Repeater設備)給Transmitter
  3. Transmitter開始HDCP認證碼算法:

    要理解算法,首先我們需要知道ksv是用來幹嘛的

    1. 在每個HDMI設備內部,都會保存40組64bit的key,key[40]
    2. 40bit的kvs,每一個bit都是一個索引,當kvs的某一位n為1時,會把key[n]取出來,
    3. 把所有的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像素到達Sink後,也與Sink的T‘做異或得到P‘j
  3. Sink把P‘j發送到Source,與Pj做比較,相同則通過認證

技術分享圖片

了解HDCP對於處理HDMI的異常現象很有幫助,比如說如果時而出現雪花,有可能是信號不好導致Channel0的0像素出錯,從而第二階段的認證有時會不成功...

HDMI Sink總流程

技術分享圖片

  1. 提取與分割10bit的TMDS串行數據
  2. 10bit的數據,通過不同線路進來的,判斷是哪種類型的:DE,Data Island,RGB,Hs,Vs,Ctrl
  3. TMDS解碼
  4. HDCP解碼,同時Hs,Vs,DE做delay
  5. RGB與DE,Hs,Vs...
  6. BCH解碼得到Packet,錯誤驗證
  7. Packet含義解析
  8. 如果是信息,則存到內存
  9. 如果是Audio Data,生成采樣頻率
  10. Audio輸出

【轉】 HDMI介紹與流程