嵌入式实践教程--设备树下的LCD驱动开发

简介: 嵌入式实践教程--设备树下的LCD驱动开发

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

相关文章
|
2月前
|
Linux
Linux 驱动开发基础知识—— LED 驱动程序框架(四)
Linux 驱动开发基础知识—— LED 驱动程序框架(四)
89 0
Linux 驱动开发基础知识—— LED 驱动程序框架(四)
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十二)LED模板驱动程序的改造:设备树
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十二)LED模板驱动程序的改造:设备树
297 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十二)LED模板驱动程序的改造:设备树
|
Ubuntu Linux 开发工具
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十一)第一次写驱动程序
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十一)第一次写驱动程序
231 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十一)第一次写驱动程序
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
204 1
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十)LED模板驱动程序的改造:总线设备驱动模型
|
Linux C语言 芯片
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十二)LED硬件原理
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十二)LED硬件原理
128 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十二)LED硬件原理
|
Linux 开发工具 git
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
161 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十六)LED驱动程序框架
|
Ubuntu Linux 开发工具
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十)驱动怎么学
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十)驱动怎么学
141 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十)驱动怎么学
|
Linux 芯片
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十五)最简单的LED驱动程序
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十五)最简单的LED驱动程序
131 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(二十五)最简单的LED驱动程序
|
网络协议 Unix Linux
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十六)网络通信
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十六)网络通信
183 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(十六)网络通信
|
Linux 程序员 调度
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)驱动程序基石(中)
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)驱动程序基石
195 0
嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十五)驱动程序基石(中)