目录
1. NXP官方I.MX6ULL EVK开发板与ALIENTEK-ALPHA开发板LCD显示屏接口对照
I.MX6ULL EVK开发板与ALIENTEK-ALPHA开发板LCD显示屏接口如下图所示:
由上图可知I.MX6ULL EVK开发板与ALIENTEK-ALPHA开发板LCD显示屏复位控制引脚有所不同,其余控制引脚完全相同。
2. 修改设备树LCD驱动
MX6ULL的eLCDIF的接口驱动程序NXP官方已经编写好了,因此LCD的驱动部分不需要用户去修改。用户需要做的就是按照自己所使用的LCD修改设备树文件,设备树文件的修改涉及以下三个方面:
(1)LCD所使用的IO配置
(2)LCD屏幕节点修改,修改相应的属性值,换成所使用的LCD屏幕参数
(3)LCD背光节点信息修改,根据实际使用的背光IO来修改相应的设备节点信息
2.1 LCD屏幕IO配置
1.LCD显示屏数据总线IO口配置
打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,在iomuxc节点中找到pinctrl_lcdif_dat节点,该节点描述了LCD数据总线使用的引脚复用功能和电气属性,配置内容如下所示:
由上图可知LCD显示屏数据总线引脚电气属性设置为0x79,ALIENTEK-ALPHA开发板上的LCD接口使用了三个SGM3157模拟开关,为了防止模拟开关影响到网络需要降低LCD数据线的驱动能力,也就是将LCD相关IO的驱动能力改为 R0/1,因此将0x79改为哦0x49。修改后的节点信息如下所示:
/**************LCD显示屏数据线引脚配置项LCD_DATA[23:0] 20230323*******************/
pinctrl_lcdif_dat: lcdifdatgrp {
fsl,pins = <
MX6UL_PAD_LCD_DATA00__LCDIF_DATA00 0x49
MX6UL_PAD_LCD_DATA01__LCDIF_DATA01 0x49
MX6UL_PAD_LCD_DATA02__LCDIF_DATA02 0x49
MX6UL_PAD_LCD_DATA03__LCDIF_DATA03 0x49
MX6UL_PAD_LCD_DATA04__LCDIF_DATA04 0x49
MX6UL_PAD_LCD_DATA05__LCDIF_DATA05 0x49
MX6UL_PAD_LCD_DATA06__LCDIF_DATA06 0x49
MX6UL_PAD_LCD_DATA07__LCDIF_DATA07 0x49
MX6UL_PAD_LCD_DATA08__LCDIF_DATA08 0x49
MX6UL_PAD_LCD_DATA09__LCDIF_DATA09 0x49
MX6UL_PAD_LCD_DATA10__LCDIF_DATA10 0x49
MX6UL_PAD_LCD_DATA11__LCDIF_DATA11 0x49
MX6UL_PAD_LCD_DATA12__LCDIF_DATA12 0x49
MX6UL_PAD_LCD_DATA13__LCDIF_DATA13 0x49
MX6UL_PAD_LCD_DATA14__LCDIF_DATA14 0x49
MX6UL_PAD_LCD_DATA15__LCDIF_DATA15 0x49
MX6UL_PAD_LCD_DATA16__LCDIF_DATA16 0x49
MX6UL_PAD_LCD_DATA17__LCDIF_DATA17 0x49
MX6UL_PAD_LCD_DATA18__LCDIF_DATA18 0x49
MX6UL_PAD_LCD_DATA19__LCDIF_DATA19 0x49
MX6UL_PAD_LCD_DATA20__LCDIF_DATA20 0x49
MX6UL_PAD_LCD_DATA21__LCDIF_DATA21 0x49
MX6UL_PAD_LCD_DATA22__LCDIF_DATA22 0x49
MX6UL_PAD_LCD_DATA23__LCDIF_DATA23 0x49
>;
};
2.LCD显示屏控制引脚IO口配置
打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,在iomuxc
节点中找到pinctrl_lcdif_ctrl节点,该节点描述了LCD控制引脚(LCD_PCLK、LCD_DE、LCD_HSYNC、LCD_VSYNC)使用的引脚复用功能和电气属性,配置内容如下图所示:
将上图中LCD显示屏控制引脚IO的电气属性设置为0x49,修改完成后的代码如下所示:
/*********LCD显示屏控制引脚配置项LCD_PCLK、LCD_DE、LCD_HSYNC、LCD_VSYNC********/
pinctrl_lcdif_ctrl: lcdifctrlgrp {
fsl,pins = <
MX6UL_PAD_LCD_CLK__LCDIF_CLK 0x49
MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE 0x49
MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC 0x49
MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC 0x49
>;
};
3.LCD显示屏背光引脚IO口配置
打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,在iomuxc
节点中找到pinctrl_pwm1节点,该节点描述了LCD背光PWM引脚复用功能和电气属性,配置内容如下图所示:
ALIENTEK-ALPHA开发板LCD背光控制引脚和NXP官方I.MX6ULL EVK开发板显示屏背光控制引脚相同因此此引脚配置不做修改。
2.2 LCD屏幕参数节点信息修改
打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,找到lcdif节点,节点内容如下所示:
&lcdif {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lcdif_dat
&pinctrl_lcdif_ctrl
&pinctrl_lcdif_reset>;
display = <&display0>;
status = "okay";
display0: display {
bits-per-pixel = <16>;
bus-width = <24>;
display-timings {
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <9200000>;
hactive = <480>;
vactive = <272>;
hfront-porch = <8>;
hback-porch = <4>;
hsync-len = <41>;
vback-porch = <2>;
vfront-porch = <4>;
vsync-len = <10>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <1>;
pixelclk-active = <0>;
};
};
};
};
pinctrl-0属性,LCD所使用的IO口配置项信息,NXP官方I.MX6ULL开发板LCD显示屏用到了数据总线(pinctrl_lcdif_dat)、LCD控制总线(pinctrl_lcdif_ctrl)和LCD复位引脚(pinctrl_lcdif_reset)三个IO相关的节点,ALIENTEK-ALPHA开发板没有使用复位IO口因此需要将
pinctrl_lcdif_reset节点信息删除。
display 属性,指定 LCD 属性信息所在的子节点,这里为 display0,下面就是 display0
子节点内容。
display0子节点,描述 LCD 的参数信息,bits-per-pixel属性用于指明一个像素占用的 bit 数,默认为 16bit。bus-width属性用于设置数据线宽度。关于bits-per-pixel和
bus-width属性的值可以参照Documentation/devicetree/bindings/fb目录下mxsfb.txt文件,这个文件中有关于这两个属性设置值的描述,如下如所示:
由上图可知LCD配置为RGB888模式时bits-per-pixel的值应设置为32同时LCD配置为RGB888模式因此bus-width属性应设置为24。
紧着这下面这几行用于配置LCD时序参数信息,关于LCD显示屏时序参数信息可以参见Documentation/
devicetree/bindings/video目录下display-timing.txt文件,如下图所示:
根据上面的描述我们对ALIENTEK-ALPHA开发板所使用的LCD屏幕参数节点信息进行修改(本文以ATK4384屏为例),ATK4384的信息如下图所示:
修改后的LCD节点信息如下所示:
/*修改LCD屏幕参数节点信息适配ALIENTEK-ALPHA开发板ATK4384屏*/
&lcdif {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lcdif_dat /*LCD屏数据线引脚初始化*/
&pinctrl_lcdif_ctrl>; /*LCD屏控制信号引脚初始化*/
display = <&display0>;
status = "okay";
/*ATK4384屏参数修改*/
display0: display { /*LCD属性信息*/
bits-per-pixel = <32>; /*一个像素占用24bit*/
bus-width = <24>; /*总线宽度*/
display-timings { /*LCD屏时序信息*/
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <31000000>; /*LCD像素时钟,单位Hz*/
hactive = <800>; /*LCD X轴像素个数*/
vactive = <480>; /*LCD Y轴像素个数*/
hfront-porch = <40>; /*LCD hfp参数*/
hback-porch = <88>; /*LCD hbp参数*/
hsync-len = <48>; /*LCD hspw参数*/
vback-porch = <32>; /*LCD vbp参数*/
vfront-porch = <13>; /*LCD vfp参数*/
vsync-len = <3>; /*LCD vspw参数*/
hsync-active = <0>; /*hsync 数据线极性*/
vsync-active = <0>; /*vsync 数据线极性*/
de-active = <1>; /*de 数据线极性*/
pixelclk-active = <0>; /*clk 数据线极性*/
};
};
};
};
2.3 LCD 屏幕背光节点信息
ALIENTEK-ALPHA开发板LCD显示屏背光接口控制IO连接到了I.MX6U的GPIO1_IO08引脚上,GPIO1_IO08复用为PWM1_OUT,通过PWM信号来控制LCD显示屏背光的亮度,ALIENTEK-ALPHA和NXP官方I.MX6ULL EVK开发板的LCD背光引脚使用同一个引脚,因此背光的设备树节点不需要修改,打开arch/arm/boot/dts目录下的
imx6ull-alientek.dts文件,找到pinctrl_pwm1节点,节点内容如下所示:
/***************LCD显示屏背光引脚配置项 20230323***********************/
pinctrl_pwm1: pwm1grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO08__PWM1_OUT 0x110b0
>;
};
pinctrl_pwm1节点就是GPIO1_IO08的配置节点,从第 3 行可以看出,设置 GPIO1_IO08 这个 IO 复用为 PWM1_OUT,并且设置电气属性值为 0x110b0。 LCD背光要用到 PWM1,因此也要设置PWM1节点,打开arch/arm/boot/dts目录下的imx6ull.dtsi文件,找到pwm1节点,节点信息如下所示:
pwm1: pwm@02080000 {
compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
reg = <0x02080000 0x4000>;
interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6UL_CLK_PWM1>,
<&clks IMX6UL_CLK_PWM1>;
clock-names = "ipg", "per";
#pwm-cells = <2>;
};
imx6ull.dtsi文件中的pwm1节点信息尽量不要修改,如果修改pwm1节点内容在imx6ull-alientek.dts文件中修改。在Linux源码文件中搜索compatible属性的这两个值即可找到imx6ull的pwm驱动文件,imx6ull的pwm驱动文件为drivers/pwm/pwm-imx.c如下图所示:
打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,找到pwm1节点,如下所示:
&pwm1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_pwm1>;
status = "okay";
};
第3行,设置pwm1所使用的IO为pinctrl_pwm1,也就是GPIO1_IO08这个引脚。
第4行,将status状态设置为okay。
如果背光用的其他pwm通道,比如pwm2,那么就需要按照上述的代码在imx6ull-alientek.dts文件中增加pwm2节点相应的内容。pwm和相关的IO口已经设置完成,Linux系统怎么使用PWM1_OUT控制LCD背光,就需要一个桥梁将LCD背光和PWM1_OUT连接起来。这个节点就是backlight,backlinght
节点描述可以参考Documentation/devicetree/bindings/video/backlight/pwm-backlight.txt这个文档,打开此文档如下图所示:
上图描述了backlight节点信息,backlight节点包含以下信息
(1)、节点名称要为“backlight”。
(2)、节点的compatible属性值为“pwm-backlight”可以在Linux内核中搜索“pwm-backlight”来查找PWM背光控制驱动程序,驱动程序文件为drivers/video/backlight/pwm_bl.c如下图所示:
(3)、pwms属性用于描述LCD背光所使用的PWM以及PWM频率,比如pwm-backlight.txt文档中例子使用的pwm且pwm频率设置为200Hz。
(4)、brightness-levels属性描述亮度级别,范围0~255,0表示PWM占空比为0%亮度最低,255表示占空比为100%亮度最高。
(5)、default-brightness-level 属性为默认亮度级别。
打开arch/arm/boot/dts目录下的imx6ull-alientek.dts文件,找到backlight节点,如下所示:
backlight {
compatible = "pwm-backlight";
pwms = <&pwm1 0 5000000>;
brightness-levels = <0 4 8 16 32 64 128 255>;
default-brightness-level = <6>;
status = "okay";
};
第3行,设置LCD背光使用pwm1且PWM频率为200Hz。
第4行,设置LCD背光级别(0~7)分别为0、4、8、16、32、64、128和255对应占空比为0%、1.57%、3.13%、6.27%、12.55%、25.1%、50.19%、100%。
第5行,设置LCD显示屏默认背光等级为6即50.19%的亮度。
3. 编译测试
3.1 LCD显示屏基本性能测试
1.编译修改完成的Linux内核源码并使能Linux logo显示如下图所示:
Linux内核启动的时候可以选择显示小企鹅logo,启动ALIENTEK-ALPHA开发板后只要这个小企鹅logo显示正常表明LCD没有问题。Linux内核启动logo显示需要配置,输入命令make menuconfig打开Linux图形化配置界面,按照以下路径找到显示小企鹅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
上图中Bootup logo选项下的三个选项分别对应黑白、16位色和24位色彩格式的logo,将这三个选项都选中编译进Linux内核里面。设置完成后保存退出图形化配置界面,重新编译Linux内核,编译完成后将编译的设备树文件imx6ull-alientek-emmc.dtb和Linux镜像文件zImage文件拷贝到Ubuntu主机tftpboot目录下,如下图所示:
2.测试LCD显示屏驱动
将ALIENTEK-ALPHA开发板ENET2网口连接到路由上,开发板上电后uboot启动完成后将会从Ubuntu主机tftpboot目录下下载设备树文件(imx6ull-alientek-emmc.dtb)和Linux镜像文件(zImage)并启动Linux内核,如下图所示:
3.2LCD背光测试
上面的章节提及LCD显示屏背光设备树节点设置了8个等级的背光调节,可以设置位0~7级,通过设置背光等级调节LCD背光亮度,进入目录/sys/devices/platform/backlight/backlight/backlight查看此目录下的文件如图所示:
上图中的 brightness 表示当前亮度等级,max_bgigntness 表示最大亮度等级。