1. 程式人生 > >ARM的LCD控制暫存器和原理(抖動演算法和FRC)

ARM的LCD控制暫存器和原理(抖動演算法和FRC)

控制器簡介

       在複雜的PC機中,我們經常提到顯示卡這個東西,相信大家對顯示卡的原理都不陌生。LCD控制器就相當於嵌入式系統的顯示卡。它負責把視訊記憶體中的LCD圖形資料傳輸到LCD驅動器,併產生必須的LCD控制訊號。視訊記憶體與系統儲存器共用主存空間。這樣做有幾個好處:節約儲存器,提高空間利用率,符合嵌入式系統的設計精神;視訊記憶體設定在主存空間內,對視訊記憶體的操作,實際上就是對主存的操作,簡化程式編制。 圖1 控制器系統框圖 LCD控制器使用LCDCDMA,把視訊記憶體資料輸入LCD控制器。LCDCDMA是專用DMA,在不用CPU參與的情況下,自動傳輸視訊記憶體的視訊資料到LCD控制器。控制器中有一個24字的FIFO 儲存區。其中12個FIFOL,12個FIFOH,在單掃描模式下僅12個FIFOH可用。當FIFO為空或部分為空時,LCDCDMA請求從視訊記憶體預取資料(使用突發傳輸模式,一次預取4個字;在傳輸期間,不允許出讓匯流排控制權)。 S3C44B0的LCD 控制器使用時間抖動演算法和幀速控制方法,實現LCD上的單色、4級灰度(每個象素佔用2位)、16級灰度(每個象素佔用4位)顯示,也能與彩色STN介面,支援最大256色(每個象素佔用8位)的顯示。 LCD 控制器可以程式設計支援不同水平和垂直點數(640×480, 320×240, 160×160等等),以及不同的介面時序和重新整理速率的LCD,支援4位雙掃描、4位單掃描、8位單掃描的LCD顯示器,並支援虛擬螢幕,實現硬體水平/垂直捲動。(這些概念後邊會詳細解釋) 灰度顯示中,4級灰度顯示模式使用查詢表,允許在16級灰度中選擇4級灰度顯示。該查詢表和彩色查詢表的藍色查詢表公用一個暫存器BULEVAL[15:0],灰度0由BLUEVAL[3:0]值表示,灰度1由BLUEVAL[7:4]值表示,灰度2由BLUEVAL[11:8]值表示,灰度3由BLUEVAL[15:12]值表示。16級灰度顯示模式不使用查詢表。 彩色8位顯示模式中,3位分配為紅,3位綠,可以同時顯示8個紅色與8個綠色,2位藍色位,可以同時顯示4個藍色,合起來最大顯示256色。紅、綠、藍分別使用不同的查詢表,紅色、綠色查詢表入口都是32位(並分成8組),分別由REDVAL[31:0]、GREENVAL[31:0]暫存器指示,藍色查詢表入口為16位,由BLUEVAL[15:0] 暫存器指示,並分成4組。也就是說紅色、綠色可以在16種顏色組合中選擇8色進行顯示,藍色可以在8種顏色組合中選擇4色進行顯示。 LCD自重新整理模式:S3C44B0X支援LCD自重新整理模式,以減少電源消耗,這時電源管理可以進入SL_IDLE模式。

控制器原理

掃描

       LCD控制器的一項重要工作是向LCD驅動器,按照一定的格式輸出顯示資料,然後驅動器逐象素的顯示,由於人眼的滯留效應,看到的是連貫的影象。這個過程稱為掃描。控制器的VD[7..0]是資料輸出埠。根據不同的驅動器,分為4位雙掃描、4位單掃描和8位單掃描,位數指輸出埠的位寬,單掃描同時重新整理螢幕上的一行,雙掃描同時重新整理兩行。 圖2-1 掃描模式 圖2-2 彩色掃描模式        當然,驅動器光有資料還不能顯示,必須知道什麼時候這些資料有效,什麼時候換行,什麼時候換頁,等等。這就需要一些同步訊號。控制器提供VCLK/VLINE/VFRAME/VM訊號做同步用。在VCLK上升延,VD輸出資料;VCLK下降延,驅動器鎖存該資料;所以VCLK實際是象素的同步訊號。同理,VLINE是行的同步訊號,VFRAME是幀的同步訊號。VM是驅動器切換板電極的交流訊號。切換的速率是可以程式設計的,由MVAL暫存器控制。
VM Rate = VLINE Rate / ( 2 ×MVAL)
VCLK(Hz)=MCLK/(CLKVAL× 2)        此外需要設定LCD的解析度和顯示模式。因為這些引數和控制器的同步訊號直接相關。舉例說明:一個LCD面板是320×240的解析度,那麼控制器每輸出320個象素,就會輸出一個行同步訊號;每輸出240行之後,就應該輸出幀同步訊號;如果是4bit單行掃描,那麼每個VCLK可以輸出4個象素,則每行只會有320÷4=80個VCLK訊號。可見前面的結論換句話說,LCD的解析度和顯示模式的引數,決定了控制器的時鐘。 HOZVAL = ( Horizontal display size / Number of the valid VD data line) -1
彩色:Horizontal display size = 3 * Number of Horizontal Pixel LINEVAL = (Vertical display size) -1:單掃描
LINEVAL = (Vertical display size / 2) -1:雙掃描

查詢表

       既然控制器支援16級灰度,那麼還要4級灰度幹嗎呢?何不捨棄低階的4級灰度,都使用更高階的16級灰度呢?事實並非如此。16級灰度需要4bit來表示一個象素,而4級灰度只需要2bit就夠了。所需的位數越少,就越節省視訊記憶體空間(使用更少的儲存器),操作視訊記憶體耗費的CPU資源也越少,這樣系統功耗必然隨之減小。因為很多應用中對灰度級要求不高,最好根據需求,衡量使用什麼樣的顯示方式。        有些比較特殊的應用,雖然只使用4級灰度,但是這4級灰度並不是線性的。線性這個概念在這裡怎麼理解呢?打個比方,就好像拿著黑色顏料和白色顏料混合。如果是線性的16級灰度,第15級就是隻用黑色顏料;第0級則只有白色;第8級相當於8分黑色、7分白色均勻混合;依此類推。使用4級非線性灰度,就是從16級灰度中可程式設計的挑選出來4種。例如在某個應用中,要求象素點能夠完全熄滅、能夠達到最大亮度,以及正常顯示文字;我們可以設定4級非線性灰度,第0級相當16級線性灰度的第0級(熄滅),第3級相當16級的第15級(最亮),第1級和第2 級都相當16級的第11級(普通文字)。        查詢表就是為了適應非線性灰度而設定的一種資料結構,它其實是一組暫存器。拿前邊的例子來說,在4級非線性灰度模式下,LCD控制器讀到一個象素是第1級灰度,它就會到查詢表中,查詢第1級在16級線性灰度中的對應級別,結果是16級的第11級。完成這種轉換之後,控制器按第11級輸出。        順便說一下,在彩色模式下也有查詢表。44B0用8位表示彩色,3位紅色,也就是23=8級紅色,我們偷換概念,姑且叫“紅度”吧。但是控制器可以輸出16級“紅度”,16級“綠度”,8級“藍度”,所以再次用到查詢表。

虛擬螢幕

       我們在PC上編寫文件的時候,一螢幕顯示不下,通過滾動翻頁來瀏覽全部文件。虛擬螢幕就好像能容納整個文件的大螢幕,但顯示器只對應其中的某一部分。結合下面的圖形很容易理解。 圖3 虛擬螢幕        虛擬螢幕從原理上講是一個記憶體的概念。因為程式設計師對顯示器的操作實際上是對視訊記憶體的操作,把代表顯示器每個象素的資料寫入視訊記憶體的過程。對於虛擬螢幕,程式設計師維護著一個更大的螢幕,更多的視訊記憶體而已。事實上,虛擬螢幕的大小的確受視訊記憶體大小的限制。實際顯露出來的顯示器部分,其起始點(左上角)由程式控制,改變這個點的位置,顯示器就會在虛擬螢幕上移動。        在圖3裡,有幾個引數需要說明。PAGEWIDTH是真實顯示器的寬度;OFFSIZE是真實螢幕左端到虛擬螢幕最右端的距離;LCDBASEU是真實顯示器起點對應的視訊記憶體地址;LCDBASEL只用在雙掃描模式,是下半幀對應視訊記憶體的開始地址,當然在單掃描時他就沒有什麼用處了。 LCDBASEL =LCDBASEU + (PAGEWIDTH + OFFSIZE)×(LINEVAL +1) 程式通過改變LCDBASEU 和 LCDBASEL的值來滾動螢幕。但在一幀重新整理結束時,不能改變LCDBASEU 和 LCDBASEL的值。因為一幀結束時,LCDCDMA已經預取了下一幀的資料。如果這時改變視訊記憶體中的幀的內容,之前預取的資料將無效,從而顯示也不正確。控制器提供一個LINECNT暫存器,他會從LINEVAL向0倒計數,記錄幀已經重新整理了多少行。通過檢查LINECNT,可以避免在不恰當的時間更改視訊記憶體。檢查的時候,中斷應當被遮蔽,否則在讀出LINECNT後,如果某個中斷剛好執行,LINECNT的值可能會改變。

抖動演算法

S3C44B0X利用抖動演算法實現灰度級和STN的彩色顯示。 時常會有疑問:16級灰度,需要4bit來表示一個象素,為什麼控制器只使用了1bit輸出就實現了?256色需要8bit表示一個象素,為什麼只用3bit輸出就可以呢?下面講講抖動演算法,大家就會明白這些道理。 LCD螢幕以一個很快的(通常為80Hz)速度重新整理,因為眾所周知的人眼滯留效應,感覺上是流暢的畫面。一個幀週期內,象素只有點亮和熄滅兩種狀態(44B0使用的簡單的LCD驅動器支援兩種狀態,但是TFT等可以支援更多的狀態)。正是基於這種原理,當象素一亮一滅,且切換的頻率很低時,看到的是一閃一閃的點;如果切換頻率很高,人眼覺察不出來他在閃爍,只會感覺沒有那麼亮罷了。螢幕不斷快速重新整理,亮的次數多,熄滅的次數少,看起來就比較重;反之看起來比較淡。這種顏色的濃淡變化構成不同灰度級別。可以用“佔空比”來量化表示,就是亮的次數佔重新整理次數的比例。表1顯示出不同灰度級對應的佔空比。 表1 不同灰度級對應的佔空比        舉例說明,假設某個象素是第11級灰度,表1中查出佔空比為5/7。控制器便自動以每7幀為一個週期,其中5幀該象素亮,另外2幀熄滅。這就解釋了為什麼每個象素只用1bit輸出實現16級灰度。        前面把彩色分成“紅度”、“綠度”、“藍度”,使用和灰度輸出相同的思路,用3bit可以實現彩色輸出。        這時又出現一個新問題。極端的例子,比如1秒內,0.5秒點亮,0.5秒熄滅,雖然佔空比依然是1/2,但是很顯然看起來不會是第7級灰度(第7級灰度對應占空比為1/2),而是閃爍的畫面。所以,應該把亮滅狀態離散化,儘量不要讓同一個象素在相鄰幀保持相同狀態。 與此同時,這種現象也影響同一幀內相鄰的象素。影象的灰度級就像地圖上的等高線,相鄰象素的灰度很大機率是相同的。如果四條輸出線總是輸出相同的資料,顯示就會出現區域性閃爍的現象。解決方法依然是離散化。 考慮到上述兩個問題,就可以著手計算輸出序列。當然這是一個數學問題,要根據不同的應用不斷的優化。一般可以採用經典的序列。好在44B0的LCD控制器並沒有把抖動演算法的輸出序列固化在晶片裡,可以通過暫存器更改。