http://hi.baidu.com/lucky900apple/blog/item/da21ee0dee01a52a6b60fbd7.html
1 LCD控制器
LCD控制器的功能是産生顯示驅動信号,驅動LCD顯示器,不同的控制器可以支援無源陣列顯示屏(STN)和有源陣列顯示屏(TFT)的顯示,包括單色和彩色,單向重新整理模式和雙向重新整理模式等不同顯示的需求。使用者隻需要讀寫一系列的寄存器,完成配置和顯示控制。
1.1 概述
由處理器産生的顯示資料先被存放在外部存儲器的幀緩沖中,這些資料由LCD DMA控制器按順序加載到一個先入先出(FIFO)的緩沖隊列中。當采用單向重新整理模式時,隻有一個DMA通道在工作,同時對應一個FIFO緩沖隊列。當采用雙向重新整理模式,兩個DMA通道都會工作,同時對應兩個FIFO緩沖隊列。
幀緩沖中的資料稱為幀緩沖資料,它們對應螢幕上一個個像素點的色彩值。幀緩沖資料可以是壓縮編碼後的色彩值,也可以是原始的色彩值,這要取決與LCD控制器標明的顯示模式。在彩色模式中,原始的色彩值是16位的RGB色彩值,其中Red 5位、Green 6位、Blue 5位(因為人眼對綠色比較敏感,是以Green多占用了1位),一個16位的資料描述了螢幕上一個像素點的色彩。壓縮編碼的色彩值可以用比較少的位描述一定的色彩值,減少了每像素點的色彩資料量可以相應地提高顯示的重新整理速率,減少資料的傳輸量。但是壓縮編碼的色彩值需要由色彩描述闆(Palette)解釋後才能描述像素點真正的色彩值。
1.色彩描述闆
當使用原始色彩值,即16位描述一個像素點時不使用色彩描述闆。單色色彩描述闆是一個256入口的8位寬的資料結構,相當于UInt8 palette[256],可以表示256級灰階。彩色色彩描述闆是一個256入口的16位寬的資料結構,相當于UInt16 palette[256],可以表示256色的僞彩。壓縮編碼後的每像素色彩描述位數決定了可描述色彩的數量:每像素1位可以通路色彩描述闆中2種色彩,每像素2位可以通路色彩描述闆中4種色彩,每像素4位可以通路色彩描述闆中16種色彩,每像素8位可以通路色彩描述闆中256種色彩。
2.重新整理模式
STN顯示屏采用的是被動(Passive)重新整理模式,有時為了提高LCD色彩的表現,可以通過使每屏圖像的像素重新整理多次,使用時間混合色度的方法。這個方法叫做暫時調節能量配置設定算法(TMED),也被稱為瞬時抖動。
TFT顯示屏采用的是主動(Active)重新整理模式,不采用瞬時抖動的方法。
不同的顯示模式最終使用的LCD資料輸出引腳數也是不同的,而且雙向重新整理模式所使用的資料引腳數一定是對應單向重新整理模式的一倍,這是因為雙向重新整理模式是同時重新整理螢幕的上半部分和下半部分。
3.控制時鐘
(1)像素時鐘(Pixel Clock)
對應片上引腳L_PCLK,LCD顯示器用來控制顯示資料進入行顯示位移寄存器(Line Shift Register)的控制時鐘信号。一個時鐘周期重新整理螢幕上幾個像素點,頻率越高,行分辨率越高。在被動重新整理模式中隻有當有效的顯示資料到來了時鐘才開始翻轉。在主動重新整理模式中時鐘是連續翻轉的,資料的有效信是靠AC Bias信号來判斷的。
(2)行時鐘(Line Clock)
對應片上引腳L_LCLK,LCD顯示器用來表示螢幕上一行像素重新整理完畢的時鐘信号。當行時鐘信号生時就表示顯示器要開始重新整理下一行的像素,控制器會把存放在行顯示位移寄存器中下一行的顯示資料轉移到顯示屏,并且将行位置計數器加1。在主動重新整理模式中,行時鐘信号也稱為水準同步信号。
(3)幀時鐘(Frame Clock)
對應片上引腳L_FCLK,LCD顯示器用來表示整個螢幕重新整理完畢,又有新的幀等待顯示時産生的時鐘信号。當信号到來時顯示器将行位置計數器重置到螢幕的第一行(最靠近螢幕頂端)。在主動重新整理模式中,幀時鐘信号也稱為垂直同步信号。
4.特性
LCD控制器擁有以下幾點特性。
n 顯示模式:
Ø 支援單向重新整理或雙向重新整理;
Ø 在被動單色模式中最多可以顯示256級灰階(8位壓縮編碼);
Ø 在主動彩色模式中最多可以顯示65536種色彩(16位瞬時抖動);
Ø 在主動彩色模式中最多可以顯示65536種色彩(16位不采用瞬時抖動);
Ø 支援被動256色僞彩單向重新整理模式;
Ø 支援被動256色僞彩雙向重新整理模式。
n 最大分辨率可達1024×1024像素,建議最大分辨率640×480像素;
n 支援外部RAM彩色色彩描述闆,256入口16位寬資料(能夠在每幀開始時自動加載);
n 壓縮編碼像素支援1位、2位、4位和8位;
n 可程式設計的像素時鐘,頻率範圍195kHz~83MHz(100MHz/512至166MHz/2);
n 具有雙DMA通道(一個通道用來傳輸色彩描述闆和單向重新整理的資料,另一個通道用來在雙向重新整理模式中傳輸下半螢幕重新整理的資料)。
1.2 LCD控制器寄存器
LCD控制器有4個控制寄存器,10個DMA寄存器,1個狀态寄存器,還有1個RAM色彩描述闆。所有的寄存器都必須由32位的位址來通路,并且不應該嘗試對未定義的寄存器位址空間進行讀寫的操作,這會産生不可預料的錯誤。
1.控制寄存器
設定這些寄存器的對應位可以有以下功能:
n 啟動和停止LCD控制器;
n 設定LCD螢幕的高度和寬度;
n 指定使用單向還是雙向的螢幕重新整理方式;
n 指定使用彩色還是灰階或純黑白顯示方式;
n 設定控制引腳的電平有效值;
n 設定幀時鐘、行時鐘、像素時鐘和AC Bias引腳信号的頻率;
n 設定在螢幕顯示資料(行資料、幀資料)前後插入的空資料量(協調螢幕尺寸最小資料傳輸量);
n 可以啟用多種中斷屏蔽。
(1)零号控制寄存器(LCCR0)
LCCR0的使能位(ENB)被置1時,LCD控制器啟動。在控制器啟動後其他的控制位就不能做任何的更改了,這點在程式設計時要特别注意,并且LCD控制器的停止也是依靠控制寄存器來控制的。
n LCD輸出隊列下溢中斷屏蔽控制位(OUM)
OUM=0時,下溢中斷被啟用,這時當LCSR中的OU狀态位被置1時,一個下溢中斷請求産生,中斷控制器響應,完成相應的出錯處理。OUM=1時,下溢中斷被屏蔽。
n 快速關閉中斷屏蔽控制位(QDM)
QDM=0時快速停止中斷被啟用,這時當LCSR中的QD狀态位被置1時,一個LCD快速關閉中斷請求産生,中斷控制器響應請求。QDM=1時被屏蔽。快速關閉一般用于休眠模式。
n LCD關閉控制位(DIS)
DIS=1時,LCD控制器在讀取完目前幀的資料後會停止從緩存中讀取新的幀資料,在目前幀顯示完成後,關閉LCD控制器。
n 主動/被動顯示模式選擇位(PAS)
這一位是用來控制顯示模式,主動還是被動顯示模式。PAS=0時,被動模式被選中。PAS=1時,主動模式被選中。
n 單向/雙向重新整理模式選擇位(SDS)
SDS=0時表示單向重新整理,SDS=1時表示雙向重新整理。在主動模式下SDS一定為0。
Table7-2考慮加入
n 彩色/單色模式選擇位(CMS)
CMS=0時,選中了彩色模式,相應的色彩描述闆的的色彩資料是16位寬。CMS=1時,選中了單色模式,相應的色彩描述闆的色彩資料是8位寬(最多256級灰階)。
n LCD啟動控制位(ENB)
ENB=0時,所有的LCD引腳都被作為通用IO口使用;ENB=1時,LCD控制器啟用。
(2)一号控制寄存器(LCCR1)
這個寄存器中的4個域的值是用來控制LCD行顯示相關時鐘信号的時序,它們分别是對應計數器的預設計數值。
n 行前置空像素時鐘節拍數(BLW)
表示在開始顯示一行像素前所需要等待的空像素時鐘節拍數。BLW可以産生的1~256個像素時鐘的等待周期,對應BLW值0~255。
n 行後置空像素時鐘節拍數(ELW)
和BLW類似,是在一行像素顯示結束後需要等待的空像素時鐘節拍數。
n 水準同步信号脈沖寬度(HSW)
HSW的值指定了在主動或被動模式下行時鐘信号的脈沖寬度。每次行時鐘信号有效時,HSW的值被賦給一個6位的計數器,每一個像素時鐘到來時計數器減1,當計數器為0時行時鐘信号失效。HSW值的範圍是0~63,可以表示1~64之間的脈沖寬度。
n 行像素數(PPL)
PPL可以描述0~1023範圍的值,它指定了螢幕中一行上像素點的數量(1~1024個像素)。建議最大不要超過640個像素。在不同的像素描述模式下PPL的值也有不同的要求:每像素1位描述時PPL+1必須是32的倍數,每像素2位描述時PPL+1必須是16的倍數,每像素4位描述時PPL+1必須是8的倍數,每像素8位描述時PPL+1必須是4的倍數,每像素16位描述時PPL+1必須是2的倍數。當PPL與實際螢幕的行像素值不能對應時,空像素就會被引入,BLW或ELW就會被使用。
(3)二号控制寄存器(LCCR2)
和LCCR1類似,這個寄存器中的4個域的值是用來控制LCD上幀顯示相關時鐘信号的時序的。
(4)幀前置空行時鐘節拍數(BFW)
隻在主動顯示模式下使用,表示在開始顯示新的一幀前所需要等待的空行時鐘節拍數。BLW可以産生的0~255個行時鐘的等待周期,BLW=0時不等待。
(5)幀後置空行時鐘節拍數(EFW)
隻在主動顯示模式下使用,和BFW類似,是在一幀像素顯示結束後需要等待的空行時鐘節拍數。
(6)垂直同步信号脈沖寬度(VSW)
VSW的值指定了在主動或被動模式下幀時鐘信号的脈沖寬度。主動模式下,每次幀時鐘信号有效時,VSW的值被賦給一個6位的計數器,每一個行時鐘到來時計數器減1,當計數器為0時,行時幀信号失效。被動模式下,VSW則用來提供額外的空行時鐘,目前一幀顯示結束,VSW的值被賦給一個6位的計數器,用來計數空時鐘信号,當計數器為0時,下一幀才開始(BFW、EFW還是存在)。VSW值的範圍是0~63,可以表示1~64之間的脈沖寬度或額外空時鐘數。
(7)螢幕行數(LPP)
LPP可以描述0~1023範圍的值,它指定了螢幕中行的數量(1~1024行)。
(8)每像素位描述數(BPP)
描述了一個像素色彩值在記憶體中所占的位數。在每像素1、2、4、8位的壓縮編碼模式在,這些像素在被顯示前,它們的色彩描述闆必須被加載,以得到真正的色彩值。BPP=0b000時,每像素1位描述。BPP=0b001時,每像素2位描述。BPP=0b010時,每像素4位描述。BPP=0b011時,每像素8位描述。BPP=0b100時,每像素16位描述。其他保留用于将來擴充。
(9)像素時鐘邊沿有效性選擇(PCP)
PCP=0時,在L_PCLK上升沿有效,采樣LCD資料引腳的資料。PCP=1時,在L_PCLK下降沿有效,采樣LCDLCD資料引腳的資料。
(10)水準同步信号電平有效性選擇(HSP)
HSP=0時,L_LCLK高電平有效,HSP=1時,L_LCLK低電平有效。在被動模式下水準同步信号就是行時鐘信号。
(11)垂直同步信号電平有效性選擇(VSP)
VSP=0時,L_FCLK高電平有效,VSP=1時,L_FCLK低電平有效。
(12)像素時鐘分頻選擇(PCD)
PCD的值在0~255之間,代表1~256的分頻參數(分頻時要乘以2)。最後得到的像素時鐘的頻率在LCLK/2到LCLK/512之間。LCLK頻率等于LCD記憶體控制器的時鐘頻率,一般在100MHz~166MHz之間。
2.狀态寄存器(LCSR)
狀态寄存器的狀态位可以标示:
n FIFO緩沖隊列的上溢與下溢錯誤;
n DMA總線錯誤;
n DMA控制器何時開始和結束一個幀資料的傳輸;
n LCD關閉前最後一個幀顯示在何時結束。
(1)幀結束狀态位(EOF)
當DMA控制器從存儲器中取得一幀的顯示資料,并且資料中的幀描述符中包含表示幀結束的标示位,那麼EOF=1,如果LCCR0中的EFM屏蔽位沒有被設定,那麼将産生一個EOF中斷請求。
(2)LCD快速關閉狀态位(QD)
當QD=1,QDM=0時,會産生一個快速關閉的中斷,這個中斷會強制停止LCD控制器,并且馬上停止LCD的引腳的驅動。快速關閉可用于LCD休眠模式。
(3)輸出FIFO下溢狀态位(OU)
如果輸出FIFO為空,LCD的資料引腳還繼續嘗試從FIFO中擷取顯示資料時,OU=1。若OUM=0時,這将産生一個輸出FIFO下溢中斷。
(4)上螢幕輸入FIFO下溢狀态位(IUU)
如果上螢幕的輸入FIFO為空,LCD控制器的像素解碼器還繼續嘗試從FIFO中擷取壓縮編碼的資料時,IUU=1。若IUM=0時,這将産生一個輸入FIFO下溢中斷。
(5)下螢幕輸入FIFO下溢狀态位(IUL)
當選中了雙向重新整理模式時才使用(SDS=1),如果下螢幕的輸入FIFO為空,LCD控制器的像素解碼器還繼續嘗試從FIFO中擷取壓縮編碼的資料時,IUL=1。若IUM=0時,這将産生一個輸入FIFO下溢中斷。
(6)總線錯誤狀态位(BER)
當DMA傳輸控制器發生了一個系統總線的錯誤時,BER=1。例如,當DMA控制器試圖通路保留的或不存在的存儲空間。錯誤發生後,DMA控制器會停止工作,直到有效的位址空間被加載到FDADRx寄存器。
(7)幀開始狀态位(SOF)
當DMA控制器擷取到新的幀描述符,并且它包含表示幀開始的标示位,那麼SOF=1,如果LCCR0中的SFM屏蔽位沒有被設定,那麼将産生一個SOF中斷請求。
(8)LCD關閉完成狀态位(LDD)
當DIS=1,LCD控制器讀取完目前幀的所有資料時,在目前幀的最後一個像素資料被發送到LCD資料引腳後,LCD控制器被關閉,LDD被置1。若LDM=0,還将産生一個關閉完成中斷請求。這個狀态位是由硬體設定的,但它的清除工作是由軟體來完成的。
(9)其他寄存器
除了以上介紹幾個主要寄存器外還有一些将會用到的寄存器。例如,LCD DMA指令寄存器(LDCMDx),LCD控制器中斷ID寄存器(LIIDR),瞬時抖動RGB色彩偏移寄存器(TRGBR),瞬時抖動控制寄存器(TCR)等。
1.3 LCD控制器的操作
1.幀緩存與總線帶寬
存放一個顯示幀資料所須的緩存大小可以用以下公式來計算:
FrameBufferSize=(BitPerPixel´Lines´(Pixels + n))/8 (機關是byte)
其中BitPerPixel表示描述一個像素所需要多少個bit位,例如256級灰階的BitPerPixel=8,64K彩色的BitPerPixel=16。Lines等于顯示螢幕的行數。Pixels是顯示螢幕中一行上的像素點的個數,n是插入的空像素點的個數(為了顯示的控制)。
在雙向重新整理模式中,兩個DMA管道的幀緩沖大小是一樣的,是以在計算這個模式下一個管道中的幀緩沖時,Lines是螢幕大小的一半。
為了滿足顯示資料的傳輸,LCD控制器的資料傳輸總線帶寬可以用以下公式計算得到:
n 單向
BusBandwidth=(FrameBufferSize+PaletteSize)´RefreshRate
n 雙向
BusBandwidth=(FrameBufferSize*2+PaletteSize)´RefreshRate
其中PaletteSize是色彩描述闆的大小,單色色彩描述闆的大小是256´8bit=256byte,彩色色彩描述闆是256´16=512byte。RefreshRate是螢幕的重新整理率。
在雙向模式中,負責上半螢幕的DMA管道負責傳輸Palette和上半螢幕的顯示資料,而負責下半螢幕的DMA管道隻下半螢幕的顯示資料,是以雙向模式的公式中PaleteSize沒有乘以2。
2.被動模式的時序
初動模式的時序如圖4-1至圖4-3所示。
ENB – LCD使能信号 | HSP – 水準同步極性設定 |
0 – LCD禁止 | 0 – 行時鐘高有效,低無效 |
1 – LCD使能 | 1 – 行時鐘低有效,高無效 |
VSP – 垂直同步極性設定 | PCP – 像素時鐘極性設定 |
0 – 幀時鐘高有效,低無效 | 0 – 在時鐘的上升沿采樣像素資料 |
1 – 幀時鐘低有效,高無效 | 1 – 在時鐘的下降沿采樣像素資料 |
當PCP=0時,L_PCLK的波形是反向的,但時序是相同的。 | |
VSW = 垂直同步信号脈沖寬度 – 1 | |
HSW = 水準同步信号(行時鐘)脈沖寬度 – 1 | |
BLW = 開始行像素時鐘等待個數 – 1 | |
ELW = 結束行像素時鐘等待個數 – 1 |
圖4-1 被動模式幀啟動時序
ENB – LCD使能信号 | HSP – 水準同步極性設定 |
0 – LCD禁止 | 0 – 行時鐘高有效,低無效 |
1 – LCD使能 | 1 – 行時鐘低有效,高無效 |
VSP – 垂直同步極性設定 | PCP – 像素時鐘極性設定 |
0 – 幀時鐘高有效,低無效 | 0 – 在時鐘的上升沿采樣像素資料 |
1 – 幀時鐘低有效,高無效 | 1 – 在時鐘的下降沿采樣像素資料 |
當PCP=0時,L_PCLK的波形是反向的,但時序是相同的。 | |
VSW = 垂直同步信号脈沖寬度 – 1 | |
HSW = 水準同步信号(行時鐘)脈沖寬度 – 1 | |
BLW = 開始行像素時鐘等待個數 – 1 | |
ELW = 結束行像素時鐘等待個數 – 1 | |
PPL = 每行像素 – 1 | |
LPP = 每螢幕行數 – 1 |
圖4-2 被動模式幀結束時序
PCP – 像素時鐘極性設定 |
0 – 在時鐘的上升沿采樣像素資料 |
1 – 在時鐘的下降沿采樣像素資料 |
當PCP=0時,L_PCLK的波形是反向的,但時序是相同的。 |
圖4-3 被動模式像素時鐘和資料引腳時序
3.主動模式的時序
主動模式的時序如圖4-4與圖4-5所示。
4.LCD啟動
将對應的通用I/O引腳配置給LCD控制器,設定了正确的色彩描述闆、幀描述符的記憶體位址和LCCR0以外的一些必要寄存器的設定後,置位LCCR0的ENB控制位後LCD控制器就會啟動了。
ENB – LCD使能信号 | HSP – 水準同步極性設定 |
0 – LCD禁止 | 0 – 行時鐘高有效,低無效 |
1 – LCD使能 | 1 – 行時鐘低有效,高無效 |
VSP – 垂直同步極性設定 | PCP – 像素時鐘極性設定 |
0 – 幀時鐘高有效,低無效 | 0 – 在時鐘的上升沿采樣像素資料 |
1 – 幀時鐘低有效,高無效 | 1 – 在時鐘的下降沿采樣像素資料 |
當PCP=0時,L_PCLK的波形是反向的,但時序是相同的。 | |
VSW = 垂直同步信号脈沖寬度 – 1 | |
HSW = 水準同步信号(行時鐘)脈沖寬度 – 1 | |
BFW = 開始幀水準同步時鐘等待個數 | |
BLW = 開始行像素時鐘等待個數 – 1 | |
ELW = 結束行像素時鐘等待個數 – 1 | |
PPL = 每行像素 – 1 |
圖4-4 主動模式的時序
PCP – 像素時鐘極性設定 |
0 – 在時鐘的上升沿采樣像素資料 |
1 – 在時鐘的下降沿采樣像素資料 |
當PCP=0時,L_PCLK的波形是反向的,但時序是相同的。 |
圖4-5 主動模式像數時鐘和資料引腳時序
僞代碼如下:
#define LCCR0_ADDRESS 0x44000000 // LCCR0的位址
#define LCCR0 ( * ( (volatile unsigned int * ) LCCR0_ADDRESS ) )
#define LCD_ENB 0x00000001 // ENB在LCCR0中的位置
LCCR0 = LCCR0 | LCD_ENB; // 置位ENB
5.LCD停止
(1)正常停止
一般建議使用這個方式停止LCD控制器。這個操作是由設定LCCR0的DIS控制位來完成的。并且在LCD控制器加載了最後要顯示的幀資料後,LCSR的LDD狀态位會被硬體自動置位,同時LCCR0中的ENB位也會被硬體清零。
僞代碼如下:
#define LCCR0_ADDRESS 0x44000000 // LCCR0的位址
#define LCCR0 ( * ( (volatile unsigned int * ) LCCR0_ADDRESS ) )
#define LCSR_ADDRESS 0x44000038 //LCSR的位址
#define LCSR ( * ( (volatile unsigned int * ) LCSR_ADDRESS ) )
#define LCD_DIS 0x00000400 //DIS在LCCR0中的位置
#define LCD_LDD 0x00000001 //LDD在LCSR中的位置
LCCR0 = LCCR0 | LCD_DIS; //LCCR0中的LCD_DIS位置位
while(!(LCSR & LCD_LDD)); //等待硬體置位LDD
LCSR = LCSR & (~LCD_LDD); //軟體清除LCD_LDD位,以便下次使用
(2)快速停止
直接清除LCCR0的ENB控制位可以實作快速停止的操作。清除了ENB位後LCSR的QD狀态位會被置位,産生一個中斷,中斷響應後LCD控制器會馬上停止加載了一切的幀資料,停止LCD控制器對LCD引腳的驅動。在電池電量不足時,CPU為了儲存重要的資料,快速停止模式被采用。
僞代碼如下:
#define LCCR0_ADDRESS 0x44000000 // LCCR0的位址
#define LCCR0 ( * ( (volatile unsigned int * ) LCCR0_ADDRESS ) )
#define LCD_ENB 0x00000001 // ENB在LCCR0中的位置
LCCR0 = LCCR0 & (~LCD_ENB); //清除ENB位