1. 程式人生 > >MIPI LCD除錯總結

MIPI LCD除錯總結

近來在用SSD2828驅動小米屏,沒有程式碼,沒有技術支援,自己寫程式碼反覆除錯,整死我了,目前已經能正常顯示圖片,現在總結一下與大家分享一下,
要點:
1. 小米3屏的解析度是1920*1080, 24bit, 行列畫素點為1080*1920, 預設顯示方式為從左->右,上->下,這個可以通過DCS指令修改.
2. SSD2828手冊上說SSD2828一行最大可顯示1920個畫素點(60Hz),而官網上說SSD2828的最大解析度為1920x1200,所以我一直認為SSD2828
行畫素最大可設定為1920,列最大畫素可設定為1200,實際上驅動小米3屏時,行列分別設定為1080*1920. 
3. 要用SSD2828最新的手冊,目前能找到的是V1.3,舊版本有些地方是錯的,誤導人.

4. SSD2828 RGB介面和MIPI介面的位數是一起設定的(通過B6暫存器設定),即沒有RGB為24bit,MIPI為16bit的這種情況.
5. SSD2828可支援的16,18,24bit的屏,而有的屏不支援16bit的,如小米3的屏就不支援,這個要看清楚.
6. 屏的data lane和SSD2828設定的要一致
7. SSD2828的VBP, VFP, HBP, HFP,和CPU這端設定不能一致,顯示不正常,我也不知道為什麼.

驅動初始化包括SSD2828,LCD屏的初始化
1. SSD2828初始化主要有設定PLL, 設定LCD引數(解析度,VBP, VFP, HBP, HFP).
CPU這端的Pclk設定為90~120MHz, SSD2828 PLL output為800MHz左右,900以上有些危險,干擾大(跟PCB有關係咯)

2. SSD2828提供給CPU介面,通過DCS設定LCD的一些引數,這個要看LCD手冊有哪些引數要設定,最主要的是0x29,0x11指令,
  讓LCD exit sleep mode和display on.

屏不顯示可能有幾種情況
1. 0x29,0x11指令傳送不對,LCD沒收到,一直在sleep狀態.
2. 屏要顯示,data lane上肯定有波型,如果data lane波型都沒有,那就是ssd2828都沒有配置好,跟CPU這端沒有關係.
3. data lane有波型,可能跟C9, CA, CB,這幾個暫存器有關,隨便設定幾個值試一下(最大,最小,中間值),我除錯了一週,就是C9沒有設定對,所以一直沒顯示


螢幕抖動可能跟VBP, VFP, HBP, HFP,這幾個引數有關,修改SSD2828和CPU LCD controler的這幾個引數試一下
顏色過度失真,右能跟B6暫存器中的PCLK_P和0xDB中的CLK_DELAY_SEL有關,我設定PCLK_P為1, CLK_DELAY_SEL為0,顯示圖片就好了.
不行可修改CLK_DELAY_SEL試一下,再不行我也沒辦法了.

除了必須設定的引數外,對顯示有影響的暫存器主要有:

C9, CA, CB, DB, DD, ED, 除錯中主要修改了這些暫存器

************************

在展訊平臺上點亮MIPI介面屏正常顯示需要滿足以下幾條就可以:

1:確認Lcd的驅動檔案被正常編譯編譯進去,並且lcd board name裡面註冊一質,我有一次就是因為編譯出現問題了,導致在kernel中無法正確讀取LCD的ic的id,導致系統載入屏的驅動失敗,造成系統進入kernel顯示花屏,這部分是非常重要的,假如未能正確的編譯進系統,你再怎麼除錯,屏照樣無法正常的顯示,這非常的關鍵!

2. 必須保證資料能夠正確的傳輸到屏上,我有一次除錯屏驅動時,發現屏上的顯示始終是一些橫豎條紋,或者直接灰屏,通過在示波器上檢測屏引腳的波形,發現屏上的資料不正常,根本沒有切換到hp下刷資料,導致屏無法正常的顯示,一般在讀取ic 的id和初始化設定指令時,都是在mipi的低速(lp)模式下,在初始化完成後,需要切換到高速(hp)狀態下,才能正常的顯示!

3. 必須保證ic設定的proch和timing,通道,速率正確,屏才可以正常的顯示,一般顯示出現花屏,顯示偏移等問題,通常情況下,就是因為你設定的某些引數不正確,導致顯示異常!

4:仔細檢查上電同時測量,同時將28rgb interface對應gpio設為lcdc func。對於傳統的lcd不需要RST操作只需拉高即可,對於mipi和需要下codeRGB panel需要RST高低高操作,這樣code才生效。注意一般sleep out(0x11)display on(0x29)之間需要mdelay(120)左右,貌似這個對於大部分panel是必須的。如果這部分延時不夠,會導致屏在進出睡眠或者顯示過程中出現白屏,無法正常的顯示!

5:最後還要確認是否有framebuffer輸出,要是改動了display這塊的clk很有可能沒有buffer輸出的,可以通過cat /dev/graphyics/fb0檢視有沒有輸出字元。曾經除錯開機logo連續顯示時遇到過好幾次沒有buffer輸出導致kernel卡住,屏也不亮按power鍵沒有反映的情況。

注:一般wvga以及更高解析度的陪你過通常採用2 line甚至更高的通道數,hvga及以下解析度的屏則通常採用單通道的mipi介面

    一般情況下螢幕顯示有flicker,可採用點翻轉解決該問題,但是會帶來功耗和潛在的不相容問題,因為有些玻璃不支援點翻轉,可能會帶來顯示的異常

**********************************

五.主要除錯經驗總結(個人+網路):

個人:

(1) DPI LCD最關鍵的配置是:DPI時鐘頻率,DE的極性,DPI CLK的極性。特別是DE的極性

如果反了,往往不能正常顯示(常見現象為螢幕出現麻點)。如果DE正確,DPI CLK反了,影象一般能顯示,但會傾斜。DPI時鐘頻率(PCLK)按照datasheet和LCD的解析度來配,過高過低都可能導致不能正常顯示。PCLK的設定公式為:PCLK=(WIDTH+前尖/後尖)*(HEGHT+前尖/後尖)*60~70(重新整理率)*1.1(補償)

(2) params->dpi.rgb_order 或 params->dbi.data_format.color_order 往往固定的配置為RGB順序。當

與LCD的實際順序不匹配時,會出現偏藍或偏紅的現象。這時可以通過修改LCD初始化程式碼中相關暫存器的設定來試其匹配。大部分LCD驅動IC使用0x36這個暫存器的某一位來設定RGB或BGR。

(3) 當影象顯示左右反或上下反時,可以修改暫存器0x36的設定。

(4) DBI LCD的暫存器0x3A一般用於定義資料寬度,其設定一定要與params->dbi.data_width一

致。否則導致資料不全,顯示的圖片顏色錯亂,清晰度大大降低。

(5) DBI LCD的暫存器0xC5一般用於定義重新整理頻率frame rate。多數LCD的default值為70~

80HZ。但在某些應用中,會出現頂部顯示有鋸齒,或者矩形圖示搖動時邊緣鋸齒。這時提高frame rate到90~100HZ,就能改善。

(6) LCD 的亮度可以通過修改power setting來提高或降低。這些設定一般在初始化程式碼中,不建議

自己修改,最好聯絡廠家。

(7) 有時FPC上的器件與LCD的背面金屬殼接觸導致短路,拉低,會影響顯示效果。

(8) 部分LCD調好過後,在切屏的時候會有中間被分割的現象,這主要是LCD的重新整理方向不對導

致的,這個也是在0x36暫存器裡面設定的

(9) Tuna上的國顯LCD(rm68120),出現部分模組低部有重影區域的現象,我們試過降低PCLK到

很低,可以解決重影現象,但這不是解決辦法。看上去是LCD的一致性的問題,最後晶片商給了一個修改方案,修改B300暫存器,這個暫存器在規格書上都沒有描述。所以具體的真正原因只有晶片上知道了。

(10) DBI介面,寫入初始化程式碼後,在其他訊號均正常的情況下,螢幕沒有反應,還是為白屏,看上

去是沒有寫成功,仔細檢查是寫命令的引腳控制不對,一些晶片的寫命令pin為D[0-7],一些為D[1-8],所以需要區別對待,在發命令的時候做一個移位

(11) 系統在休眠的時候功耗較大,而且經過排查就是LCD導致的,查看了休眠程式碼suspend,發現

是休眠程式碼的delay時間過短,導致LCD根本未完全進入休眠,系統就休眠了

(12) 還有出現的比較多的就是白屏問題,原因也很多,常見的為:背光亮的太早,初始化不成功,

suspend/resume的delay時間不合適等

(13) 螢幕出現抖動,除了要排查相關的訊號線,最好也去看看給的工作電壓是否匹配(不要太迷信自

己設的,最好能用儀器測試)

(14) 還有各種其他問題,歸結起來所有的bug要不是host這段的訊號設定有問題,要不是初始化代

碼中的暫存器設定問題,這些都是可以通過具體硬體情況和相關datasheet來解決的

******************************************************

* 除錯記錄

        LCD半邊閃屏問題,原廠給的資訊:分析了系統板送出的 video mode timing,資訊摘要如下


        HSCLK: 160MHz 
        Per lane bit-rate: 320Mbps (UI=3.125ns) 
        HS SoT HS-prepare + HS-zero 約 155ns   

        由上述的 timing 懷疑與現象是因為 IC HS data settle timing 搭配不當所導致
        看來是我們輸出的mipi訊號 HS-prepare + HS-zero 比 LCD 預設設定短引起的。還有隨機整屏閃動的問題通過調節 VFP 和 VBP 的值調到了理想狀態。另外 LCD 的 VCC 在使用 mos 管控制後休眠後會有 2.0V 的懸浮電壓,通過 RC 電路將電壓放掉,將 C78 換成了 10K 電阻。
        LCD電路上有幾個比較重要的電壓: AVDD、VCC、VGH、VGL、HAVDD、VCOM(由AVDD通過電阻分壓得到)

* 喚醒慢的問題

在最初除錯的幾款 LCD 裡面初始化 cmd 都比較少,後來在除錯一款 IPS 屏的時候發現喚醒需要 3 秒左右,這款 LCD 初始化 cmd 有100多條,之前在除錯一款 LCD 的時候每條 cmd 傳送之後需要 delay 10ms 再發下一條 cmd,所以在這款 LCD 這裡不能有 delay,並且經過除錯在確保傳送成功的情況下將 LP 的傳輸速度提高了 3 倍(這裡需要讀取每條 cmd 的返回值 0x84 確認命令是否傳送成功),優化後喚醒時間不到 1 秒。

* LCD 引數理解更正

才發現之前一直對 LCD 的幾個引數 HFP、HBP、VFP、VBP 理解有錯誤,正確的應該是以同步訊號(HSYNC、VSYNC)為基準,在同步訊號之前的稱為 Front,在同步訊號之後的稱為 Back,而不是之前理解的以有效畫素為基準。

* LCD 顯示呈鋸齒狀問題

這兩天(12.11)還除錯了一款 540 x 960 解析度的 mipi LCD,在開始的時候一直點不亮,和供應商確認了好久無意間才發現是他們給的初始化程式碼是錯的,使用正確的初始化程式碼就能點亮了,不過顯示出來的影象卻是呈鋸齒狀的,即沒有對齊。之前在別的平臺也遇到過類似問題,也就是解析度不是 16 的整數倍,LCD controller 在取資料的時候會對不齊。邊研究 Datasheet 邊和 ASIC 同事討論,後來確定了一個方案:即在 DSI、LCD 暫存器裡面設定解析度為 540 x 960 以讓 LCD 正確識別訊號,但 framebuffer 需要設定為 544 x 960 以對齊,並且設定 Source pitch 暫存器為 544,這樣顯示就正常了,相當於 framebuffer 裡每一行的最後 4 個 pixel 會被 LCD controller 丟掉。

今天(12.12)在和 ASIC 同事的討論下更正了之前的理解:LCD controller 在計算取資料的時候,地址是根據(x,y)座標來算的,差不多是address = y * pitch + x + base,pitch 就是一行 pixel 在記憶體裡的大小,這個至少是要對齊到 8byte, 因為 bus 寬度是 8byte,如 Data sheet 中的描述 ”Source pitch for RGB channel, QWORD aligned if linear mode“。之前計算 pitch 值的公式為:xres / 8 * bits_per_pixel / 8,如果 xres = 540,bits_per_pixel = 32,計算的結果因為取整的原因為 0x10c,實際上正確的值應該是 0x10e,所以需要將公式改為:xres * (bits_per_pixel / 8) / 8,即在每個畫素佔 4byte 的情況下只要 xres 為偶數就可以滿足對齊的要求,而不用改為 544。