rk3288 使用函数获取设备树节点

LCD时序参数

对于不同的LCD控制器,不同的LCD有不同的参数配置,所以需要配置为不同的代码。
在LCD数据手册中有一个表格,说明了LCD的时序要求:
LCD时许要求

LCD极性的确定

在这里插入图片描述
可以看上图的虚线部分,在HSD的同步信号是低脉冲有效,VSD也一样低脉冲有效。
对应设备树中 hsync-active = <0>;vsync-active = <0>;
DE模式则是高电平有效 de-active = <1>;
时钟电平是下降沿有效 pixelclk-active = <0>;

LCD代码编写

在设备树里指定LCD参数

	framebuffer-mylcd {
			compatible = "100ask,lcd_drv";
	        pinctrl-names = "default";
			pinctrl-0 = <&mylcd_pinctrl>;
			backlight-gpios = <&gpio1 8 GPIO_ACTIVE_HIGH>;

            clocks = <&clks IMX6UL_CLK_LCDIF_PIX>,
                     <&clks IMX6UL_CLK_LCDIF_APB>;
            clock-names = "pix", "axi";
            
            display = <&display0>;							//这里指定了LCD使用哪个显示设备

			display0: display {								//这里定义了一个display0的显示设备
				bits-per-pixel = <24>;
				bus-width = <24>;

				display-timings {							//display0有display-timings属性,代表屏幕的时序配置
					native-mode = <&timing0>;				//native-mode指定了默认的timing时序

					 timing0: timing0_1024x768 {			//这里定义了一个timing0的时序
					 clock-frequency = <50000000>;			//这里开始是时序值
					 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>;					//这里开始是高电平有效还是低电平有效(电平极性)
					 vsync-active = <0>;
					 de-active = <1>;
					 pixelclk-active = <0>;
					 };

				};
			};            
	};

代码中使用设备树的顺序:

  1. 首先通过display节点找出display0
  2. 设置dispaly0里的共用属性
  3. 解析里面的timming

参考文件:
drivers\video\of_display_timing.c
drivers\video\fbdev\mxsfb.c

	struct device_node *display_np;
    struct device_node *timings_np;
	struct display_timings *timings = NULL;

    display_np = of_parse_phandle(pdev->dev.of_node, "display", 0);			//获取display节点

    /* get common info */
    ret = of_property_read_u32(display_np, "bus-width", &width);			//获取节点下的通用设置

    ret = of_property_read_u32(display_np, "bits-per-pixel", &bits_per_pixel);		//获取节点下的通用设置

    timings = of_get_display_timings(display_np);			//获取时序结构体

    timings_np = of_find_node_by_name(display_np, "display-timings");			//获取设备树的display-timings节点


    /* get clock from devicetree */
    clk_pix = devm_clk_get(pdev->dev, "pix");				//获取pix的结构体

    clk_axi = devm_clk_get(pdev->dev, "axi");				//获取axi的结构体

    /* set clock rate */
    clk_set_rate(clk_pix, 50000000); //PICOS2KHZ(fb_info->var.pixclock) * 1000U);	设置pix频率

    clk_prepare_enable(clk_pix);				//使能pix
    clk_prepare_enable(clk_axi);				//使能axi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

习惯就好zz

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

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

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

打赏作者

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

抵扣说明:

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

余额充值