先来回顾一下裸机的时候 LCD 驱动是怎么编写的,裸机 LCD 驱动编写流程如下:
①、初始化 I.MX6U 的 eLCDIF 控制器,重点是 LCD 屏幕宽(width)、高(height)、hspw、hbp、hfp、vspw、vbp 和 vfp 等信息。
②、初始化 LCD 像素时钟。
③、设置 RGBLCD 显存。
④、应用程序直接通过操作显存来操作 LCD,实现在 LCD 上显示字符、图片等信息。

使用示例:
设备树里选择pinctrl的引脚,设置LCD的属性和时序信息。

&lcdif { 
2 	pinctrl-names = "default"; 
3 	pinctrl-0 = <&pinctrl_lcdif_dat /* 使用到的 IO */
4 				 &pinctrl_lcdif_ctrl>;
5
6 	display = <&display0>;
7 	status = "okay"; 
8 
9 	display0: display { /* LCD 属性信息 */
10 		bits-per-pixel = <24>; /* 一个像素占用几个 bit */
11 		bus-width = <24>; /* 总线宽度 */
12
13 display-timings {
14 		native-mode = <&timing0>; /* 时序信息 */
15 		timing0: timing0 { 
16 			clock-frequency = <51200000>; /* LCD 像素时钟,单位 Hz */
17 			hactive = <1024>; /* LCD X 轴像素个数 */
18 			vactive = <600>; /* LCD Y 轴像素个数 */
19 			hfront-porch = <160>; /* LCD hfp 参数 */
20 			hback-porch = <140>; /* LCD hbp 参数 */
21 			hsync-len = <20>; /* LCD hspw 参数 */
22 			vback-porch = <20>; /* LCD vbp 参数 */

23 			vfront-porch = <12>; /* LCD vfp 参数 */
24 			vsync-len = <3>; /* LCD vspw 参数 */
25
26 			hsync-active = <0>; /* hsync 数据线极性 */
27 			vsync-active = <0>; /* vsync 数据线极性 */
28 			de-active = <1>; /* de 数据线极性 */
29 			pixelclk-active = <0>; /* clk 数据线先极性 */
30 			};
31 		};
32	 };
33 };

LCD 屏幕背光节点信息
```c
1 pinctrl_pwm1: pwm1grp { 
2 fsl,pins = < 
3 				MX6UL_PAD_GPIO1_IO08__PWM1_OUT 0x110b0
4 			>;
5 };

如果背光用的其他 pwm 通道,比如 pwm2,那么就需要仿照示例代码 59.3.6 的内容,向
pwm2 节点追加相应的内容。pwm 和相关的 IO 已经准备好了,但是 Linux 系统怎么知道
PWM1_OUT 就是控制 LCD 背光的呢?因此我们还需要一个节点来将 LCD 背光和 PWM1_OUT
连 接 起 来 。 这 个 节 点 就 是 backlight , backlight 节 点 描 述 可 以 参 考
Documentation/devicetree/indings/video/backlight/pwm-backlight.txt 这个文档,此文档详细讲解了
backlight 节点该如何去创建,这里大概总结一下:

①、节点名称要为“backlight”。
②、节点的 compatible 属性值要为“pwm-backlight”,因此可以通过在 Linux 内核中搜索 “ pwm-backlight ”来查找 PWM 背 光 控 制 驱 动 程 序 , 这 个 驱 动 程 序 文 件为 drivers/video/backlight/pwm_bl.c,感兴趣的可以去看一下这个驱动程序。
③、pwms属性用于描述背光所使用的PWM以及PWM频率,比如本章我们要使用的pwm1, pwm 频率设置为 5KHz(NXP 官方推荐设置)。
④、brightness-levels 属性描述亮度级别,范围为 0~255,0 表示 PWM 占空比为 0%,也就是亮度最低,255 表示 100%占空比,也就是亮度最高。至于设置几级亮度,大家可以自行填写 此属性。
⑤、default-brightness-level 属性为默认亮度级别。

根据上述 5 点设置 backlight 节点,这个 NXP 已经给我们设置好了,大家在 imx6ull-emmc.dts 文件中找到如下内容:
示例代码 59.3.7 backlight 节点内容

1 backlight { 
2 		compatible = "pwm-backlight";
3 		pwms = <&pwm1 0 5000000>;
4 		brightness-levels = <0 4 8 16 32 64 128 255>;
5 		default-brightness-level = <6>;
6 		status = "okay"; 
7 };

第 3 行,设置背光使用 pwm1,PWM 频率为 5KHz。 第 4 行,设置背 8 级背光(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 行,设置默认背光等级为 6,也就是 50.19%的亮度。

修改完设备树即使用自定义的LCD屏幕。
更多文章请关注嵌入式机器人公众号
设备树下的LCD驱动_初始化