您的位置:首页 > 其它

LCD 驱动中参数说明

2015-04-18 14:11 197 查看
http://blog.csdn.net/zy_11162311/article/details/7052899 感谢原作者

1.kernel版本:linux-2.6.34

开发板:PW2440

CPU:S3C3440

LCD:3.5 寸TFT(320×240),Model Name LQ035NC111

2.LCD的参数设定是需要根据LCD的手册来设定arch/arm/mach-s3c2440/mach-smdk2440.c里面的s3c2410fb_display smdk2440_lcd_cfg结构体

3.例如从LQ035NC111的手册可以得到如下一个表

该表描述了该款并行LCD的所有时钟需求,在这里我参照的全是典型值“Typ”栏

4.一个很具有参考价值的文档文件是Documentation/fb/framebuffer.txt文件,里面给我们描述了一个架构

+----------+---------------------------------------------+----------+-------+

| | ↑ | | |

| | |upper_margin | | |

| | ↓ | | |

+----------###############################################----------+-------+

| # ↑ # | |

| # | # | |

| # | # | |

| # | # | |

| left # | # right | hsync |

| margin # | xres # margin | len |

|<-------->#<---------------+--------------------------->#<-------->|<----->|

| # | # | |

| # | # | |

| # | # | |

| # |yres # | |

| # | # | |

| # | # | |

| # | # | |

| # | # | |

| # | # | |

| # | # | |

| # | # | |

| # | # | |

| # ↓ # | |

+----------###############################################----------+-------+

| | ↑ | | |

| | |lower_margin | | |

| | ↓ | | |

+----------+---------------------------------------------+----------+-------+

| | ↑ | | |

| | |vsync_len | | |

| | ↓ | | |

+----------+---------------------------------------------+----------+-------+

还有一个很有用的公式 Pixelclock:

xfree: in MHz

fb: in picoseconds (ps)

pixclock = 1000000 / DCF

5.再结合结构体 static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {

.lcdcon5 = S3C2410_LCDCON5_FRM565 |

S3C2410_LCDCON5_INVVLINE |

S3C2410_LCDCON5_INVVFRAME |

S3C2410_LCDCON5_PWREN |

S3C2410_LCDCON5_HWSWP,

.type = S3C2410_LCDCON1_TFT,

.width = LCD_WIDTH,

.height = LCD_HEIGHT,

.pixclock = LCD_PIXCLOCK,

.xres = LCD_WIDTH,

.yres = LCD_HEIGHT,

.bpp = 16,

.left_margin = LCD_LEFT_MARGIN,

.right_margin = LCD_RIGHT_MARGIN,

.hsync_len = LCD_HSYNC_LEN,

.upper_margin = LCD_UPPER_MARGIN ,

.lower_margin = LCD_LOWER_MARGIN,

.vsync_len = LCD_VSYNC_LEN,

};

6.pixclock:现在我们就可以开始设置这个结构体的参数了,有上面第3小结的表我们可以知道LCD的时钟Dclk应该是156ns,这个对应结构体里面的像素点时钟pixclock,在来看看第四节提到的一个公式 pixclock=1000000/DCF,这个DCF就是LCD的Dclk对应的频率,注意,单位为MHz,所以DCF=1000 000 000/156 Hz=1000/156 MHz;可以得到pixclock=1000000/(1000/156)=156000;

7.width、height的设定这个就没什么歧义了,对应320和240

8.bpp:其实我的这个LCD手册上说该屏是支持24位色的,但是这里填写16位,有空可以试试24位

9.其他的参数:其他参数对应第3节的表填写 xres <===========> TEP

yres <===========> Tvd

left_margin <===========> Thf

right_margin <===========> Thb

hsync_len <===========> THS

upper_margin <===========> Tvf

lower_margin <===========> Tvb

vsync_len <===========> Tvs



所以我的配置如下 #define LCD_WIDTH 320

#define LCD_HEIGHT 240

#define LCD_PIXCLOCK 156000

#define LCD_RIGHT_MARGIN 38

#define LCD_LEFT_MARGIN 20

#define LCD_HSYNC_LEN 30

#define LCD_UPPER_MARGIN 4

#define LCD_LOWER_MARGIN 15

#define LCD_VSYNC_LEN 3





以下来自:http://about.chinaunix.com/space.php?uid=20780196&do=blog&id=95984





在LCD驱动程序中,需要我们根据LCD datasheet来设置相应的参数,这些参数包括:pixclock,left_margin,right_margin, upper_margin, lower_margin, hsync_len, vsync_len,VBP, VFB,VSPW, HBP, HFP, HSPW。下图是典型的TFT LCD时序图:



 

  __u32 pixclock; /* 像素时钟 ( 皮秒 )*/

   __u32 left_margin; /* 行切换,从同步到绘图之间的延迟 */

   __u32 right_margin; /* 行切换,从绘图到同步之间的延迟 */

   __u32 upper_margin; /* 帧切换,从同步到绘图之间的延迟 */

   __u32 lower_margin; /* 帧切换,从绘图到同步之间的延迟 */

   __u32 hsync_len; /* 水平同步的长度 */

   __u32 vsync_len; /* 垂直同步的长度 */



VBP(vertical back porch) :表示在一帧图像开始时,垂直同步信号以后的无效的行数,对应驱动中的 upper_margin ;

   VFB(vertical front porch) :表示在一帧图像结束后,垂直同步信号以前的无效的行数,对应驱动中的 lower_margin ;

   VSPW(vertical sync pulse width) :表示垂直同步脉冲的宽度,用行数计算,对应驱动中的vsync_len ;

   HBP(horizontal back porch) :表示从水平同步信号开始到一行的有效数据开始之间的 VCLK的个数,对应驱动中的 left_margin ;

   HFP(horizontal front porth) :表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK 的个数,对应驱动中的 right_margin ;

HSPW(horizontal sync pulse width) :表示水平同步信号的宽度,用 VCLK 计算,对应驱动中的 hsync_len ;



之前老是搞不清楚LCD驱动程序中的pixclock 的计算方法,闲杂清楚了,赶紧记录下来:

pixclock 的计算:

DOTCLK = f frame × (X + HBP + HFP+HSPW ) × (Y + VBP + VFP+VSPW) ( 单位: MHz)

pixclock = 1012 / DOTCLK= 1012 / (f frame × (X + HBP + HFP+HSPW ) × (Y + VBP + VFP+VSPW)) ( 单位:皮秒 )



例如:





struct fb_videomode {

const char * name; /* optional */

u32 refresh; /* optional */

u32 xres;

u32 yres;

u32 pixclock; //单位为皮秒
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: