【Linux驱动开发】LCD

本文详细介绍了Linux内核中帧缓冲fb的工作原理,以及如何通过设备树配置LCD驱动。fb_info结构体是LCD驱动的核心,包含了设备属性和操作。设备树中定义了LCD的数据线、控制线、背光PWM等配置,以适应不同分辨率的LCD屏幕。此外,还展示了如何设置LCD的时序信息,确保正确显示。
摘要由CSDN通过智能技术生成

framebuffer,帧缓冲fb是一种机制,将系统中所有跟显示有关的硬件和软件集合起来,虚拟出一个fb设备,LCD驱动生成/dev/fbx的设备,应用程序通过访问/dev/fbx设备即可以访问LCD。

不同分辨率的LCD屏幕eLCDIF控制器驱动代码相同,只需要修改好对应的屏幕参数。

Linux内核将所有framebuffer抽象为一个fb_info结构体,fb_info包含framebuffer设备的完整属性和操作集合,编写LCD驱动就是构建fb_info并向系统注册fb_info的过程。

设备树文件内容

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

&iomuxc {   
 	imx6ul-evk {
        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  0x51
				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  0x51
				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  0x51
			>;
		};

		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
			>;
		};

		pinctrl_pwm1: pwm1grp {
			fsl,pins = <
				MX6UL_PAD_GPIO1_IO08__PWM1_OUT   0x110b0
			>;
		};
    };
};

&iomuxc_snvs {
    imx6ul-evk {
		pinctrl_lcdif_reset: lcdifresetgrp {
            fsl,pins = <
                /* used for lcd reset */
                MX6ULL_PAD_SNVS_TAMPER9__GPIO5_IO09  0x49
                >;
        };
    };
};

&pwm1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_pwm1>;
	status = "okay";
};

&lcdif {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_lcdif_dat
		         &pinctrl_lcdif_ctrl
                 &pinctrl_lcdif_reset>;
	display = <&display0>;        
	status = "okay";

        display0: display {               /* LCD 属性信息 */
                bits-per-pixel = <16>;    /* 一个像素占用几个 bit */
                bus-width = <24>;         /* 总线宽度 */

                display-timings {
                        native-mode = <&timing0>;     /* 时序信息 */
                        timing0: timing0 {
                        clock-frequency = <35500000>; /* LCD 像素时钟,单位 Hz */
                        hactive = <800>;              /* LCD X 轴像素个数 */
                        vactive = <480>;              /* LCD Y 轴像素个数 */
                        hfront-porch = <210>;         /* LCD hfp 参数 */
                        hback-porch = <46>;           /* LCD hbp 参数 */
                        hsync-len = <20>;             /* LCD hspw 参数 */
                        vback-porch = <23>;           /* LCD vbp 参数 */
                        vfront-porch = <22>;          /* LCD vfp 参数 */
                        vsync-len = <3>;              /* LCD vspw 参数 */

                        hsync-active = <0>;           /* hsync 数据线极性 */
                        vsync-active = <0>;           /* vsync 数据线极性 */
                        de-active = <1>;              /* de 数据线极性 */
			            /* rgb to hdmi: pixelclk-ative should be set to 1 */
                        pixelclk-active = <0>;        /* clk 数据线极性 */
                        };
                };
        };
};
  • 节点backlight,描述Linux系统使用那个pwm控制LCD背光
  • 子节点pinctrl_lcdif_dat,为RGB LCD的24根数据线配置项。
  • 子节点pinctrl_lcdif_ctrl,RGB LCD的4根控制线配置项,包括CLK、ENABLE、VSYNC和 HSYNC。
  • 子节点pinctrl_pwm1,LCD背光PWM引脚配置项。LCD的背光IO尽量和半导体厂商的官方开发板一致。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奶油芝士汉堡包

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值