DeviceDriver(十一):LCD驱动(设备树)

LCD非设备树驱动框架参考:

https://blog.csdn.net/qq_34968572/article/details/89922596

一:设备树文件分析

1、公用文件imx6ull.dtsi

lcdif: lcdif@021c8000 {
    compatible = "fsl,imx6ul-lcdif", "fsl,imx28-lcdif";
    reg = <0x021c8000 0x4000>;
    interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&clks IMX6UL_CLK_LCDIF_PIX>,
        <&clks IMX6UL_CLK_LCDIF_APB>,
        <&clks IMX6UL_CLK_DUMMY>;
    clock-names = "pix", "axi", "disp_axi";
    status = "disabled";
};

lcdif节点为imx6ull芯片的板子所共有的并不完整,像屏幕参数这些需要根据不同硬件平台去添加,分别有各自对应的dts文件。

根据lcdif节点compatible属性“fsl,imx6ul-lcdif", "fsl,imx28-lcdif”可以找到imx6ull的LCD驱动文件: drivers/video/fbdev/mxsfb.c

static const struct of_device_id mxsfb_dt_ids[] = {
	{ .compatible = "fsl,imx23-lcdif", .data = &mxsfb_devtype[0], },
	{ .compatible = "fsl,imx28-lcdif", .data = &mxsfb_devtype[1], },
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, mxsfb_dt_ids);

... ...

static struct platform_driver mxsfb_driver = {
	.probe = mxsfb_probe,
	.remove = mxsfb_remove,
	.shutdown = mxsfb_shutdown,
	.id_table = mxsfb_devtype,
	.driver = {
		   .name = DRIVER_NAME,
		   .of_match_table = mxsfb_dt_ids,
		   .pm = &mxsfb_pm_ops,
	},
};

2、LCD屏幕IO配置

 pinctrl_lcdif_dat: lcdifdatgrp {
	fsl,pins = <
		MX6UL_PAD_LCD_DATA00__LCDIF_DATA00  0x79
		MX6UL_PAD_LCD_DATA01__LCDIF_DATA01  0x79
		MX6UL_PAD_LCD_DATA02__LCDIF_DATA02  0x79
		MX6UL_PAD_LCD_DATA03__LCDIF_DATA03  0x79
		MX6UL_PAD_LCD_DATA04__LCDIF_DATA04  0x79
		MX6UL_PAD_LCD_DATA05__LCDIF_DATA05  0x79
		MX6UL_PAD_LCD_DATA06__LCDIF_DATA06  0x79
		MX6UL_PAD_LCD_DATA07__LCDIF_DATA07  0x79
		MX6UL_PAD_LCD_DATA08__LCDIF_DATA08  0x79
		MX6UL_PAD_LCD_DATA09__LCDIF_DATA09  0x79
		MX6UL_PAD_LCD_DATA10__LCDIF_DATA10  0x79
		MX6UL_PAD_LCD_DATA11__LCDIF_DATA11  0x79
		MX6UL_PAD_LCD_DATA12__LCDIF_DATA12  0x79
		MX6UL_PAD_LCD_DATA13__LCDIF_DATA13  0x79
		MX6UL_PAD_LCD_DATA14__LCDIF_DATA14  0x79
		MX6UL_PAD_LCD_DATA15__LCDIF_DATA15  0x79
		MX6UL_PAD_LCD_DATA16__LCDIF_DATA16  0x79
		MX6UL_PAD_LCD_DATA17__LCDIF_DATA17  0x79
		MX6UL_PAD_LCD_DATA18__LCDIF_DATA18  0x79
		MX6UL_PAD_LCD_DATA19__LCDIF_DATA19  0x79
		MX6UL_PAD_LCD_DATA20__LCDIF_DATA20  0x79
		MX6UL_PAD_LCD_DATA21__LCDIF_DATA21  0x79
		MX6UL_PAD_LCD_DATA22__LCDIF_DATA22  0x79
		MX6UL_PAD_LCD_DATA23__LCDIF_DATA23  0x79
	>;
};

pinctrl_lcdif_ctrl: lcdifctrlgrp {
	fsl,pins = <
		MX6UL_PAD_LCD_CLK__LCDIF_CLK	    0x79
		MX6UL_PAD_LCD_ENABLE__LCDIF_ENABLE  0x79
		MX6UL_PAD_LCD_HSYNC__LCDIF_HSYNC    0x79
		MX6UL_PAD_LCD_VSYNC__LCDIF_VSYNC    0x79
	>;
};

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

子节点pinctrl_lcdif_dat为RGBLCD的24根数据线配置项

子节点pinctrl_lcdif_ctrl为RBGLCD的4根控制线配置项包括CLK

子节点pinctrl_pwm1为LCD背光PWM引脚的配置项

3、LCD屏幕参数节点信息

&lcdif {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_lcdif_dat           /* 使用到的 IO */ 
		     &pinctrl_lcdif_ctrl;

	display = <&display0>;
	status = "okay";

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

		display-timings {                     /* 时序信息 */
			native-mode = <&timing0>;
			timing0: timing0 {
			clock-frequency = <51200000>;
			hactive = <1024>;
			vactive = <600>;
			hfront-porch = <160>;
			hback-porch = <140>;
			hsync-len = <20>;
			vback-porch = <20>;
			vfront-porch = <12>;
			vsync-len = <3>;

			hsync-active = <0>;               /* hsync 数据线极性 */
			vsync-active = <0>;               /* vsync 数据线极性 */
			de-active = <1>;                  /* de 数据线极性 */
			pixelclk-active = <0>;            /* clk 数据线先极性 */  
			};
		};
	};
};

4、LCD背光

(1)PWM驱动

pwm1: pwm@02080000 {
	compatible = "fsl,imx6ul-pwm", "fsl,imx27-pwm";
	reg = <0x02080000 0x4000>;
	interrupts = <GIC_SPI 83 IRQ_TYPE_LEVEL_HIGH>;
	clocks = <&clks IMX6UL_CLK_PWM1>,
			<&clks IMX6UL_CLK_PWM1>;
	clock-names = "ipg", "per";
	#pwm-cells = <2>;
};

搜索compatible属性就可以找到linux内核中pwm的驱动

(2)pwm节点添加

在对应的开发板设备树dts文件下追加:

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

(3)连接背光节点到linux

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

二:编译调试

1、开启Linux启动时的小企鹅logo

2、设置LCD作为终端控制台

(1)修改uboot的bootargs:打开两个console

setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.250:
/home/zuozhongkai/linux/nfs/rootfs ip=192.168.1.251:192.168.1.250:192.168.1.1:255.255.255.0::eth0:
off'

(2)修改/etc/inittab

添加:

tty1::askfirst:-/bin/sh

启动后可输入  echo hello linux >/dev/tty1

3、调节背光

echo n > brightness

其中n为亮度级别最大为7

猜你喜欢

转载自blog.csdn.net/qq_34968572/article/details/104796182