zoukankan      html  css  js  c++  java
  • 高通LCD开发常见问题&分析

    reference :

    LCD driver的框架

    以msm8909为例。

    LCD命名规则

    例如:

    nt35521-720p-video
    nt35521-wxga-video
    nt35590-qvga-cmd
    otm8018b-fwvga-video
    ili9806e-fwvga-video_pixi445_tf
    hx8379c-tdt-fwvga-video
    ……
    

    名称 = LCD的IC型号+ 该driver下屏的分辨率+ MIPI接口+ 接口下的模式+ 屛厂供应商+ 项目名

    以上参数的含义:

    • 分辨率会有:720p,fwvga,wvga,hd……(分别指的是:720*1280856*480,1024*6001280*720

    • 供应商:truly,TFT,TDT,BYD……

    • LCD的接口一般又分为:dsi,dbi,dpi

    其中DSI MIPI接口,MIPI联盟推出的一种高速低耗接口,根据是否有缓存分为:

    • CMD:Command Mode

    • VDO:Video Mode

    MIPI

    对于MIPI下的接口,CMD对应MPU接口,而VDO接口是对应的RGB接口。在VDO模式下视频数据只能通过HS mode传输。

    MIPI很多参数是需要根据LCD的datasheet来计算的,其中HFP,HBP,VFP,VBF都是以同步信号(HSYNC和VSYNC)为基准计算。

    在同步信号之前为Front,在之后为Back。需要注意的是,这里并不是以有效像素为基准。

    关于DSI bit clock(MIPI)的计算,在dtsi中的参数描述为:qcom,mdss-dsi-panel-clockrate=<>,一般情况该值都不建议修改。

    因为SRC files文件会根据porch,resolution以及fps来计算。如果由于RF信号干扰或者其他情况需要更改的话,建议是从porch或者fps实现。

    LCD的fps一般都上限为60,正常使用时候一般设置为58,因为由于LCD panel range存在刷新率温度漂移情况,所以在dtsi中关键panel-framerate都不建议修改。

    Backlight

    LCD的开机在整个开机的时候是使用的是LK的initial code,只有在开机后睡眠唤醒后才会去调用kernel的参数。正常情况背光分为32阶,并且最大亮度设置为255(dtsi),针对背光还需要验证的是在开机关机休眠唤醒的时候,initial code和背光亮起的时候要搭配协调。否者会造成闪屏白屏等现象。

    其次,要注意LCD的背光芯片操作背光的方式,一般分为两种模式,一种是GPIO口直接操作的,一种是以PWM的MPP来操作的。对于GPIO操作的配置在mtp。dtsi中可以参考如下:

    &pmx_mdss {
        qcom,num-grp-pins = <2>;
        qcom,pins = <&gp 25>, <&gp 17>;
    };
    
    &mdss_dsi0 {
        qcom,dsi-pref-prim-pan = <&dsi_ili9806e_fwvga_video>;
        //qcom,dsi-pref-prim-pan = <&dsi_ili9806e_fwvga_video_tdt>;
        pinctrl-names = "mdss_default", "mdss_sleep";
        pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
        pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;
    
        // qcom,platform-bklight-en-gpio = <&msm_gpio 37 0>;
        qcom,platform-reset-gpio = <&msm_gpio 25 0>;
        qcom,platform-blk-ctrl-gpio = <&msm_gpio 17 0>;
        //modify by ke.li@tcl.com for LCD is ili9806e ,and the RST&backlight Ctrl had changed [End]--- 2015.8.28
    };
    

    而PWM的方式主要配置如下:

    mpp@a100 { /* MPP 2 */
        /* Backlight PWM */
        // qcom,mode = <1>; /* Digital output */
        // qcom,invert = <0>; /* Disable invert */
        // qcom,src-sel = <4>; /* DTEST1 */
        // qcom,vin-sel = <0>; /* VPH_PWR */
        // qcom,master-en = <1>; /* Enable MPP */
        status = "disabled";
    };
    

    而以上具体采用哪一种配置方法的选择是在本身dtsi中如下配置:

    qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_gpio";
    //qcom,mdss-dsi-bl-pmic-pwm-frequency = <33>;
    //qcom,mdss-dsi-bl-pmic-bank-select = <0>;
    //qcom,mdss-dsi-pwm-gpio = <&pm8909_mpps 2 0>;
    

    CABL

    说到背光的话,还有一个算法与之有关系,是CABL,在mtk也叫CABA。

    平台端的CABL功能算法是用于LCD背光灯相关计算,在更新灰阶前,处理出现不连续不均匀等的状况。当然该算法也可以回导致LCD出现灰阶部分会有波纹以及短暂的不连续的条纹情况。该配置是在system.prop中可以配置。在MTK是需要在perjectconfig中配置MTK_AAL_SUPPORT=Y.

    Initial code

    LCD还有很大的一块是initial code,这块主要是依靠FAE,因为不同的ic有不同的要求,当然有些是通用的,在这块initial code中,我们需要注意的是在集成数据的时候,要保证参数take进入的正确性,否则会造成不亮,蓝屏,白屏等问题。

    在MTK平台下,initial code是在driver中配置的,在qcom平台下是在dtsi中配置的。

    Initial code另外需要我们注意的是最后2个寄存器0x11和0x29。这是点亮屏幕最后的两个参数,正常情况下延迟会在150ms和50ms。其余寄存器写入值可以不需要延时。

    在灭屏的时候,通常会去先写0x28再写0x10,延迟应该和亮屏的2911对应。这是通常说的2810的power off模式。

    另外亮屏通常用的是lp mode,而灭屏用的是hig mode。

    Porch

    Proch是前后廊,用于描述切屏的数据,一般出现错误和误差的情况会有上、下部分出现亮稳横纹等情况。

    这是由于LCD显示的时候丢了几行数据造成的,根本原因是在LCD显示速度慢与主控写的速度,而两者没有使用一个叫Tearing effect out line的机制。

    关于porch的计算:

    img

    HFP:Horizontal Back Porch = left_margin

    水平后沿:在每行或者每列像素数据开始输出时要插入的像素时钟周期。

    HBP:Horizontal Front Porch = right_margin

    水平前沿:在每行或每列的像素结束到LCD行时钟输出脉冲之间的像素时钟。

    VBP: Vertical Back Porch = upper_margin

    垂直后沿:在垂直同步周期之后帧开头时的无效行数。

    VFP: Vertical Front Porch = lower_margin

    垂直前沿:本帧数据输出结束到下一个垂直同步周期开始之前的无效行数。

    Hsync:Hsync plus width = HPW

    行(水平)同步脉宽(单位是时钟周期)

    Vsync: Vertical plus width = VPW

    同理Vsync=VPW,垂直时钟周期。

    DSI Clock

    H-total = HorizontalActive + HorizontalFrontPorch + HorizontalBackPorch + HorizontalSyncPulse + HorizontalSyncSkew

    V-total = VerticalActive + VerticalFrontPorch + VerticalBackPorch + VerticalSyncPulse + VerticalSyncSkew

    Total pixel = H-total * V-total * 60(Hz通常都是这个,当然可以变).

    Bitclk = Total pixel * bpp(byte) *8/lane number(有几路mipi data lane).

    Byteclk = bitclk/8

    Dsipclk(Dsi pixel clock) = (Byteclk * lane number)/bpp(byte) = Total pixel * 8

    Byteclk = pclk * pixel depth / lane number

    ESD Check

    ESD Check功能用于检测静电的干扰,在有静电干扰的情况LCD会出现白屏,横纹等临时问题,即在休眠唤醒屏幕后能回复正常。ESD check主要的作用是检测是否受到静电干扰,并且在受到干扰的时候reset LCD使之回复正常。

    在配置的时候在dtsi中,其中的配置如下:

    - qcom,esd-check-enabled:                   Boolean used to enable ESDrecovery feature.
    
    - qcom,mdss-dsi-panel-status-command:       A byte stream formed by multiple dcspackets based on
                                            qcomdsi controller protocol, to read the panel status.
                                            Thisvalue is used to kick in the ESD recovery.
                                            byte0: dcs data type
                                            byte1: set to indicate this is an individual packet
                                                     (no chain)
                                            byte2: virtual channel number
                                            byte3: expect ack from client (dcs read command)
                                            byte4: wait number of specified ms after dcs command
                                                     transmitted
                                            byte5, 6: 16 bits length in network byte order
                                            byte7 and beyond: number byte of payload
                                            
    - qcom,mdss-dsi-panel-status-command-mode:    Stringthat specifies the ctrl state for reading the panel status.
                                            "dsi_lp_mode"= DSI low power mode
                                            "dsi_hs_mode"= DSI high speed mode
                                            
    - qcom,mdss-dsi-panel-status-check-mode:    Specifies the panel status check method for ESD recovery.
                                            "bta_check"= Uses BTA to check the panel status
                                            "reg_read"= Reads panel status register to check the panel status
                                            "te_signal_check"= Uses TE signal behaviour to check the panel status
                                            
    - qcom,mdss-dsi-panel-status-value:     Specifies the value of the panel statusregister when the panel is in good state.
    

    LCD DTSI中各参数详细解释

    属性

    描述

    代码示例

    参数详解

     qcom,mdss-dsi-panel-name  用作面板描述名称的字符串。 qcom,mdss-dsi-panel-name = "tianma(otm1283a) 720p video mode dsi panel";  根据您的面板名称进行定制
    qcom,mdss-dsi-panel-controller 指定此面板映射到的DSIcontroller的句柄。 qcom,mdss-dsi-panel-controller =<&mdss_dsi0>;  保持不变
     qcom,mdss-dsi-panel-type 指定面板操作模式。

    “dsi_video_mode” = 启用视频模式

    “dsi_cmd_mode” = 启用命令模式
    qcom,mdss-dsi-panel-type = "dsi_video_mode";  根据您的面板规格进行定制
    qcom,mdss-dsi-panel- destination 指定面板目标显示的字符串。

    "display_1" = DISPLAY_1

    "display_2" = DISPLAY_2
    qcom,mdss-dsi-panel-destination = "display_1";  保持不变
     qcom,mdss-dsi-bpp 指定面板的每像素位数。

    3  = 适用于 rgb111

    8  = 适用于 rgb332

    12 = 适用于 rgb444

    16 = 适用于 rgb565

    18 = 适用于 rgb666

    24 = 适用于 rgb888
     qcom,mdss-dsi-bpp= <24>;  根据您的面板规格进行定制
    qcom,mdss-dsi-panel-framerate 指定面板的帧率。60 = 每秒 60 帧(默认值) qcom,mdss-dsi-panel-framerate =<60>; 根据您的面板规格进行定制
    qcom,mdss-dsi-panel-width  指定面板宽度(单位:像素)。 qcom,mdss-dsi-panel-width =<720>; 根据您的面板规格进行定制
    qcom,mdss-dsi-panel-height  指定面板高度(单位:像素)。 qcom,mdss-dsi-panel-height =<1280>; 根据您的面板规格进行定制
    qcom,mdss-dsi-h-back-porch  水平后沿值(单位:像素)。 qcom,mdss-dsi-h- back-porch =<100>; 根据您的面板规格进行定制
    qcom,mdss-dsi-h-front-porch 水平前沿值(单位:像素)。 qcom,mdss-dsi-h- front-porch = <52>; 根据您的面板规格进行定制
    qcom,mdss-dsi-h-pulse-width 水平脉冲宽度。 qcom,mdss-dsi-h- pulse-width = <24>; 根据您的面板规格进行定制
    qcom,mdss-dsi-h-sync-skew 水平同步倾斜值。0 = 默认值。 qcom,mdss-dsi-h- sync-skew = <0>; 保持不变
    qcom,mdss-dsi-v-back-porch 垂直后沿值(单位:像素)。 qcom,mdss-dsi-v- back-porch = <20>; 根据您的面板规格进行定制
    qcom,mdss-dsi-v-front-porch 垂直前沿值(单位:像素)。 qcom,mdss-dsi-v- front-porch = <8>; 根据您的面板规格进行定制
    qcom,mdss-dsi-v-pulse-width 垂直脉冲宽度。 qcom,mdss-dsi-v- pulse-width = <4>; 根据您的面板规格进行定制
    qcom,mdss-dsi-h-left-border 水平左边框(单位:像素)。0 = 默认值 qcom,mdss-dsi-h-left-border = <0>; 保持不变
    qcom,mdss-dsi-h-right-border 水平右边框(单位:像素)。0 = 默认值 qcom,mdss-dsi-h- right-border = <0>;  保持不变
    qcom,mdss-dsi-v-top-border 垂直上边框(单位:像素)。0 = 默认值 qcom,mdss-dsi-v- top-border = <0>; 保持不变
    qcom,mdss-dsi-v-bottom-border 垂直下边框(单位:像素)。0 = 默认值 qcom,mdss-dsi-v- bottom-border =<0>; 保持不变
    qcom,mdss-dsi-border-color 如有边框,定义边框颜色值。0 = 默认值。 qcom,mdss-dsi-border-color = <0>; 保持不变
    qcom,mdss-dsi-panel-timings 长度为 12 的数组,用于指定面板的PHY 定时设置。 qcom,mdss-dsi-panel-timings = [92 1A 12 00 3E 42 161E 14 03 04 00]; 开始尝试启动此面板时保持不变;如果面板启动失败,请创建用例,帮助微调参数
    qcom,mdss-dsi-virtual- channel-id 指定虚拟频道标识符。0 = 默认值。 qcom,mdss-dsi-virtual-channel-id =<0>;  保持不变
    qcom,mdss-dsi-stream 指定要使用的数据包流。

    0 = 流 0(默认值)

    1 = 流 1
    qcom,mdss-dsi-stream = <0>;  保持不变
     qcom,mdss-dsi-on-command 长度可变的数组,用于列举面板的 init命令。

    关于格式,请参考 kerneldriversvideomsmmdssmdss_dsi.h 中的 dsi_cmd_desc 结构定义。

    由多个基于 qcom DSI 控制器协议的dcs 数据包构成的字节流。

    字节 0 – DCS 数据类型字节

    1 – 设置此字节表示这是独立数据包(无链)字节

    2 – 虚拟频道编号字节

    3 – 需要来自客户端的确认(dcs 读取命令)字节

    4 – 在传输 dcs 命令后等待指定的毫秒数字节

    5、6 – 按网络字节顺序列出的16 位长度字节

    7 及以上 – 净荷的字节数
     qcom,mdss-dsi-on- command =[ 32 01 00 00 00 0002 00 00 29 01 00 00 10 00 02 FF 99];  根据您的面板规格进行定制
     qcom,mdss-dsi-off-command  长度可变的数组,用于列举面板关闭 命令。 qcom,mdss-dsi-off-command =[ 05 01 00 00 32 02 28 00 05 01 00 00 7802 10 00];  根据您的面板规格进行定制
     qcom,mdss-dsi-on-command-state 指定用于发送 ON 命令的控制状态的字符串。

    "dsi_lp_mode" = DSI 低功率模式(默认值)

    "dsi_hs_mode" = DSI 高速模式
     qcom,mdss-dsi-on- command-state ="dsi_lp_mode";  根据您的面板规格进行定制
     qcom,mdss-dsi-off-command- state 指定用于发送 OFF 命令的控制状态的字符串。

    "dsi_lp_mode" = DSI 低功率模式(默认值)

    "dsi_hs_mode" = DSI 高速模式
     qcom,mdss-dsi-off- command-state ="dsi_hs_mode";  根据您的面板规格进行定制
     qcom,mdss-dsi-color-order 指定 R、G 和 B 通道排序。

    "rgb_swap_rgb" =DSI_RGB_SWAP_RGB(默认值)

    "rgb_swap_rbg" =DSI_RGB_SWAP_RBG

    "rgb_swap_brg" = DSI_RGB_SWAP_BRG

    "rgb_swap_grb" =
     qcom,mdss-dsi-color-order = "rgb_swap_rgb";  根据您的面板规格进行定制
    DSI_RGB_SWAP_GRB

    "rgb_swap_gbr" =DSI_RGB_SWAP_GBR
     qcom,mdss-dsi-underflow-color 指定面板下溢颜色的控制器设置。0xff = 默认值。 qcom,mdss-dsi-underflow-color =<0xff>;  保持不变
     qcom,mdss-dsi-h-sync-pulse 指定面板的脉冲模式选项。

    0 = 不在 vs/ve 数据包之后发送hsa/he(默认值)

    1 = 在 vs/ve 数据包之后发送 hsa/he
     qcom,mdss-dsi-h-sync-pulse = <1>;  根据您的面板规格进行定制
    qcom,mdss-dsi-hfp-power- mode 用于确定水平前沿(HFP)空白期的DSI 通道状态的布尔值  qcom,mdss-dsi-hfp-power-mode; 根据您的面板规格进行定制
    qcom,mdss-dsi-hbp-power- mode 用于确定水平后沿(HBP)空白期期间的 DSI 通道状态的布尔值。  qcom,mdss-dsi-hbp-power-mode; 根据您的面板规格进行定制
    qcom,mdss-dsi-hsa-power- mode 用于确定水平同步活跃(HSA)模式 期间的 DSI 通道状态的布尔值。 qcom,mdss-dsi-hsa-power-mode; 根据您的面板规格进行定制

    qcom,mdss-dsi-bllp-eof-Power- mode

    用于确定低功率空白期(BLLP)EOF 模式期间的 DSI 通道状态的布尔值。 qcom,mdss-dsi-bllp-eof-power-mode 根据您的面板规格进行定制
    qcom,mdss-dsi-bllp-power- mode  用于确定低功率空白期(BLLP)模式 期间的 DSI 通道状态的布尔值。 qcom,mdss-dsi-bllp-power-mode;  根据您的面板规格进行定制
     qcom,mdss-dsi-traffic-mode 指定面板流量模式。

    "non_burst_sync_pulse" = 使用同步脉冲的非突发流量(默认值)。

    "non_burst_sync_event" = 使用同步 启动事件的非突发流量。

    "burst_mode" = 突发模式。
     qcom,mdss-dsi-traffic-mode = "burst_mode"  根据您的面板规格进行定制
    qcom, mdss-dsi-lane-0-state 指定是否启用数据通道 0 的布尔值。 qcom, mdss-dsi-lane-0-state 根据您的面板规格进行定制
     qcom, mdss-dsi-lane-1-state  指定是否启用数据通道 1 的布尔值。  qcom, mdss-dsi-lane-1-state  根据您的面板规格进行定制
     qcom, mdss-dsi-lane-2-state  指定是否启用数据通道 2 的布尔值。  qcom, mdss-dsi-lane-2-state;  根据您的面板规格进行定制
     qcom, mdss-dsi-lane-3-state  指定是否启用数据通道 3 的布尔值。  qcom, mdss-dsi-lane-3-state;  根据您的面板规格进行定制
     qcom, mdss-dsi-t-clk-post  指定模式切换后的字节时钟周期。  qcom, mdss-dsi-t- clk-post = <0x04>;

    开始尝试启动此面板 时保持不变;如果面 板启动失败,请创建 用例,帮助微调参数

    qcom, mdss-dsi-t-clk-pre 指定模式切换前的字节时钟周期。 qcom, mdss-dsi-t-c-pre = <0x1C>; 开始尝试启动此面板时 保持不变;如果面板启
     qcom, mdss-dsi-dma-trigger 指定用于 DMA 路径的触发机制。"none" = 无触发

    "trigger_te" = 断开用于触发的检查信 号线

    "trigger_sw" = 由软件触发(默认设置)

    "trigger_sw_seof" = 软件触发和帧触发的开始/结束。

    "trigger_sw_te" = 软件触发和 TE
     qcom, mdss-dsi-dma-trigger = "trigger_sw";  保持不变
     qcom, mdss-dsi-mdp-trigger 指定用于 MDP 路径的触发机制。

    "none" = 无触发

    "trigger_te" = 断开用于触发的检查信号线

    "trigger_sw" = 由软件触发(默认设置)

    "trigger_sw_te" = 软件触发和 TE
     qcom, mdss-dsi-mdp-trigger = "none";  保持不变
     qcom, mdss-dsi-bl-pmic- control-type 指定对此面板实施背光控制的字符串。  

    qcom, mdss-dsi-bl- pmic-control-type = "bl_ctrl_wled";

     根据您的面板规格进行定制
    "bl_ctrl_pwm" = 由 PWM GPIO 控制的背光。

    "bl_ctrl_wled" = 由 WLED 控制的背光。

    "bl_ctrl_dcs" = 由 DCS 命令控制的背光。

    其他:未知背光控制。(默认值)
    qcom, mdss-dsi-reset- sequence 列出重置 GPIO 值和睡眠序列的数组

    每个命令具有下面定义的格式:

    --> 重置 GPIO 值

    --> 睡眠值(毫秒)
    qcom, mdss-dsi-reset-sequence =<1 2>, <0 10>, <110>;  根据您的面板规格进行定制
    qcom, mdss-dsi-bl-min-level 指定面板支持的最低背光级别。0 = 默认值。 qcom, mdss-dsi-bl-min-level = <1>;  保持不变
    qcom, mdss-dsi-bl-max-level 指定面板支持的最高背光级别。255 = 默认值。 qcom, mdss-dsi-bl- max-level = <255>; 保持不变
     qcom, mdss-dsi-lane-map 指定数据通道交换配置。

    "lane_map_0123" = <0 1 2 3>(默认值)

    "lane_map_3012" = <3 0 1 2>

    "lane_map_2301" = <2 3 0 1>

    "lane_map_1230" = <1 2 3 0>

    "lane_map_0321" = <0 3 2 1>

    "lane_map_1032" = <1 0 3 2>

    " lane_map_2103" = <2 1 0 3>

    "lane_map_3210" = <3 2 1 0>
     qcom, mdss-dsi-lane-map = "lane_map_0123";  根据您的面板规格进行定制

    附录:Mipi中CMD和VDO模式的区别

    Mipi两种应用模式:VDO(video mode)是视频模式,CMD是commond mode命令模式

    与传统工作模式RGB接口相似,由于不使用专用的数据信号传输同步,控制信号和RGB数据都以mipi总线传输,主机需要定期刷新显示器,显示器就不需要帧缓冲器。

    Dsi虽然不需要帧缓冲器,但主机定期以告诉模式发送dsi视频文报,消耗了大量的CPU资源。

    所以一般在选择driver的时候根据项目要求以下情况来选择:

    IC型号——MIPI接口——SYNC模式——分辨率——平台——模组厂商

  • 相关阅读:
    使用NBU进行oracle异机恢复
    mycat偶尔会出现JVM报错double free or corruption并崩溃退出
    exp导出数据时丢表
    service_names配置不正确,导致dg创建失败
    XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
    HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
    java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类
    【JAVA集合框架一 】java集合框架官方介绍 Collections Framework Overview 集合框架总览 翻译 javase8 集合官方文档中文版
    java内部类深入详解 内部类的分类 特点 定义方式 使用
    再谈包访问权限 子类为何不能使用父类protected方法
  • 原文地址:https://www.cnblogs.com/schips/p/qualcomm_lcd_develop_faq.html
Copyright © 2011-2022 走看看