嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > Linux LCD 屏幕驱动调参实操

Linux LCD 屏幕驱动调参实操

点击下方名片关注公众号

文中提到过,eLCDIF接口驱动程序已经由半导体厂家编写好,且不同分辨率LCD屏的eLCDIF接口驱动代码都是一样的,因此LCD驱动部分无需修改。只需要根据所使用的LCD来调整设备树参数即可,本文使用的是正点原子的IMX6ULL开发板,其LCD的接口IO如下图示:

由上图可知,LCD使用了如下三类IO连接:
  • 24 根RGB LCD数据线

  • 4 根控制线,PCLK、DE、VSYNC和HSYNC

  • 1 根LCD背光PWM引脚线


1. 设备树修改

设备树的修改,涉及下面三个方面:

  • LCD所使用的IO配置

  • LCD屏幕节点修改,修改相应的属性值,换成所使用的LCD屏幕参数

  • LCD背光节点信息修改,根据实际使用的背光IO来修改相应的设备节点信息


1.1 LCD屏幕IO配置

配置设备树中LCD所使用的IO,通常情况下半导体厂家已经写好了,无需修改。在imx6ull-andyxi-emmc.dts文件,iomuxc节点中能找到如下配置内容:

pinctrl_lcdif_dat: lcdifdatgrp { 
 fsl,pins = < 
  MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x79 
  MX6UL_PAD_LCD_DATA01__LCDIF_DATA01 0x79 
  MX6UL_PAD_LCD_DATA02__LCDIF_DATA02 0x79 
  MX6UL_PAD_LCD_DATA03__LCDIF_DATA03 0x79 
  MX6UL_PAD_LCD_DATA04__LCDIF_DATA04 0x79 
  MX6UL_PAD_LCD_DATA05__LCDIF_DATA05 0x79 
  MX6UL_PAD_LCD_DATA06__LCDIF_DATA06 0x79 
  MX6UL_PAD_LCD_DATA07__LCDIF_DATA07 0x79 
  MX6UL_PAD_LCD_DATA08__LCDIF_DATA08 0x79 
  MX6UL_PAD_LCD_DATA09__LCDIF_DATA09 0x79 
  MX6UL_PAD_LCD_DATA10__LCDIF_DATA10 0x79 
  MX6UL_PAD_LCD_DATA11__LCDIF_DATA11 0x79 
  MX6UL_PAD_LCD_DATA12__LCDIF_DATA12 0x79 
  MX6UL_PAD_LCD_DATA13__LCDIF_DATA13 0x79 
  MX6UL_PAD_LCD_DATA14__LCDIF_DATA14 0x79 
  MX6UL_PAD_LCD_DATA15__LCDIF_DATA15 0x79 
  MX6UL_PAD_LCD_DATA16__LCDIF_DATA16 0x79 
  MX6UL_PAD_LCD_DATA17__LCDIF_DATA17 0x79 
  MX6UL_PAD_LCD_DATA18__LCDIF_DATA18 0x79 
  MX6UL_PAD_LCD_DATA19__LCDIF_DATA19 0x79 
  MX6UL_PAD_LCD_DATA20__LCDIF_DATA20 0x79 
  MX6UL_PAD_LCD_DATA21__LCDIF_DATA21 0x79 
  MX6UL_PAD_LCD_DATA22__LCDIF_DATA22 0x79 
  MX6UL_PAD_LCD_DATA23__LCDIF_DATA23 0x79 
 >; 
};

pinctrl_lcdif_ctrl: lcdifctrlgrp { 
 fsl,pins = < 
  MX6UL_PAD_LCD_CLK__LCDIF_CLK 0x79 
  MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE 0x79 
  MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC 0x79 
  MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC 0x79 
 >; 
};
 
pinctrl_pwm1: pwm1grp { 
 fsl,pins = < 
  MX6UL_PAD_GPIO1_IO08__PWM1_OUT 0x110b0 
 >; 
};

LCD所使用的IO,分为如下三类:

  • 子节点 pinctrl_lcdif_dat,为24根数据线配置项

  • 子节点 pinctrl_lcdif_ctrl,为4根控制线配置项

  • 子节点 pinctrl_pwm1,为背光PWM引脚配置项


1.2 LCD屏幕参数节点信息修改

imx6ull-andyxi-emmc.dts文件中找到lcdif节点,以正点原子的ATK7016 (7寸 1024*600)屏幕为例,节点内容如下所示:

&lcdif { 
 pinctrl-names = "default"
 pinctrl-0 = <&pinctrl_lcdif_dat     //使用到的IO
              &pinctrl_lcdif_ctrl
              &pinctrl_lcdif_reset>;     
 display = <&display0>; 
 status = "okay"

 display0: display {                 //LCD属性信息
  bits-per-pixel = <24>;             //一个像素占用24bit
  bus-width = <24>;                  //总线宽度
 
  display-timings { 
   native-mode = <&timing0>;         //时序信息
   timing0: timing0 { 
    clock-frequency = <51200000>;    //LCD像素时钟,Hz
    hactive = <1024>;              //LCD X轴像素个数
    vactive = <600>;                 //LCD Y轴像素个数
    hfront-porch = <160>;            //LCD hfp参数
    hback-porch = <140>;             //LCD hbp参数
    hsync-len = <20>;              //LCD hspw参数
    vback-porch = <20>;              //LCD vbp参数
    vfront-porch = <12>;             //LCD vfp参数
    vsync-len = <3>;                 //LCD vspw参数

    hsync-active = <0>;              //hsync数据线极性
    vsync-active = <0>;              //vsync数据线极性
    de-active = <1>;                 //de数据线极性
    pixelclk-active = <0>;           //clk数据线先极性
   }; 
  }; 
 }; 
};


1.3 LCD屏幕背光节点信息

背光控制IO连接到了I.MX6U的GPIO1_IO08引脚上,将其复用为PWM1_OUT,通过PWM信号来控制LCD屏幕背光的亮度。

imx6ull-andyxi-emmc.dts中可找到背光节点的配置信息:

pinctrl_pwm1: pwm1grp { 
 fsl,pins = < 
  MX6UL_PAD_GPIO1_IO08__PWM1_OUT 0x110b0 
 >; 
};
&pwm1 { 
 pinctrl-names = "default"
 pinctrl-0 = <&pinctrl_pwm1>; 
 status = "okay"
};
backlight { 
 compatible = "pwm-backlight"
 pwms = <&pwm1 0 5000000>; 
 brightness-levels = <0 4 8 16 32 64 128 255>; 
 default-brightness-level = <6>; 
 status = "okay"
};


2. 编译测试

2.1 基本测试

配置好设备树后,使用make dtbs命令编译设备树,使用新的设备树启动内核即可。为了方便观察LCD驱动是否正常工作,可以使能Linux的小企鹅logo显示功能。在内核源码根目录下,使用make menuconfig命令打开图形化配置界面,按下面的路径,使能logo显示功能

-> Device Drivers 
  -> Graphics support 
   -> Bootup logo (LOGO [=y]) 
    -> Standard black and white Linux logo 
    -> Standard 16-color Linux logo 
    -> Standard 224-color Linux logo

重新编译Linux内核,并使用新的zImage镜像启动系统,若LCD驱动正常,会在屏幕左上角出现一个彩色的小企鹅logo,屏幕背景色为黑色,如下图示


2.2 LCD作为终端控制台

Linux开发中,通常使用电脑的串口软件作为Linux开发板终端,开发板通过串口和串口软件进行通信。而LCD驱动起来后,可将其设置为终端,可以接上键盘直接在开发板上敲命令,设置LCD为终端控制台的方法如下:

⏩ 设置uboot中的bootargs:进入uboot命令行,修改bootargs参数的console内容

setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.100: /home/andyxi/linux/nfs/rootfs ip=192.168.1.200:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off'
注意:console设置了两遍console,tty1表示设置LCD屏幕为控制台,ttymxc0,115200是设置串口也作为控制台

⏩ 修改/etc/inittab文件:打开开发板根文件系统中的/etc/inittab文件,加入下面代码

tty1::askfirst:-/bin/sh

上述修改完后,重启开发板,LCD屏幕即可作为终端控制台使用,可以接上键盘直接在开发板上敲命令了


2.3 LCD背光调节

背光设备树节点设置了8个等级的背光调节,可以设置为 0~7,可以通过设置背光等级来实现 LCD背光亮度的调节,进入如下目录:

/sys/devices/platform/backlight/backlight/backlight

上图中brightness表示当前亮度等级,max_bgigntness表示最大亮度等级,可使用cat命令查看内容

若要修改屏幕亮度,只需要向brightness写入需要设置的屏幕亮度等级即可

echo 7 > brightness


2.4 LCD自动熄屏

Linux内核中默认设置10分钟不操作LCD就会熄屏,以节省电能。解决自动息屏的问题有如下几种方法:

⏩ 按键或键盘唤醒LCD

⏩ 修改Linux内核设置:修改Linux源码中drivers/tty/vt/vt.c文件中的blankinterval变量后,重新编译内核

static int vesa_blank_mode; 
static int vesa_off_interval; 
static int blankinterval = 10*60//10*60秒,改为0后即可关闭熄屏功能

⏩ 使用APP关闭熄屏:编写LCD常亮APP,并在开机启动脚本中启动该APP

/***** lcd_always_on.c *****/
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h> 
 
int main(int argc, char *argv[]) 
 int fd; 
 fd = open("/dev/tty1", O_RDWR); 
 write(fd, "\033[9;0]"8); 
 close(fd); 
 return 0
}
编译生成可执行文件后,将其拷贝到开发板根文件系统的/usr/bin目录中,给予可执行权限,设置为开机自启动,打开/etc/init.d/rcS,在此文件最后面加入如下内容即可:

cd /usr/bin 
./lcd_always_on 
cd ..


往期推荐

● 

● 

● 

● 

● 

● 

● 

扫二维码|关注我们

微信号|andyxi_linux

专注于嵌入式开发技术

分享、在看与点赞

只要你点,我们就是胖友