imx6 LCD 参数配置(lvds为例)

目前imx6的BSP开发中,lvds的参数配置一般在两个地方:
1. uboot的CMDLINE的参数设置,形如:
video=mxcfb0:dev=ldb,bpp=32
2. uboot板级代码中对struct display_info_t的配置,形如:

static struct display_info_t const displays[] = {{
    .bus    = -1,
    .addr   = 0,
    .pixfmt = IPU_PIX_FMT_LVDS666,
    .detect = NULL,
    .enable = NULL,
    .mode   = {
        .name           = "wvga-lvds",
        .refresh        = 60,
        .xres           = 800,
        .yres           = 480,
        .pixclock       = 30066,
        .left_margin    = 88,//HBPD   
        .right_margin   = 140,//HFPD  
        .upper_margin   = 31,//VBPD
        .lower_margin   = 10, //VFBD 
        .hsync_len      = 28,//HSPW 
        .vsync_len      = 4,//VSPW  
        .sync           = FB_SYNC_EXT,
        .vmode          = FB_VMODE_NONINTERLACED
        }
}}

3.kernel中设备树对ldb的配置,形如:

&ldb {
    lvds-channel@0 {
        fsl,data-mapping = "spwg";
        fsl,data-width = <24>;
        primary;
        status = "okay";

        display-timings {
            native-mode = <&timing0>;
            timing0: claa080na23 {
                clock-frequency = <33260000>;
                hactive = <800>;
                vactive = <480>;
                hback-porch = <88>;
                hfront-porch = <140>;
                vback-porch = <31>;
                vfront-porch = <10>;
                hsync-len = <28>;
                vsync-len = <4>;
            };
        };
    };
};

下面几篇博客对lcd基础以及imx6相关方面的内容讲的都十分详细:
1. LCD参数解释及计算
2. LCD驱动中pixclock的计算
3. imx6 android4.3 bsp开发实录之一lvds、HDMMI输出显示
4. Kernel源码中文档:
Documentation/devicetree/bindings/video/fsl,ldb.txt
Documentation/devicetree/bindings/fb/fsl_ipuv3_fb.txt
Documentation/devicetree/bindings/video/display-timing.txt

我这里对以上内容进行总结,并结合开发经验,对我们需要进行的配置项进行下归纳说明:

一. lcd相关参数说明:

下图必不可少:
这里写图片描述
具体参数(不同datasheet中定义名称略有差别):
1. VBP(vertical back porch):
表示在一帧图像开始时,垂直同步信号以后的无效的行数,
对应驱动/设备树中的upper_margin/vback-porch;
2. VFP(vertical front porch):
表示在一帧图像结束后,垂直同步信号以前的无效的行数,
对应驱动/设备树中的lower_margin/vfront-porch;
3. VSPW(vertical sync pulse width):
表示垂直同步脉冲的宽度,用行数计算,
对应驱动/设备树中的vsync_len/vsync-len;
4. HBP(horizontal back porch):
表示从水平同步信号开始到一行的有效数据开始之间的VCLK的个数,
对应驱动/设备树中的left_margin/hback-porch;
5. HFP(horizontal front porth):
表示一行的有效数据结束到下一个水平同步信号开始之间的VCLK的个数,
对应驱动/设备树中的right_margin/hfront-porch;
6. HSPW(horizontal sync pulse width):
表示水平同步信号的宽度,用VCLK计算,
对应驱动/设备树中的hsync_len/hsync-len;

以上都是无效显示区域,下面两个是我们lcd正真有效的显示区域,即分辨率:
7. VDP(vertical display period):
表示垂直显示有效区域,对应驱动/设备树中的对应yres/hactive
8. HDP(horizontal display period):
表示水平显示有效区域,对应驱动/设备树中的对应xres/vactive

此外还有两个时钟相关参数:
DOTCLK frequency(设备树中的clock-frequency)和驱动中的pixclock
DOTCLK在datasheet中能查阅到,它与pixclock的关系是:
pixclock = 1000000 / DOTCLK ,启动DOTCLK单位是MHz,pixclock单位是皮秒,例如:
若DOTCLK为33.26MHz,pixclock即为30066ps = 30.066ns

关于以上6个无效显示区域的配置,是根据datasheet中的Video Signal Timing来设置的,datasheet中还有两个参数VP和HP,即水平方向总长和垂直方向总长,他们与上述8个参数关系是:
VP = VBP + VDP + VFP + VSPW
HP = HBP + HDP + HFP + HSPW
若datasheet中没有这些参数的type值,而且根据时序图也无法计算出来,
就只能在min和max值之间进行选择尝试,注意:这8个值都非0,并且一定遵循上述2个公式
还有一点需要注意(不是很确定,看到有一个datasheet是这么定义的):
VSPW(min) < VSPW < VBP
HSPW(min) < HSPW < HBP

二. 设备树中的配置:

  1. display-timings中的参数例如clock-frequency ,hactive ,vactive,hback-porch 等等在上面已经描述过了,经过查阅datasheet和调试,即可完成

  2. fsl,data-mapping和fsl,data-width的配置:
    fsl,data-mapping: Should be “spwg” or “jeida”.
    This describes how the color bits are laid out in the serialized LVDS signal.
    fsl,data-width: Should be <18> or <24>

data-mapping具体也要根据datasheet来设置,”spwg” 和 “jeida”遵循下图规则:
这里写图片描述

3.mode的选择:

/*
 *    "ldb=spl0/1"       --      split mode on DI0/1
 *    "ldb=dul0/1"       --      dual mode on DI0/1
 *    "ldb=sin0/1"       --      single mode on LVDS0/1
 *    "ldb=sep0/1"       --      separate mode begin from LVDS0/1
 *
 *    there are two LVDS channels(LVDS0 and LVDS1) which can transfer video
 *    datas, there two channels can be used as split/dual/single/separate mode.
 *
 *    split mode means display data from DI0 or DI1 will send to both channels
 *    LVDS0+LVDS1.
 *    dual mode means display data from DI0 or DI1 will be duplicated on LVDS0
 *    and LVDS1, it said, LVDS0 and LVDS1 has the same content.
 *    single mode means only work for DI0/DI1->LVDS0 or DI0/DI1->LVDS1.
 *    separate mode means you can make DI0/DI1->LVDS0 and DI0/DI1->LVDS1 work
 *    at the same time.
 */

根据如上说明,uboot参数中可以配置ldb的这四种模式,并且在设备树中,对于单通道和双通道也有以下配置:
- split-mode: Provide this bool property if your board uses LDB split
mode to drive a high resolution display, say 1080P@60. In this
mode, two LVDS channels will drive one display.
- dual-mode: Provide this bool property if your board uses LDB dual
mode to drive two displays. In this mode, one display engine will
drive two displays which have the same timings and display content.

对于大分辨率双通道lvds来说,需要配置设备树中:
lvds属性split-mode,
并且clock-frequency为datasheet中DCLK×2
还需要在uboot参数中添加:
ldb=spl0/1

我们项目中即将使用分辨率为1920*720的双通道lvds,待我验证完成以后,会对此博客进行详细说明和补充

  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值