LCD參數解釋及計算【轉】


 

轉自:http://blog.csdn.net/longxiaowu/article/details/24319933

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

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. /* include/linux/fb.h */  
  2. struct fb_videomode {  
  3. const char *name; /* optional */  
  4. u32 refresh; /* optional */  
  5. u32 xres;  
  6. u32 yres;  
  7. u32 pixclock;  
  8. u32 left_margin;  
  9. u32 right_margin;  
  10. u32 upper_margin;  
  11. u32 lower_margin;  
  12. u32 hsync_len;  
  13. u32 vsync_len;  
  14. u32 sync;  
  15. u32 vmode;  
  16. u32 flag;  
  17. };  
  18. /* include/linux/amba/clcd.h */  
  19. struct clcd_panel {  
  20. struct fb_videomode mode;  
  21. signed short width; /* width in mm */  
  22. signed short height; /* height in mm */  
  23. u32 tim2;  
  24. u32 tim3;  
  25. u32 cntl;  
  26. unsigned int bpp:8,  
  27. fixedtimings:1,  
  28. grayscale:1;  
  29. unsigned int connector;  
  30. };  

 

 
fb_videomode各個參數的意義
 
Linux對LCD的抽象如下圖所示:
下面研究一下fb_videomode各個成員的意義:

名稱 在數據手冊中的簡稱 中文名 意義 備注
name No 名字 液晶屏名字(可選) No
refresh No 刷新頻率 刷新頻率(內核中很多例子都賦值為60) No
xres No 行寬 每行的像素個數 No
yres No 屏幕高度 屏幕的行數 No
pixclock No 像素時鍾 每個像素時鍾周期的長度,單位是皮秒(10的負12次方分之1秒) No
left_margin HBP (Horizontal Back Porch) 水平后沿 在每行或每列的象素數據開始輸出時要插入的象
素時鍾周期數
No
right_margin HFP (Horizontal Front Porch ) 水平前沿 在每行或每列的象素結束到LCD 行時鍾輸出脈沖
之間的象素時鍾數
No
upper_margin VBP (Vertical Back Porch) 垂直后沿 在垂直同步周期之后幀開頭時的無效行數 No
lower_margin VFP (Vertical Front Porch) 垂直前沿 本幀數據輸出結束到下一幀垂直同步周期開始之
前的無效行數
No
hsync_len HPW (HSYNC plus width) 行同步脈寬 單位:像素時鍾周期 也有手冊簡稱為HWH(HSYNC width)
vsync_len VPW (VSYNC width) 垂直同步脈寬 單位:顯示一行的時間th 也有手冊簡稱為VWH(VSYNC width)
sync No 同步極性設置 可以根據需要設置FB_SYNC_HOR_HIGH_ACT(水平同步高電平有效)和FB_SYNC_VERT_HIGH_ACT(垂直同步高電平有效) No
vmode No No 在內核中的大多數示例都直接置為FB_VMODE_NONINTERLACED。interlaced的意思是交錯[隔行]掃描,電視中使用2:1的交錯率, 即每幀分兩場,垂直掃描兩次,一場掃描奇數行,另一場掃描偶數行。很顯然LCD目前不是這種模式。 No
flag No No 目前沒有看到用法 No
說明:
(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中。
ARM的AMBA LCD控制器數據手冊在這里: http://infocenter.arm.com/help/topic/com.arm.doc.ddi0121d/DDI0121.pdf
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並沒有直接給出這樣的列表,設置某些參數沒有給出,這需要通過時序圖來確定。
下面以天馬的3.5寸TFT液晶屏 TM035KDH03為例進行講解。
參數計算:
可以看到LCD時鍾是28M,所以pixclock=1000000/28
行同步脈沖寬度是一個時鍾周期,所以,hsync_len=1
場同步脈沖的寬度是一個行周期,所以vsync_len = 1
上圖是一幀圖像的顯示時序圖。的上圖顯示,up_margin = 13-1=12,, yres= 240,
整個場周期為263,所以lower_margin= 263-13-240 = 10
同時看到,列同步信號高電平有效,行同步信號也是高電平有效。
上圖是一行的時序圖。
可以看到,left_margin = 69, xres = 320, right_margin = 408 -320 - 70 = 18
數據在上升沿有效,輸出使能是高電平有效。
 
總計一下上面的參數,得到如下結果:
[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. static struct clcd_panel conn_lcd_panel = {  
  2. .mode = {  
  3. .name = "QVGA TM035KDH03",  
  4. .refresh = 60,  
  5. .xres = 240,  
  6. .yres = 320,  
  7. .pixclock = 35714,  
  8. .left_margin = 69,  
  9. .right_margin = 18,  
  10. .upper_margin = 12,  
  11. .lower_margin = 10,  
  12. .hsync_len = 1,  
  13. .vsync_len = 1,  
  14. .sync = FB_SYNC_HOR_HIGH_ACT|FB_SYNC_VERT_HIGH_ACT,  
  15. .vmode = FB_VMODE_NONINTERLACED,  
  16. },  
  17. .width = -1,  
  18. .height = -1,  
  19. .tim2 = 0,  
  20. .cntl = ( CNTL_LCDTFT | CNTL_LCDVCOMP(1) | CNTL_LCDBPP16_565),  
  21. .bpp = 16,  
  22. };  
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM