TFT LCD系統基本上由三部分構成:TFT主控制器、LCD驅動電路和單片LCD。其中TFT控制器產生符合TFT接口格式的控制信號。但是,市面上的LCD 種類太多,而且各自的時序都不一樣,所以我們一般需要一個LCD驅動電路將TFT接口的信號轉化到符合目標LCD的特定的LCD接口信號。這就是我們所看到了LCD背后總會有一塊PCB板的原因之一。LCD驅動電路除了充當時序轉換的角色外,還負責提供LCD正常工作所需要的各種電壓,包括:
背光電壓:分為兩種,LED型(21.6V左右);CCFL型(360~500V交流) Gate電壓:一般為正負15V Commom電壓:一般為2V左右的交流電壓 Analog Vcc:一般為5V Digital Vcc:一般為3.3V Gray level reference Voltage:我最近在好幾塊屏上都發(fā)現需要這個電壓。這是一組電壓,一般有V0~V10,每個電壓的值都在0~5V之間,而且是交流電壓,要求隨行同步信號一起變化。這個我不知道怎么驅動,明白的朋友煩請告訴我一聲! 二. TFT接口時序說明 很多朋友對得S3C2410 TFT液晶接口的時序比較煩,其實解剖開來非常簡單。先來看TFT接口的信號線,我們以16bit為例,信號線共5組20根: ¢ VD[23:19]、VD[15:10]、VD[7:3]:分別對應R、G、B分色信息,一個16bit的組合代表了一個象素的信息。 ¢ VCLK:數據傳輸時鐘,在數據有效的情況下(VM),每個周期傳輸一個象素的信息。 ¢ HSYNC:行同步信號,持續(xù)若干個時鐘周期,表示新的一行傳輸即將開始。 ¢ VSYNC:幀同步信號,持續(xù)若干個行周期,表示新的一幀傳輸將開始。 ¢ VDEN:數據有效指示,該信號有效下的數據長度剛好為1行。 另外,S3C2410還提供了LEND信號表示一行結束,該信號大可不必理會。 現在我們來討論時序,有一點我們明白:那就是一個VCLK周期傳輸一組VD信號,從而給一個pixel著了色。 從 這里開始展開,以240X320的屏為例,現在要點亮一行,那么肯定要有240個VCLK周期將240個pixel的VD值輸出,而且這240個周期內 VDEN應該一直是有效的?,F在我們的思路從點擴展到了行,理想情況下,兩行之間不需要間隔,也就是說這一行結束馬上傳輸下一行的第一個pixel的 VD。但是這樣做并不好,因為一個點的偏差會造成滿盤皆輸。因此我們引入了行同步HSYNC信號,也就是說在傳輸完一行的數據后,先歇一會兒,等待若干個 時鐘(我們稱之為后插入等待周期);然后我們送一個行同步信號,當然這個信號的有效周期數我們也能控制(我們稱之為同步周期);之后呢,我們在等一會,讓 LCD驅動電路準備好接收,我們在把一行的數據發(fā)下去(這個等待時間我們稱之為前插入等待周期)。好了,有了這個說明后我們可以把行顯示的時序給出來了: (S3C2410 datasheet, Figure 15-6) 從圖中我們可以看到:HSPW+1、HBPD+1、HFPD+1就是我們分別定義了同步周期、前插入等待周期、后插入等待周期。而HOZVAL+1則是一行的有效象素數目。這些都可以在寄存器里面進行設置。 說完行與行之間的顯示,我們就可以擴展到幀與幀之間的顯示。我們很容易想到,在幀的領域里面也應該是類似于行的結構,同樣包含了同步周期、前插入等待周期、后插入等待周期,給出時序圖:S3C2410 datasheet, Figure 15-6 需要注意的是:在幀的領域里,我們所說的周期單位是一行;而在行的時候,我們所說的周期單位是VCLK時鐘周期。 經過上述的分析,我們可以把TFT LCD的接口歸納到8個參數上:HSPW、HBPD、HFPD、HOZVAL、VSPW、VBPD、VFPD、LINEVAL。另外,通過上述分析,我們 可以看到,顯示一幀圖像總共需要的VCLK周期為:(HSPW+HBPD+HFPD+HOZVAL+4)X(VSPW+VBPD+VFPD+ LINEVAL+4),VCLK是可調的,因此通過選擇適當的分頻比保證幀率在60Hz左右就可保證液晶的正常工作了。 三. 數據buffer和Scrolling實現說明 很多人可能都會問驅動LCD的數據應該放在什么地方,是怎么被搬運過去的。其實很簡單,S3C2410的LCD控制模塊自帶了DMA控制器,我們只要在SDRAM里面開一塊空間,然后設定要DMA的起始地址(LCDSADDR1寄存器)和結束地址(LCDSADDR2) 就OK了。 不 過S3C2410的寄存器提供了一種滾動的顯示模式,這個主要是靠LCDSADDR3寄存器實現的。理解起來可能有些麻煩,我們可以這樣想象:滾動顯示的 含義就好比是我們拿著一個放大鏡在大地圖上移動,而放大鏡下方的圖像就是我們應該顯示的東西。假設LCD的大小還是240X320的,我們在SDRAM 中開了一個480X640個象素的緩沖區(qū),相當于四倍圖像的大小。那么如果我們要截取一塊240X320方形畫面,就要在取完一行的數據 (PAGEWIDTH=240)以后跳過OFFSIZE(此處240)個象素(對于16bit)再取數據,得到的才是大畫面里對應的下一行數據??偠?br>之,滾動顯示是一種用空間來換取軟件效率的方法。需要注意的是,OFFSIZE和PAGEWIDTH的值必須和LCD的大小已經緩沖區(qū)的實際尺寸對應上, 不然屏幕就亂閃了;另外,LCDSADDR2指向的是整個大緩沖區(qū)之后的第一個地址。 四. 調試經過 這兩天新板子還沒有到,所以有點悶??吹嚼习迥抢镉幸粔K液晶,就拿過來先玩起來。該LCD是華恒S3C2410的配套產品,型號為sharp的LQ035Q7DB02,3.5寸,240X320,16bit TFT,帶觸摸屏。 由于接口不兼容的,所以只好把一端的插槽剪掉,一根根線直接往我的板子焊,這種臟活干多了也沒什么感覺了。弄好之后就開始跑2410test軟件了,因為原先看過TFT接 口了,知道有幾個參數是肯定要改的,也就是我前面說的。但是奇怪的是無論我怎么改,屏幕的中間總是有一條黑帶無法顯示。我嘗試著全屏顯示一種顏色 (0xf800),但是還是有好幾個區(qū)域是黑色的。這個問題一直從昨天下午開始糾纏到晚上,很郁悶。對于弄慣硬件的我來說,忍不住想看看2410 輸出的時序是不是正確的。行好板子上有FPGA,因此我就借助quarters的SignalTap抓TFT的 幾個輸出信號。不看不知道,一看嚇一跳,信號完全不對,HSYNC和VSYNC的輸出極性是反的,而且前后的插入周期也和我配置的大不相同。奇怪的是不管 我怎么改,輸出基本上都是那個樣子, HSYNC和VSYNC的輸出極性始終是反的。我開始懷疑這塊S3C2410出了問題。 一個晚 上也在郁悶中過去了,帶了一本S3C2410的Datasheet爬上床,想在睡覺前在把LCD控制模塊好好讀讀。翻了幾頁,我又看到 LPC3600這個東西,前幾次也看到過,但是不知道是什么東西,網上搜了一下網友們也大多說不明白,所以就沒深究。但是直覺告訴我,肯定和它有關。我細 細看了一下,終于明白這個家伙是干什么的了。實際上是三星在3C2410里面直接包含了一個LCD控制器,就相當于我們前面說的LCD驅動電路的時序轉換 部分,該控制器LPC3600就是面向他們自己的LCD LTS350Q1-PD1/2的。三星這么做應該說出于兩個目的:1,節(jié)省自身的系統開發(fā)成本,他們用2410做產品的時候就不用外加芯片完成時序轉換功 能了;2,推銷自己的LCD產品。但是對我們使用其它公司的LCD產品時,這個模塊顯然是沒有用的。而我在讀2410test代碼的時候,記得是將它使能 的??梢哉f,我的直覺越來越強烈,可惜要睡覺了,只能把結 果留到第二天。 今天一大早就起來了,我隱約記得這一個念頭甚至在夢里都出現了。我的想法立刻得到了驗證,圖像已經能全屏顯示了,除了頂底一兩行的不正常之外,別的都OK了,時序一抓也正常。 總結得到兩點:1,當外接其它顯示屏的時候,LPCSEL寄存器一定要清零。 2,調試不能蠻干,一時的靈感勝過一天的苦力。 接下來的事情就簡單了,我開始調整參數以確保全屏的正常顯示。要指出的是,垂直方向的問題并不一定是V類的參數出了問題,也可能是H方向上的參數沒有調整對產生的。 接下來,要在WINCE和Linux上進行LCD參數的設置,煩請wince下做過LCD驅動的朋友告訴我該如何做修改,不甚感激! |
|