先来回顾一下裸机的时候 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屏幕。