本文轉載自:http://www.voidcn.com/blog/LoongEmbedded/article/p-6109759.html
1. MIPI DSI
DSI:displayserial interface,顯示串行接口。一個時鍾lane,一個或多個數據lane
DSI分層結構:

圖1
2. MIPI DSI協議介紹的數據包格式
分為短包和長包,短包4個字節,長包6~65541個字節,不管短包還是長包,DI(data identifer數據標識符)都是第1個字節。
2.1 長包格式

圖2
長包由幾部分組成
(1) 一個32位的包頭(PH:packet Header)
由一個8位的DI、一個16位的字數(WC:word count)和一個8位的ECC。其中DI由數據的VC(virtualchannel)和具體應用的負荷數據DT(data type數據累類型)組成。WC指定datapayload中在包頭和包尾之間的字節數,不包括包頭也不包含包尾。ECC(錯誤校驗碼Error Correction Code)可以校驗包頭中DI與WC一個位錯誤的情況和可以發現2位錯位的情況。
在包頭的結尾,接收器接着讀取data payload block中data payload(WC個字節數的數據)。
(2) an application-specific datapayload with a variable number of bytes一個字節數可變的,且與具體應用工相關的數據負
(3) 一個16位的包尾(packet footer)
包腳只有一個16位的校驗和(checksum)
接收器讀了Data Payload后,會接着讀取在包尾中的Checksum。Checksum
由主處理器(host processor)計算和傳輸。需要注意的是如果Data Payload為0字節,那么計算出來的Checksum為0xFFFF,如果不計算Checksum,那么包尾由0x0000(2個字節)組成。
2.2 短包格式

圖3
短包由3部分組成:
(1) 一個8位的Data ID
(2) 兩個(命令或是數據)字節
(3) 一個8位的ECC
沒有包尾,短包固定是4個字節長度。
2.3 共同的包元素
2.3.1 數據標識符字節(data identifierbyte)
任何包的第1個字節是DI字節,它由VC和DT組成,如下圖:

圖4
(1) VC對應DI[7:6]
VC指定虛擬數據通道,最多表示4個。一個處理器最大可為4個外設(這里指顯示屏IC)服務,使用VC,可定位到不同的外設。雖然這個MIPI DSI協議允許和多個外設通訊,但此協議只能用於一個主處理器到一個外設的通訊。
(2) DT對應DI[5:0]
指定數據類型,比如0x06,是指DCS READ, no parameters。指定這個包是長包還是短包和包格式,DT結合WC高通接受器這是個多少字節的長包。這是必要的,因為沒有具體包開始和結束的同步碼來指示包的開始和結束,這允許包傳輸任意數據,但還是需要包頭來顯示指定包的長度。
當接收邏輯倒計時到包尾時,接收器假設下個數據是一個新包的包頭或是傳輸結束。
(3) 指定數據類型
2.3.2 ECC(Error Correction code)
ECC可以校驗包頭中DI與WC一個位錯誤的情況和可以發現2位錯位的情況,主處理器負責計算和傳輸一個ECC字節,外設支持正向和方向通訊的ECC。
(1) ECC的規則

圖5
第一個24數據位D0~D23包含了完整的DSI包頭,所以校驗位計算可優化為:

圖6
(2) 發送器的ECC產生

圖7
(3) 接收器的ECC產生

圖8
2.3.3
2.4 長包Payload的checksum產生
長包的包頭由一個字節的ECC保護,為了檢測長包傳輸的錯誤,checksum基於數據包的payload部分來計算,需要注意,一個零字節長度payload的長包,其checksuam為0xFFFF。
Checksuam只能指示payload一個或多個錯誤的出現,不像ECC,checksum不能修復錯誤。所以,checksum計算對單方向的DSI實現沒有作用,因為外設沒辦法報告錯誤給主處理器。
主處理器強制產生和發送checksum
(1) Checksum的發送

圖9
(2) Checksum的產生

圖10
(3) Checksum產生的例子

圖11

圖12
