LCD 驅動程式概念與實作
基本概念:
目前市面上見得到的 LCD, 在資料傳送上有兩種, 一種是 Sync(Synchronous) mode, 一種是 DE(Data Enable) mode, 有的 Panel 可用程式控制, 可以選擇使用其中一種.
在接腳上, DE Mode 通常只要 DE, Clock 與 RGB, 而 Sync Mode 則需要 VSync, HSync, Clock 與 RGB, 有些可程式控制的 Panel 則還會需要 SPI 來做控制, 僅管如此, 各面板廠做法都不同, 當然有例外, 像是有的面板 DE Mode 可能還要接 VSync, 此外 RGB 則可能有 16(565)bit, 18(666)bit 等等, 所有接法請依照該面板的 datasheet 為準.
DE Mode 比較簡單, 通常是 DE 腳 assert 時, 表示接受資料傳送, 這時 LCD Control 會從 RGB 資料線傳送資料給 LCD Panel, 現在大部份 Panel 大都採用此種模式.
Sync Mode 大致上來說, 則是在 VSync assert 然後 back porch n 個 clock 後, 接著 HSync assert 然後 back porch n 個 clock 後, 開始傳送這條水平線的資料, 到下一條水平線時再 front porch + HSync assert + back porch 一次, 一直到整張傳完, 準備傳下一張時, 再次 front porch + assert VSync + back porch, 當然這邊只是說個大概的工作原理, 一切基準都要看該面板 datasheet 為準.
所以由此可知, 垂直掃描頻率基本上就等於整張的掃描頻率, 也因此, 螢幕掃描頻率通常都是以垂直掃描為準就是這個道理.
Note: assert = 表示該接腳信號為有效, 一切以 datasheet 為準, 例如是 low active 時, 接腳為 low 電位就是 assert, 反之則是 high 為 assert.
LCD Panel Timing:
以 Data Image 的七吋面板 FG0700 為例, 這面板的解析度為 800x480, 但是加上無效區為 900x500, 我們知道 dot clock 的公式是:
dot clock = horizontal pixels * vertical pixels * frame rate
注意這邊所謂的 horizontal 與 vertical pixels 都包含 active pixels 與 blink pixels, 因此這張 panel 的 dot clock 為:
900 * 500 * 60 = 27 MHz
picoseconds of per pixel 的公式是 :
1e12 / dot clock
所以每個 pixel 的 ps (picoseconds, pico = e-12):
1 / 27e6 Hz = 37037e-12
水平掃描(horizontal scan-line)一條所需時間的公式是:
horizontal scan-line = horizontal pixels * picoseconds of per pixel
所以每條水平掃描的所需時間為:
900 * 37.037e-9 = 33.333e-6
所以我們知道水平掃描頻率(scan rate)為:
1 / 33.333e-6 = 30 KHz
而整個面板掃完一次需要的時間公式為:
vertical scan-line = vertical pixels * picoseconds of per pixel
500 * 33.333e-6 = 16.6665e-3
由此可以得知垂直掃描頻率為:
1 / 16.6665e-3 = 60 Hz
這意思就是這個面板一秒會更新 60 次.
實作:
參考 Datasheet 可以知道, 在 HSync 之前的叫做 HFP (Horizontal front porch), 在 HSync 之後的叫做 HBP (Horizontal back porch).
但是在 PXA3xx LCD Controller Register 裡叫做 BLW, ELW, 而在 Linux Frame Buffer Driver 裡的 struct 則叫做 left margin, right margin, 這要怎樣對應呢?
這也非常簡單, 參考 Documentatoin/fb/framebuffer.txt 與 PXA3xx Datasheet :
- left_margin: time from sync to picture
- right_margin: time from picture to sync
- upper_margin: time from sync to picture
- lower_margin: time from picture to sync
BLW + 1 = HBP
ELW + 1 = HFP
BFW = VBP
EFW = VFP
因此:
left_margin = HBP = BLW - 1
right_margin = HFP = ELW - 1
upper_margin = VBP = BFW
lower_margin = VFP = EFW
然後參考 datasheet 把正確的值填到 struct 裡, 開機 fb driver 正確啟動後, 應該可以在 LCD 看到一隻企鵝, 至於 WinCE 的改法也很簡單, 以 PXA3xx WinCE BSP 為例, 可以在 display driver 的 panel 目錄裡找到相對應硬體的結構, 改一改就好了, 比較麻煩的是一些可程式的 LCD, 這類 LCD 通常就要再送 SPI command 才會動.
沒有留言:
張貼留言