[筆記分享] [Display] MIPI 協議之DSI
介紹
DSI全稱Display Serial Interface,主要用於顯示模組的一個介面,它基於MIPI協議而產生,基於MIPI協議的還有CSI(camera serial interface), DBI(display bus interface), DPI(display pixel interface)。相對於一般的RGB介面,DSI有成本低,高速率的優勢。在MSM8960平臺上,RGB介面已經被移除掉了,留下的只有DSI-4lane, DSI-3lane介面了。如下為簡單的主機與顯示模組的連線圖:
可以看到DSI用的是差分訊號傳輸,一個為clock,其他都為data線,最大為4條lane,具體使用幾條lane由專案中顯示需要傳輸的資料量決定,當然,lane使用原則為越少越好,減少佈線。
DSI是分層打包傳輸資料的,如下圖:
總共有四層,上面三層是屬於DSI的內容,它基於PHY layer而工作。下面以host端為例對描述下每層大概功能,對於client端的動作恰好相反:
- PHY layer:說白了主要是用來捕捉“0” 和“1”序列電平訊號的,另外還產生髮送data所需要的SOT(Start of transmission)和EOT(End of transmission),後面會說到。具體可以參考mipi spec裡的d-phy介紹。
- Lane-management layer: 將PHY蒐集的訊號做一個合併或分發。
- Protocol Layer: 將位元組流打包成DSI packet, 以及產生驗證ECC,另外還有錯誤校驗。
- Application Layer: 資料互動,轉換pixel data, signal events 和commands為位元組流。
DSI模式
DSI支援兩種基本操作模式, command mode和video mode。 Video mode表示無論當前顯示是否有資料更新,DSI host端一直送資料給panel顯示。Command mode表示只要當資料畫面有變化時,DSI host端才送資料給panel顯示。
上圖可以看出,video mode沒有framebuffer,需要CPU一直重新整理資料。而command mode中,panel driver IC有Ram來存顯示的資料做自我重新整理。
由於command mode不需要CPU一直重新整理資料,看起來要比video mode來的省電,但是Panel的自重新整理需要費電。(Qualcomm8260有timer機制,測試下來平均電流省電將近10mA.)
另外,command mode support傳送資料以及讀取狀態資訊的功能,所以它相比video mode是個雙向傳輸介面。
Video mode類似於RGB介面的傳輸方式,以High Speed Mode來傳輸。
這裡提下顯示需要同步重新整理機制, command mode通過TE pin來同步,video mode通過將v-sync及h-sync訊號包含在資料包裡傳送給panel來做同步,和RGB不同的時RGB專門有v-sync以及h-sync PIN來同步。
HS mode和LP mode
主機和外設之間是根據clock來傳送資料的,通過匯流排傳送高速資料叫做High Speed Mode或者burst。
在這些傳輸中間,或者資料在沒有傳輸時,或者接收資料時,Lane會進入low-power state mode。下圖為基本的HS(High Speed)傳輸結構:
PHY協議中有定義每次最小傳輸位元組數,後續再介紹。
單雙向傳輸
前面說到,硬體上有一個clock lane以及1~4個data lane.其中,data 0在Command mode時,應該作為雙向lane,其他data lane都是單向。而在video mode時,data0 lane可以作為雙向lane, 其他data lane也是作為單向傳輸。
Forward direction LP傳輸應使用data0 lane, reverse direction on data0 lane應是在LP mode下。 當然,外設肯定先要支援LP和HS mode。
clock
DSI主要有個DSI clock,服務於DSI controller,然後它又被分成各種不同的clock來服務DSI模組。
- DSI Bit Clock: 用於捕捉序列data bits。在資料傳輸的時候處於工作狀態。
- Byte Clock: 在HStransmission時,每個byte的data需要一個byte 的clock來完成,byte clock用於lane
managerment layer層。一個byte DSI clock為Byte clock. 也是在資料傳輸的時候工作。 Application Clock: 在資料傳輸和不傳輸的時候都可能會被用到,也可能會被用於外設電路。
對於clock這個lane,作為continuous clock behivor時,clock一直處於工作狀態,而作為non-continuous clock behavior時, clock在每次HS data傳輸之間進入LP11狀態。
DSI pixel Clock: 顧名思義,就是一個pixel所需要的clock大小,那麼就和一個pixel的bits位數有關係了。
各種clock之間的關係:
Bit clock to Byte clock — 8:1
Byte clock to DSI clock — 1:#lanes
DSI clock to Pixel clock — pixel depth:1
我們主要關注bit clock, 基於解析度,lane數量,fps等,我們可以計算出bit clock。如目前我們平臺上解析度為QHD(540 * 960), 用的是兩個data lane, fps(frame per second)為60, 位深為24bit, 那麼計算公式為:
Bit clock = (540 * 960 * 60 * 24) / 2 = 373248000 Hz
如果算上不可見區域(參考第5節lcd controller時序圖), 那麼應該為:
Bit clock = ((540 + 22 + 22+ 6) * (960 + 33 + 33 + 7) * 60 * 24) / 2 = 438818400Hz
如下圖會Qualcomm推薦不同解析度的lane配置:
單lane以及多lane資料分發和收集
當我們使用一條data lane的時候,可以知道資料是按照LSB或者MSB一個byte一個byte傳送的。當需要擴大頻寬而使用多條data lane的時候是如何傳送的呢,通過下面的圖就有很好的認識了。
而在receiver端,做的其實是相反的動作,將傳送過來的data給收集起來,達到串轉並的效果,如下圖:
這些data都是在HS mode下傳輸的,而且每個lane在在傳輸之前先發送一個SoT給receiver端表示第一個位元組packet的開始。
可以看出在每個dsi clock時間點,host端data0 lane傳byte0, data1 lane傳送byte1, data2 lane 傳送byte2, data3 lane傳送byte 3。Host和client配置的lanes要一致。
注意到傳輸的packet有可能不是我們設定的lane數量的整數倍時,該如何做呢?Lane management layer會在提早傳送完資料大data lance上先使資料無效。還是以圖說話吧,下圖是2 data lane一個整數倍傳輸,一個不是整數倍傳輸的情況。可以看到不是整數倍時,當data lane1先發送完成之後,它進入了LPS狀態。
當然,使用3lane或者4lane的情況以此類推。
協議
兩種傳輸方法
需要傳送的資料,命令,會在protocol layer會被打包成packet,組織成section的形式,然後通過Lane Management layer傳送給PHY.在PHY layer層,packet會被serialized後再發送出去(傳送packet前先插入一個SoT,結束時再插入一個EoT)。當有多個lanes時, Lane Management layer會將distributes資料包給各個PHYS.
最簡單的狀況,一個傳輸包含一個packet,但是當packet很多時,由於每次HS mode傳輸間會插入LPS,這樣效率會很低。所有有了如下Separate transmission和Single Transmission兩種傳輸方式:
- Separate方式: 無論是short packet 或者 long packet傳輸,中間都會加上LPS.
- Single 方式:在發完Short packet之後馬上傳送Long packet,不插入LPS.
Short packet 和Long packet
Short packet: 4位元組固定長度,包含ECC。用於大部分command mode 命令和引數傳送,或者是video mode下傳送H Sync以及V Sync edges。
Long packet: 有兩個bytes是用於指定傳送payload的長度, 因此payload範圍是0 到 216 -1這個位元組長度。 一般用於傳輸大顯示資料。
無論是SP還是LP,packet的第一個自己都是Data Identifier(DI), 它主要指定了packet的type是什麼。
另外, 從外設返回回來的最大return packet size也可以通過command來設定。
Short Packet
下圖為SP的結構,一個byte DI後面跟著兩個位元組command或者是data,然後再加一個byte的ECC.
Long Packet
Long packet資料格式如下圖,前面一個DI,兩個bytes的payload,用於說明後面有多少data資料。其他還有ECC, 兩個位元組的checksum。
Data Identifier Byte
前面說了,任何一個packet的第一個位元組都是DI, 下圖為DI結構:
DI[7:6]為VC數量,用於有多個外設的情況。
DI[5:0]指定date type,它能指出當前為LP還是SP。當為LP時,能指出LP還是多少資料還沒傳送完。
各種data type如下,各個data type所表示的意義可以查詢spec,這裡只介紹最常用的
幾種:
a) Generic Short Write, data types = 03h, 13h, 23h
這些命令以short packet type來發送給外設的。Packet 有4個位元組,包括ECC byte, 兩個data type引數位元組,一個DI byte, 其中bit[5:4]表示有效引數位0,1還是2.當只有一個引數時,第一個引數跟在DI後面,第二個data byte值為0x00.
b) Generic READ request, data types = 04h, 14h, 24h
Generic read request是請求從外設讀取資料的一個short packet。 和前者一樣,它也能返回0到2個引數。要注意到Set Max Return Packet Size命令會限制返回packet 的size, 所以主機應該要注意buffer是否會有overflow的情況。當請求資料大於return size時,host應該獨立的多次讀取,當然,前提是要peripheral要支援連續多次讀取。
由於是個read command,在每次讀取請求完之後,需要傳送一個BTA。
外設返回的值有如下情況:
a. 當有error時,會發送ackknowledge和error report.
b. 當沒有error時, 會返回read commands需要的packet資訊和ECC,如果checksum使能了,也會返回checksum。
DCS commands包括read和write和Generic Read/Write類似。
BTA
當host要求從peripheral獲得一個response時,如一個READ data或者狀態資訊,它就會在最後一個packet傳輸後面插入一個TurnRequest到PHY layer, 這樣就告訴PHY layer在EOT後面加一個Bus Turn-Around。
當peripheral 接收到BTA請求後, 它的PHY layer層就插入一個TurnRequest作為input傳送給Protocol layer告訴它也發一個response給host。當然,packet裡會表明要傳送什麼樣的response給host。在傳輸response完成之後,peripheral 應該將匯流排控制權重新交給host。