这一节我们主要介绍内核阶段LCD的调试,通过这节内容的掌握,我们就可以轻松适配满足自己分辨率需求的屏幕了。
硬件原理
NXP的i.MX6ULL EVK板的LCD相关引脚跟ELF 1开发板使用的是同一组LCD引脚。i.MX6ULL只有一组LCD引脚,只不过EVK板用的是RGB888模式,ELF 1开发板使用的是RGB565模式。
上图红框中是LCD显示相关的引脚,对于LCD_DATA0-LCD_DATA15、LCD_HSYNC、LCD_VSYNC、LCD_DE、LCD_PCLK这些引脚,NXP EVK和ELF 1开发板使用的是同一组,我们不需要修改,只需要注释掉LCD_DATA16-LCD_DATA23这几个引脚的配置。PWM_BLT背光调节引脚,使用的是N17,PAD NAME为GPIO1_IO08(实际上跟NXP EVK使用的也是同一个背光调节引脚)。LCD_PWREN引脚是LCD电源控制引脚,是由SN74HC595D扩展芯片扩展出来的引脚。
IOMUX配置
确定引脚之后,我们开始配置。打开设备树arch/arm/boot/dts/imx6ull-elf1-emmc.dts文件,在iomuxc节点下可以看到关于lcd data引脚 IOMUX配置的子节点:pinctrl_lcdif_dat,注释掉LCD_DATA16-LCD_DATA23这几个引脚的配置:
此节点下面有lcd控制相关引脚的配置节点pinctrl_lcdif_ctrl,我们不做更改:
PWM_BLT引脚PAD NAME是GPIO1_IO08,需要将此引脚复用成为PWM功能,在iomuxc节点中已经存在了此引脚的PWM功能配置:
LCD_PWREN引脚,需要拉高,来开启LCD电源,该引脚需要通过配置SN74HC595D设备控制该引脚高低。SN74HC595D芯片是通过SPI扩展IO资源的芯片。本方案使用SHIFT_SDI(GPIO5_IO10)、SHIFT_NOE (GPIO5_IO8)、SHIFT_STCP(GPIO5_IO7)、SHIFT_SHCP(GPIO5_IO11)四个引脚的GPIO功能模拟SPI与SN74HC595D芯片通信,扩展出QA-QH共8路GPIO资源,其中QH就是用于控制LCD电源使能的LCD_PWREN引脚。
ELF 1开发板跟NXP EVK板使用的是同一方案,所以,在内核中已经存在该芯片的驱动并且在设备树中已经存在了关于该芯片的配置节点:
IOMUX的配置节点在iomux_snvs:
我们现在只需要保证QH引脚输出为高就可以了,在上图的SN74HC595D节点的registers-default属性是配置默认扩展后的IO输出电平的。这里设置的0xaf,QH对应0xaf最高位为1,保证了LCD_PWREN默认为高电平。
设备节点添加
设备树中已经存在lcdif节点:
注释掉display0节点:
在根节点下添加display0节点:
因为ELF 1开发板出厂默认的屏幕分辨率为1024x600,所以需要修改屏幕参数:
clock-frequency = <51200000>; hactive = <1024>; vactive = <600>; hfront-porch = <160>; hback-porch = <160>; hsync-len = <1>; vback-porch = <23>; vfront-porch = <12>; vsync-len = <1>; |
ELF 1开发板 LCD接口没有引出复位引脚,我们注释掉关于lcdif_reset引脚的配置&pinctrl_lcdif_ctrl。
其中bus-width属性是指数据总线的宽度,硬件电路上我们使用的是LCD_DATA0-LCD_DATA15共16根数据线,所以bus-width应改为16;bits-per-pixel表示每个像素占用的bit位,我们使用的是RGB565模式,即16个bit位,所以这里是16。Clock-frequencey属性设置的是像素时钟频率。Hactive和vactive是屏的像素分辨率,紧接着的6行是屏体的一些参数。再下面的四行hsync-active到pixelclk-active,设置的是行场信号、DE信号、时钟信号的极性。
如果使用1024x600的LCD屏,除了修改上面的屏幕参数以外还需要修改bus-width参数:
display0: display { bits-per-pixel = <16>; bus-width = <16>; |
然后开始背光PWM调节信号的节点添加,实际已存在的PWM1节点和backlight节点,就是用于LCD背光调节,这里不作修改:
&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”; }; |
pwm1的节点跟前面章节介绍的pwm2功能一样,backlight设备节点引用的pwm1功能。Compatible用于跟pwm背光调节驱动匹配,pwms属性用于设置所引用的pwm和其最大输出频率。Brightness-levels设置不同的亮度等级。Default-brightness-level设置默认的亮度等级。
编译测试
编译设备树并拷贝到开发板:
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make dtbs elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf1-emmc.dtb root@172.16.0.175:/run/media/mmcblk1p1/ |
进行sync操作后断电,接上1024x600分辨率的LCD屏,重启开发板,看到显示正常画面。