天天看點

LCD參數解釋及計算【轉】

 Linux核心的amba lcd控制器使用clcd_panel結構體表示一個LCD屏的硬體參數:

LCD參數解釋及計算【轉】

/* include/linux/fb.h */  

struct fb_videomode {  

const char *name; /* optional */  

u32 refresh; /* optional */  

u32 xres;  

u32 yres;  

u32 pixclock;  

u32 left_margin;  

u32 right_margin;  

u32 upper_margin;  

u32 lower_margin;  

u32 hsync_len;  

u32 vsync_len;  

u32 sync;  

u32 vmode;  

u32 flag;  

};  

/* include/linux/amba/clcd.h */  

struct clcd_panel {  

struct fb_videomode mode;  

signed short width; /* width in mm */  

signed short height; /* height in mm */  

u32 tim2;  

u32 tim3;  

u32 cntl;  

unsigned int bpp:8,  

fixedtimings:1,  

grayscale:1;  

unsigned int connector;  

LCD參數解釋及計算【轉】

fb_videomode各個參數的意義

Linux對LCD的抽象如下圖所示:

LCD參數解釋及計算【轉】

下面研究一下fb_videomode各個成員的意義:

名稱

在資料手冊中的簡稱

中文名

意義

備注

name

No

名字

液晶屏名字(可選)

refresh

重新整理頻率

重新整理頻率(核心中很多例子都指派為60)

xres

行寬

每行的像素個數

yres

螢幕高度

螢幕的行數

pixclock

像素時鐘

每個像素時鐘周期的長度,機關是皮秒(10的負12次方分之1秒)

left_margin

HBP (Horizontal Back Porch)

水準後沿

在每行或每列的象素資料開始輸出時要插入的象

素時鐘周期數

right_margin

HFP (Horizontal Front Porch )

水準前沿

在每行或每列的象素結束到LCD 行時鐘輸出脈沖

之間的象素時鐘數

upper_margin

VBP (Vertical Back Porch)

垂直後沿

在垂直同步周期之後幀開頭時的無效行數

lower_margin

VFP (Vertical Front Porch)

垂直前沿

本幀資料輸出結束到下一幀垂直同步周期開始之

前的無效行數

hsync_len

HPW (HSYNC plus width)

行同步脈寬

機關:像素時鐘周期

也有手冊簡稱為HWH(HSYNC width)

vsync_len

VPW (VSYNC width)

垂直同步脈寬

機關:顯示一行的時間th

也有手冊簡稱為VWH(VSYNC width)

sync

同步極性設定

可以根據需要設定FB_SYNC_HOR_HIGH_ACT(水準同步高電平有效)和FB_SYNC_VERT_HIGH_ACT(垂直同步高電平有效)

vmode

在核心中的大多數示例都直接置為FB_VMODE_NONINTERLACED。interlaced的意思是交錯[隔行]掃描,電視中使用2:1的交錯率, 即每幀分兩場,垂直掃描兩次,一場掃描奇數行,另一場掃描偶數行。很顯然LCD目前不是這種模式。

flag

目前沒有看到用法

說明:

(1)Linux對LCD的抽象是以圖像為中心的,而LCD手冊則以同步信号為中心,是以核心中的left_margin是指在每一行之前(前面自然對應左邊)的空閑周期數,而它對應LCD資料手冊中的水準後沿(HBP Horizontal Back Porch),是指在行同步信号之後的空閑周期。參照物不同而已,但是說的是同一個東西。

(2)水準同步信号有時也成為行同步型号,垂直同步信号有人稱為場同步信号。

(3)對于LCD的frambuffer抽象模型請參考核心中的文檔:Documention/fb/frambuffer.txt。

(4)fb_videomode各個成員的用處是我自己參照核心代碼中的include/linux/amba/clcd.h中的clcdfb_decode()函數總結的,不保證護絕對正确。

clcd_panel各個成員的意義

clcd_panel是ARM的AMBA LCD控制器專有的資料結構,定義在include/linux/amba/clcd.h中。

width和height的機關是mm,應該是指螢幕的實體尺寸。但是在drivers/video/amba-clcd.c中隻是簡單的賦給fb.var.width/height,核心中大多數例子直接賦為-1。

從include/linux/amba/clcd.h中的clcdfb_decode()函數和drivers/video/amba-clcd.c中的clcdfb_set_par()函數可以看出 tim2是時鐘和信号極性寄存器,tim3是行末控制寄存器,用來控制每行輸出結束後是否輸出一個脈沖。tim3一般不用理,使用預設值。tim2一般要根據LCD資料手冊用下面幾個宏指派:

#define TIM2_CLKSEL (1 << 5) 選擇LCD的時鐘源,0選擇片内時鐘,1選擇外部引腳接入的時鐘。一般用預設值即可

#define TIM2_IVS (1 << 11) 反轉垂直同步 信号的極性。0:高電平有效,低電平無效。1:相反

#define TIM2_IHS (1 << 12) 反轉水準同步 信号的極性。0:高電平有效,低電平無效。1:相反

#define TIM2_IPC (1 << 13) 來選擇象素資料是在顯示屏時鐘的上升沿還是下降沿被驅動到LCD 資料線。0:上升沿。1:下降沿。

#define TIM2_IOE (1 << 14) 這個位選擇輸出使能信号的有效極性。0:高電平有效,低電平無效。1:相反

#define TIM2_BCD (1 << 26) 将該位設為 1,令 PCD 的分頻無效。主要用于 TFT 顯示屏。這個位通常不設定,使用預設值0.

clcd_panel的cntl成員實際上是要寫入AMBA LCD控制器的控制寄存器,根據具體硬體使用下面的宏填充:

#define CNTL_LCDEN (1 << 0) LCD 使能控制位。0:禁止。1:使能。

#define CNTL_LCDBPP1 (0 << 1) bit[1-3]定義色深。bpp:bits per pixel,每個像素的比特數。000 = 1 bpp.

#define CNTL_LCDBPP2 (1 << 1) 001 = 2 bpp.

#define CNTL_LCDBPP4 (2 << 1) 010 = 4 bpp.

#define CNTL_LCDBPP8 (3 << 1) 011 = 8 bpp.

#define CNTL_LCDBPP16 (4 << 1) 100 = 16 bpp 

#define CNTL_LCDBPP16_565 (6 << 1) 110 = 16 bpp, 5:6:5 mode

#define CNTL_LCDBPP24 (5 << 1) 101 = 24 bpp (TFT panel only).

#define CNTL_LCDBW (1 << 4) STN LCD 單色/彩色選擇 。1:彩色,0:單色

#define CNTL_LCDTFT (1 << 5) LCD 顯示屏 TFT 類型選擇。0: STN 顯示屏,使用灰階定标器。1: TFT 顯示屏,不使用灰階定标器

#define CNTL_LCDMONO8 (1 << 6) 這個位決定單色 STN LCD 是使用 4 位并行接口還是 8 位并行接口。0:4位接口。

#define CNTL_LCDDUAL (1 << 7) STN 單 LCD 顯示屏或雙 LCD 顯示屏選擇 。0=單屏

#define CNTL_BGR (1 << 8) 色彩模式選擇,0=RGB:正常輸出,1=BGR:紅色和藍色交換位置

#define CNTL_BEBO (1 << 9) 控制記憶體中位元組的存儲順序: 0=小端位元組順序,1=大端位元組順序

#define CNTL_BEPO (1 << 10) 設定象素排序的方式,0=采用小端象素排序,1=采用大端象素排序

#define CNTL_LCDPWR (1 << 11) LCD 電源使能。1=LCD 顯示屏通電且 LCDV[23:0]信号使能

#define CNTL_LCDVCOMP(x) ((x) << 12) LCD 縱向比較中斷.00=垂直同步脈沖有效,01=垂直後沿開始,10=有效視訊圖像開始,11=垂直前沿開始

#define CNTL_LDMAFIFOTIME (1 << 15) DMA FIFO請求延時

#define CNTL_WATERMARK (1 << 16) LCD DMA FIFO 水位線.0:當 DMA FIFO 包含 4 個或 4 個以上空單元時産生一個 LCD DMA 請求 .1:8個。

一般要初始化 CNTL_LCDBPP16_565、 CNTL_LCDTFT、CNTL_BGR、CNTL_LCDVCOMP(x) 。CNTL_LCDEN和CNTL_LCDPWR會被驅動自動置位。

CNTL_LCDVCOMP(x)一般初始化為CNTL_LCDVCOMP(1).

clcd_panel的bpp成員是傳遞給frambuffer子系統的。感覺這個地方有點重複,cntl中本來就已經有了這個資訊。

bpp一般是16 或者24.

clcd_panel的其它成員沒看到具體用法。

如何從LCD資料手冊中計算參數

下面主要以16BPP的TFT屏作為例子。有的LCD會給出參數清單,比如下圖,可以很清楚的在紅框中找到需要的參數,取“type”典型值即可。但是有的LCD并沒有直接給出這樣的清單,設定某些參數沒有給出,這需要通過時序圖來确定。

LCD參數解釋及計算【轉】

下面以天馬的3.5寸TFT液晶屏 TM035KDH03為例進行講解。

參數計算:

LCD參數解釋及計算【轉】

可以看到LCD時鐘是28M,是以pixclock=1000000/28

行同步脈沖寬度是一個時鐘周期,是以,hsync_len=1

場同步脈沖的寬度是一個行周期,是以vsync_len = 1

LCD參數解釋及計算【轉】

上圖是一幀圖像的顯示時序圖。的上圖顯示,up_margin = 13-1=12,, yres= 240,

整個場周期為263,是以lower_margin= 263-13-240 = 10

同時看到,列同步信号高電平有效,行同步信号也是高電平有效。

LCD參數解釋及計算【轉】

上圖是一行的時序圖。

可以看到,left_margin = 69, xres = 320, right_margin = 408 -320 - 70 = 18

資料在上升沿有效,輸出使能是高電平有效。

總計一下上面的參數,得到如下結果:

LCD參數解釋及計算【轉】

static struct clcd_panel conn_lcd_panel = {  

.mode = {  

.name = "QVGA TM035KDH03",  

.refresh = 60,  

.xres = 240,  

.yres = 320,  

.pixclock = 35714,  

.left_margin = 69,  

.right_margin = 18,  

.upper_margin = 12,  

.lower_margin = 10,  

.hsync_len = 1,  

.vsync_len = 1,  

.sync = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,  

.vmode = FB_VMODE_NONINTERLACED,  

},  

.width = -1,  

.height = -1,  

.tim2 = 0,  

.cntl = ( CNTL_LCDTFT | CNTL_LCDVCOMP(1) | CNTL_LCDBPP16_565),  

.bpp = 16,  

【新浪微網誌】 張昺華--sky

【twitter】 @sky2030_

【facebook】 張昺華 zhangbinghua

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利.

繼續閱讀