我这篇文章主要讲述i.mx6 平台下 采用DE模式的lvds液晶屏的驱动调试,
阅读该文章之前请先阅读如下两篇我转载的文章,这两篇文章是理解我这篇文章的基础知识。
1、 lcd fb参数如何计算:
http://blog.csdn.net/liuhuahan/article/details/43447657
2、 camera_lcd之DE和HV模式区别
http://blog.csdn.net/liuhuahan/article/details/43489269
详细阅读并理解这两篇文章之后,就会对液晶屏显示的关键结构体的各个参数有一个详细的了解。
Linux内核的amba lcd控制器使用clcd_panel结构体表示一个LCD屏的硬件参数:
/* include/linux/fb.h */
struct fb_videomode {
const char*name; /* optional */
u32refresh; /* 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;
};
在i.mx6中,关于lvds液晶屏的这个结构体参数所属文件为:driver/video/mxc/ldb.c
有这幅图可以知道结构体struct fb_videomode各个元素所对应的具体含义,如果液晶屏采用行场(HV)模式的,根据液晶屏数据手册可以很容易的把这个结构体中各个元素的数值填写进去,但是如果液晶屏是采用DE模式的话,液晶屏数据手册上提供的参数就不好和结构体中各个参数对应了。现在我就来说一下DE模式下的液晶屏如何把手册中提供的数据与该结构体中各元素的值进行对应。
先说我用的液晶屏是EJ070NA-01F,手册中该屏幕的参数如下:
有该数据列表可知(其后所述均采用标称值),该屏幕分辨率为1024x600,时钟频率为51.2MHz,由此可知像素时钟周期(单位皮秒)为14065。但是其他数据就和结构体里的元素对应不上了,有以上数据手册可以得知,其一行1344个像素点,空白点是320个,即其扫描一行在行首会有320个无效像素点。根据手册又可知,其扫描一场即扫描一屏有35个空白行,
这里边没有和结构体fb_videomode个元素对应的值啊,这该怎么填呢,其实图1所示的是一个屏幕中与各元素对应的值,但实际上屏幕上显示的图像是一屏一屏连续的,你可以把两个屏幕即把两个图1左右并排放置,如下图所示:
看两个图片之间,看出来了吧,即right_margin + hsync_len + left_margin = 一行总的空白数,在该款屏幕中这个和的值为320,
再把这两个图片上下拼起来看:
再看两个图片中间无效区间,即upper_margin + lower_margin + hsync_len = 一场总空白行,在该款屏幕中,这个和的值为35。
之后就可以随意分配结构体fb_videomode中的各元素的值,只要满足以上的两个等式就可以了。
在看我这款屏幕在实际中设置的值如下:
static structfb_videomode ldb_modedb[] = {
{
"LDB-WXGA", 60, 1280, 800, 14065,
40,40,
10,3,
80,10,
0,
FB_VMODE_NONINTERLACED,
FB_MODE_IS_DETAILED,},
{
"LDB-XGA",60, 1024, 600, 19531,
220, 40,
20, 5,
60, 10,
0,
FB_VMODE_NONINTERLACED,
FB_MODE_IS_DETAILED,},
}
红色部分即为我这款屏幕的参数值,看是不是满足上述两个等式,我也随意调换了几次其中的参数值,发现只有满足我之前所说的两个等式就可以正常显示。
当然这也只是我的一家之言,我其实对Linux的显示这部分内容了解的也不深,只是因为项目需要,需要调试液晶屏驱动,我也就对着了解了一点这部分的内容,可能有些地方说的不一定对,写出来仅供大家参考吧。