LCD驱动板可以工作了,那我们就看下RIOTBOARD板子上和LCD驱动相关的东西。按照官方手册内容,LVDS输出时适合9.7寸LCD的,我们要更换LCD的话,就必须自己学会阅读驱动源码和配置参数。在看驱动之前我们首先应该了解LCD的显示原理,这个说简单也简单,说麻烦一不是一两句就能说明白的,和我们主题不是那么相关,在这里就不阐述了,但是我们必须要看一下linux系统对LCD这个硬件做的抽象(详细参见:Documentation\fb\framebuffer.txt,源代码中Doucumentation下的文档都是很好的文档,能解决大家很多迷惑的问题,有时候大家一筹莫展的时候看看这个文件夹下的相关文档,也许大家就会豁然开朗。)
图中重要的参数有7个,下面我就看看这个抽象有关的数据结构参数和定义:
RIOTboard板子的源代码中结构体如下:
struct fb_videomode { constchar *name; /* optional */ u32refresh; /* optional */ u32xres; u32yres; u32pixclock; u32left_margin; u32right_margin; u32upper_margin; u32lower_margin; u32hsync_len; u32vsync_len; u32sync; u32vmode; u32flag; };
具体含义:
名称 | | | | | | | | | | | | | | | | | | | 在每行或每列的象素数据开始输出时要插入的象素时钟周期数 | | | 在每行或每列的象素结束到LCD 行时钟输出脉冲之间的象素时钟数 | | | | | | 本帧数据输出结束到下一帧垂直同步周期开始之前的无效行数 | | | | | | | | | | | | | | | | |
下面我们就看看根据我们实际的LCD规格书来填充这些参数,首先我们看LCD规格书中的timing时序:
以上就是关于LCD的主要参数列表。
下面看看根据我们自己LCD规格书配置参数。 Const char *name:这个是对应的LCD参数的名字,可以自己起名,但是要和后面给内核传递的参数名字一样。 Refresh:这个就是我们熟悉的刷新频率,我们不讨论LCD和CRT的刷新频率问题,这里选择默认60就好了。 Xres和Yres这两个是分辨率参数,即行和列的像素个数,我们的LCD是800*480的,直接就填写800和480就行了. Pixclock:是像素时钟,在linux文档中给出了计算公式: Pixelclock: xfree: in MHz fb: in picoseconds (ps) pixclock = 1000000 / DCF 下面看看后面6个参数的计算,首先看看LCD规格书里面的timing参数: 可以看到LCD时钟是33.3M,所以pixclock=1000000/33.3=30030 行同步脉冲宽度是一个时钟周期,所以,hsync_len=1 场同步脉冲的宽度是一个行周期,所以vsync_len = 1 然后看看一帧图像的时序图:
根据up_margin定义:在垂直同步周期之后帧开头时的无效行数,也就是图中的tvb-tvpw即23-1=22。 根据lower_margin定义:本帧数据输出结束到下一帧垂直同步周期开始之前的无效行数 Lower_margin=tv-tvd-up_margin,就是525-480-22=23. 然后再看看一行的时序图:
这个图有点模糊了,根据left_margin 定义:在每行或每列的象素数据开始输出时要插入的象素时钟周期数,left_margin=thb,即46 根据u32 right_margin定义:在每行或每列的象素结束到LCD 行时钟输出脉冲之间的象素时钟数.right_margin=th-thd-thb,即1056-800-46=210. 这样相对于LCD的主要参数我们就设置完毕了。 根据上述的内容来修改RIoTboard的LCD配置文件,来使LCD的分辨率等参数适合我们的7寸LCD。 首先我们看看使用LVDS0通道输出的配置步骤: 1. 打开ldb.c文件找到static struct fb_videomode ldb_modedb[]这个结构体定义:结构体定义中将LCD配置参数修改为适合我们LCD的配置参数,具体配置方式上文给出了分析,请自行查阅,其中红色字体是我们根据上述计算内容修改好的: staticstruct fb_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, 800, 480, 30030, 210, 46, 22, 23, 1, 1, 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_DETAILED,}, { "LDB-1080P60", 60, 1920, 1080, 7692, 100, 40, 30, 3, 10, 2, 0, FB_VMODE_NONINTERLACED, FB_MODE_IS_DETAILED,}, }; 2. 调整BSP文件,找到board-mx6q-riot.c文件,找到static struct fsl_mxc_ldb_platform_data ldb_data结构体定义: staticstruct fsl_mxc_ldb_platform_data ldb_data = { .ipu_id = 0, .disp_id = 0, .ext_ref = 1, .mode = LDB_SEP0,//这个地方设置LVDS输出通道,LDB_SEP0为LVDS0通道输出。 .sec_ipu_id = 0, .sec_disp_id = 1, }; 这个LVDS输出通道,RIoTboard上默认也是使用LVDS0,所以我们就不用修改了 现在主要修改这两个参数,然后重新编译kernel,下载运行,就可以看到我们的ubuntu在7寸屏上的完美显示了。
|