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>;
};
};
};
};
代码中使用设备树的顺序:
- 首先通过display节点找出display0
- 设置dispaly0里的共用属性
- 解析里面的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