本文主要使用平台是 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的各个成员的意义:
本篇只是给初学者起到一个抛砖引玉的作用,很多参数没有细研究,在此不做过多解释。 |