1回答

0收藏

RIoTboard连载八 板子7寸LCD参数配置和对应驱动修改

其他 其他 7917 人阅读 | 1 人回复 | 2014-05-18

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;
};

具体含义:
  
名称
  
意义
备注
const char *name
LCD名字,可以自己定义
u32 refresh
刷新频率,一般定义为60
u32 xres
行像素
u32 yres
列像素
u32 pixclock
像素时钟
u32 left_margin
在每行或每列的象素数据开始输出时要插入的象素时钟周期数
u32 right_margin
在每行或每列的象素结束到LCD 行时钟输出脉冲之间的象素时钟数
u32 upper_margin
在垂直同步周期之后帧开头时的无效行数
u32 lower_margin
本帧数据输出结束到下一帧垂直同步周期开始之前的无效行数
u32 hsync_len
行同步脉宽
u32 vsync_len
场同步脉宽
u32 sync
同步极性设置
可根据情况自行设置
u32 vmode
一般配置为隔行扫描
u32 flag
未使用

下面我们就看看根据我们实际的LCD规格书来填充这些参数,首先我们看LCD规格书中的timing时序:

以上就是关于LCD的主要参数列表。
下面看看根据我们自己LCD规格书配置参数。
Const char *name:这个是对应的LCD参数的名字,可以自己起名,但是要和后面给内核传递的参数名字一样。
Refresh:这个就是我们熟悉的刷新频率,我们不讨论LCDCRT的刷新频率问题,这里选择默认60就好了。
XresYres这两个是分辨率参数,即行和列的像素个数,我们的LCD800*480的,直接就填写800480就行了.
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-tvpw23-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的主要参数我们就设置完毕了。
根据上述的内容来修改RIoTboardLCD配置文件,来使LCD的分辨率等参数适合我们的7LCD
首先我们看看使用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寸屏上的完美显示了。


评分

参与人数 1声望 +3 与非币 +5 收起 理由
奔跑-350257 + 3 + 5 粗略瞄了一眼,很详细,赞一个!.

查看全部评分

分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

bruce_helen

发表于 2014-5-18 20:50:21 | 只看该作者

相当nice的文章!
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条