本文主要使用平台是 imx6x 系列, linux3.0.35 操作系统。参考用户资料是OKMX6Q-C、OKMX6DL-C (Linux)用户资料-2018.11.28。
我们在调试LCD屏幕是否能够在开发板上使用的时候,首先应该判断屏幕硬件上使用的线序是否能够和开发板上的硬件线序一致;硬件上能够接到开发板上才能够谈后边的软件调试。接着硬件接好后判断LCD屏幕是否被点亮,如果屏幕不能够点亮,先要检查一下PWM背光控制;屏幕能够被点亮了,我们才能够调试显示,也就是我们这篇文章的主要目的。
下面我们以调试10.4吋LCD屏幕显示为例,简单说一下LCD调试时软件需要做的主要修改。
1、关于uboot部分的修改关于UBOOT部分的修改,主要的作用是能够正常显示开机logo,以及将内核需要的参数信息传递给内核。UBOOT修改主要涉及到以下两个文件:
❶ 修改uboot-2009-08/include/configs/mx6q_sabresd.h中的显示参数,如下面两张图片的红色方框部分
❷ 修改board/freescale/mx6q_sabresd/mx6q_sabresd.c文件系统,添加LCD显示的参数:红色部分为添加项。
static struct fb_videomode displays[] = {
{
.name = "AT104-WVGA",
.refresh = 60,
.xres = 800,
.yres = 600,
.pixclock = 25000,
.left_margin = 210,
.right_margin = 40,
.upper_margin = 23,
.lower_margin = 3,
.hsync_len = 6,
.vsync_len =2,
.sync = FB_SYNC_CLK_LAT_FALL,
.vmode = FB_VMODE_NONINTERLACED,
.flag = 0,
.mode = FB_VIDEOMODE_LCD,
},、
2、内核相关部分修改
内核部分的LCD配置,就是LCD屏幕系统启动后的正常显示。主要修改一个文件就可以了。
修改linux-3.0.35/drivers/video/mxc/mxc_lcdif.c文件,在以下结构体中添加红色部分,红色部分的参数我们介意看到和UBOOT中的参数是一致的。
static struct fb_videomode lcdif_modedb[] = {
………………….
/* 800x480 @ 60 Hz , pixel clk @ 33.3MHz */
"AT070-WVGA", 60, 800, 480, 30030, 210, 46, 22, 23, 10, 10,
FB_SYNC_CLK_LAT_FALL,
FB_VMODE_NONINTERLACED,
0,},
…………………………………….
{
"AT104-WVGA", 60, 800, 600, 25000, 210,40, 23, 3, 6, 2,
FB_SYNC_CLK_LAT_FALL,
FB_VMODE_NONINTERLACED,
0,},
};
特别强调:AT104-WVGA这个名字需要在UBOOT中的设置以及内核中的设置保持一致,名称没有限制,唯一要求是UBOOT和内核中一定要一致。
LCD显示部分我们经常涉及到的修改,主要是以上提到的部分,修改完成后将重新编译生成的镜像烧写到开发板中,接上10.4吋LCD屏就可以看到,屏幕能够正常显示了。
3、相关参数理解
对于涉及到的LCD参数值的设置,可能有些客户不太了解,下面小编简单说下自己的理解:
首先看一下在内核的include/linux/fb.h文件中关于fb_videomode的定义:
以上定义的参数和UBOOT中也是对应的。这些值是由LCD厂家提供的屏体手册来确定的。
接着我们以10.4吋为例看一下10.4吋屏的屏体手册中的参数
其中图中红色方框的28指的是vertical的Blanking典型值,红色方框中的256指的是Horizontal的Blanking的典型值。
下面有个框图展示了这些参数的关系:
通过以上示意图我们可以了解到,在10.4吋屏的屏体手册中
Left_margin+right_margin+hsync_len=256
Upper_margin+lower_margin+vsync_len=28
我们在设置left_margin,right_margin,hsync_len三个值得时候保证他们的和是256即可,在upper_margin,lower_margin,vsync_len三个值得时候保证他们的和是28即可。
有些LCD手册中会直接给出这6个参数的值,那么就可以根据硬件手册给出的值直接设置,调试的时候微调即可。
pxclock参数的确定方法:dotclock=1/dotclock,其中dotclock可以选取手册中的典型值40MHz,那么计算出pixclock=25000皮秒
实际刷新频率=40000000Hz÷((Left_margin+right_margin+hsync_len+xres)*(Upper_margin+lower_margin+vsync_len+yres))≈60Hz
我们将修改后的镜像烧写到开发板之后,通过fbset命令可以看到屏幕设置的实际参数如下图:
手册上提供的这些参考值,可以根据实际的使用情况微调。
简单的一个表,明确一下fb_videomode的各个成员的意义:
名称 | 手册简称 | 中文名 | 意义 |
name | No | 名字 | 液晶屏名字(可选) |
refresh | No | 刷新频率 | 刷新频率(通常为60Hz) |
xres | No | 行宽 | 每行的像素个数 |
yres | No | 屏幕高度 | 屏幕的行数 |
pixclock | No | 像素时钟 | 每个像素时钟周期的长度,单位是皮秒(10的负12次方分之1秒) |
left_margin | HBP (Horizontal Back Porch) | 水平后沿 | 在每行或每列的象素数据开始输出时要插入的象素时钟周期数 |
right_margin | HFP (Horizontal Front Porch ) | 水平前沿 | 在每行或每列的象素结束到LCD 行时钟输出脉冲之间的象素时钟数 |
upper_margin | VBP (Vertical Back Porch) | 垂直后沿 | 在垂直同步周期之后帧开头时的无效行数 |
lower_margin | VFP (Vertical Front Porch) | 垂直前沿 | 本帧数据输出结束到下一帧垂直同步周期开始之前的无效行数 |
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(垂直同步高电平有效) |
vmode | No | No | 在内核中的大多数示例都直接置为FB_VMODE_NONINTERLACED。interlaced的意思是交错[隔行]扫描,电视中使用2:1的交错率, 即每帧分两场,垂直扫描两次,一场扫描奇数行,另一场扫描偶数行。很显然LCD目前不是这种模式。 |
本篇只是给初学者起到一个抛砖引玉的作用,很多参数没有细研究,在此不做过多解释。LCD方面的驱动以及支持很博大精深,有兴趣的粉丝可以自己研究研究,大家也可以登录飞凌官方技术论坛了解更多相关内容。