轉自:[LCD顯示異常分析——撕裂(tear effect) ](https://blog.csdn.net/hexiaolong2009/article/details/79319512) 概述 在上一篇《 "LCD顯示異常分析——開機閃現花屏" 》中,我們一起分析了開機花屏的問題,在這一篇中,我 ...
概述
在上一篇《LCD顯示異常分析——開機閃現花屏》中,我們一起分析了開機花屏的問題,在這一篇中,我將對LCD撕裂(tear effect)問題進行詳細分析,以及給出這類問題的常用解決方法。
本文適用範圍:
- 對象:LCD驅動調試人員
- 硬體:帶GRAM的LCD (如SPI/MCU/DSI CMD屏)
- 軟體:所有嵌入式操作系統
現象
首先貼一張動態圖,讓大家能直觀的感受撕裂形成的過程:
分析
從上面的動態圖我們可以看到,在第二幀出現了新舊畫面各顯示一部分的現象,該現象即為撕裂,英文又叫tear effect。tear effect的根本原因是對GRAM的讀、寫速度不一致,導致在一幀之內,GRAM的讀指針(R)與寫指針(W)發生了重疊導致。
這個現象其實包含2個信息:
- W和R指針重疊了
- 指針重疊後的畫面在屏上靜止不動保持了整整1幀的時間(60fps的話就是16.7ms),這個時間是足以被人眼察覺到的
有經驗的開發人員都知道,出現這類問題往往都是因為有個2倍關係沒有調整好。何為“2倍關係”?即必須保證W:R > 1:2
(這裡的W、R都指的是速率),否則勢必會出現撕裂的現象(如上面的W:R=1:3)。
理想情況
為什麼是2倍?請看下圖(W:R=1:2):
因為W < R,所以R指針跑在前面,因此讀出來的數據都是舊數據,屏幕第1幀顯示的還是上一幀的圖像,直到第2幀才將GRAM中的圖像完整的顯示出來。如果R再稍微快那麼一點,那麼在第2幀R指針就又會趕上W指針,這樣就會再次出現tear effect現象。所以W:R=1:2是撕裂發生的臨界值。
同理,那如果對於W > R的情況,是否也存在這個2倍關係?
回答這個問題前,我們先來看看下麵這兩幅圖:
圖1 (W:R=3:1)
圖2 (W:R=2:1)
從上面的圖中我們可以看到,對於W > R這中情況,確實也存在2倍關係。但是這種由於W > R而造成的撕裂現象一般是不可能發生的,因為大部分顯示驅動都是等到TE信號到來時才開始刷圖的,所以只要R指針還沒有掃描完當前幀的畫面,W指針是不可能立即去GRAM中刷畫面“B”的,一定會等到畫面“A”徹底顯示完畢後才開始繪製,所以上面的圖1、圖2兩種情況都不會發生。
因此為了防止撕裂的發生,只需要保證W > R/2 (這裡指速率)即可。
實際情況
前面分析的現象都是基於一個前提條件的,那就是:
指針W和R都是基於同一個時間點、同一個GRAM起始位置開始掃描的
只要上面的2點有一個不滿足,那麼2倍關係就不成立了。
因為對於這類帶GRAM的LCD ,驅動軟體或LCD Controller硬體都會做成等待TE信號
到來時才會開始刷圖,所以對於第1點這裡不做詳細描述,只針對第2點進行講解。在LCD的實際顯示過程中,其實是有消隱區的(即Porch區域),而且一般屏廠會將TE信號預設放在內部DriverIC的VSYNC階段送出,這就導致了指針W無法滿足和R從同一GRAM起始位置開始掃描,具體過程如下圖:
從上圖我們可以看到,雖然W:R=2:3,滿足W > R/2的條件,但是由於它們不是從GRAM的同一起始位置開始掃描,所以仍然會出現W和R指針碰頭的情況,最終導致撕裂的現象。
那麼對於上述這種情況,有什麼方法可以解決嗎?是時候召喚出TE Output Line了!
TE Output Line
LCD DriverIC廠商還是很貼心的,為瞭解決上述問題,工程師們專門預留了一個TE Output Line
寄存器,該寄存器的作用就是用來調節TE信號
(又叫FMARK信號)的輸出位置。預設情況下,該寄存器的值為0,即DriverIC內部刷新時的VSYNC期間。那麼對於上述情況,我們只需要將TE Output Line的值設置為VSYNC+VBP的值即可。
- 對於主控端,Vporch往往由VSYNC+VBP+VFP構成;
- 對於LCD DriverIC廠商,他們定義的VBP其實往往是包含VSYNC的;
如下圖:
結論
撕裂的本質:
- 在1幀時間內,W和R重疊了
- 撕裂的畫面停留了1幀的時間,被人眼所覺察
解決方法:
- W > R/2 (這裡指速率)
- 開啟TE同步信號
- 調整TE Output Line