星期三, 5月 18, 2011

Embedded System - LCD Device Driver Notes

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 才會動.

沒有留言: