Android Qcom lcd display 学习

Posted bobuddy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android Qcom lcd display 学习相关的知识,希望对你有一定的参考价值。

LCD的结构
TFT-LCD屏幕构造组成原理
android LCD(一):LCD基本原理篇
LCD: 奇景光电 (hx8399) 、敦泰 (ft8719) 、京东方 、联咏等IC厂商
由于TFT-LCD(TFT Thin Film Transistors 薄膜晶体管)具有体积小,重量轻,低辐射,低耗电量,全彩化等优点,因此在各类显示器材上得到了广泛的应用,一般TFT用WLED来做背光,OLED是自发光的,背光电路由屏上的驱动IC提供。

上偏光片 :        和下偏光片共同配合呈垂直角度
彩色滤光片:     红蓝绿三基色上色作用
液晶:             液晶分子受TFT控制,扭转角度影响光线透过率从而控制像素的亮度,影响灰阶(常用8位控制器)
                        256级灰度控制,RGB三原色就是256X256X256 = 1677216种色彩,国际主要10位控制器
TFT基板:         控制液晶扭转,电压变化控制扭转度数由主要有driver ic控制
下偏光板:      使背光传出光线方向一致传向
LCD背光板:     为屏显提供基本光源

LCD相关参数
LCD主流显示接口介绍
LCD开发常见问题&分析
LCD参数解释及刷新率计算
SM7250(高通5G)平台LCD bringup

Proch是值前后廊,用于描述切屏的数据,一般出现错误和误差的情况会有上、下部分出现亮稳横纹等情况,单位为像素时钟周期,一般datasheet中都有Min Type Max的要求或者标准。

HBP:Horizontal Back Porch = left_margin
水平后沿:在每行或者每列像素数据开始输出时要插入的像素时钟周期。
HFP:Horizontal Front Porch = right_margin
水平前沿:在每行或每列的像素结束到LCD行时钟输出脉冲之间的像素时钟。

VBP:Vertical Back Porch = upper_margin
垂直后沿:在垂直同步周期之后帧开头时的无效行数。
VFP:Vertical Front Porch = lower_margin
垂直前沿:本帧数据输出结束到下一个垂直同步周期开始之前的无效行数。

HSync:Hsync plus width = HPW
行(水平)同步脉宽(单位是时钟周期),VSync同理垂直同步脉宽

BPP = BPP_Format * 8 (bytes/pixel)
HTotal = HActive + HFP + HBP + HSync
VTotal = VActive  + VFP + VBP + VSync
MipiCLK = HTotal * VTotal * FPS * BPP / LaneNumber / 2
PixelCLK = MipiCLK / BPP * LaneNumber * 2 = HTotal * VTotal * FPS (类似与Camera中的FrameLength * LineLength * FPS)

LCD的工作模式主要分为Video 以及Command Mode,两种模式处理的框架亦有差异,上述的概念主要是基于Video模式。
Video Mode 为实时显示数据流通过驱动IC直接显示到lcd上, 类似RGB同步屏幕, Video默认是不使用TE(Tearing effect out line)引脚。

Command Mode为数据先更新到ram中, 再由ram刷新到lcd上, 带有FrameBuffer; ram大小可为一帧的1/2或1/3, 通过平台压缩数据, 较少的数据流输入能减少功耗, 再通过IC解压能实现较高的分辨率; 同时由于RAM的存在,可能是出现显示速度慢于主控写的速度而丢失几行数据的情况,所以区别与Video会使用TE引脚的处理机制,使用TE引脚要注意对照硬件原理图配置GPIO Function为mdp_vsync。

dtsi可通过执行device/qcom/common/display/tools下的perl parser.pl解析xml生产dtsi

qcom,mdss-dsi-display-timings                                         
                   timing@0                                           配置刷新率,支持类似60fps/90fps
                        qcom,mdss-dsi-video-mode;                       video模式                                
                        qcom,mdss-dsi-panel-width = <1080>;             Numberofpixels 1080×RGB×1920 pixels
                        qcom,mdss-dsi-panel-height = <1920>;            datasheet 宽高
                        qcom,mdss-dsi-h-front-porch = <20>;             HFP
                        qcom,mdss-dsi-h-back-porch = <30>;              HBP
                        qcom,mdss-dsi-h-pulse-width = <30>;             HSync
                        qcom,mdss-dsi-h-sync-skew = <0>;                水平同步偏差,默认值为0
                        qcom,mdss-dsi-v-back-porch = <4>;               VBP
                        qcom,mdss-dsi-v-front-porch = <12>;             VFP
                        qcom,mdss-dsi-v-pulse-width = <6>;              VSync
                        qcom,mdss-dsi-panel-framerate = <60>;           刷新率
                        qcom,mdss-dsi-on-command =                      Qcom DSI控制器协议 DCS数据包构成的字节流
                        qcom,mdss-dsi-off-command =                     需要厂商提供的initcode,并转换为command格式
                        qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; 有些面板需要先送一帧数据,在On command之前
                                                                        dsi_lp_mode 就是在第一帧之前先发DCS command
                        qcom,mdss-dsi-off-command-state = "dsi_hs_mode";dsi_hs_mode 就是先送一帧数据再发DCS command
                        qcom,cmd-to-video-mode-post-switch-commands = ; 动态的从cmd mode切换到video mode的command
                        qcom,cmd-to-video-mode-post-switch-commands-state =
                                        "dsi_lp_mode";

MIPI-DSI LP mode命令及格式详解
MIPI LCD屏厂初始化时序转换为 qcom,mdss-dsi-on-command

 

29h 39h等是Command 模式下的datatype0Eh 1Eh 2Eh 3Eh是Video 模式下的datatype,主要是在发送qcom,mdss-dsi-on-command后会切换到Video Mode,这也是区分两种模式的方式。LCD模组初始化使用Command 模式来读写寄存器,也是因为在低速下数据不容易出错并且容易测量。

dtsi:

 qcom,mdss-dsi-on-command = [
                       39 01 00 00 00 00 04 B9 FF 83 99
                       39 01 00 00 00 00 2F B4 00 FF 04 A4 02 A0 00 00 10 00 00 02 00 24 02 04 0A 21 03 00 00 08 A6 88 04 A4 02 A0 00 00 10 00 00 02 00 24 02 04 0A 00 00 08 A6 00 08 11
                       39 01 00 00 05 00 22 D3 00 00 00 00 00 00 18 18 32 10 09 00 09 32 10 00 00 00 00 00 00 00 00 11 00 02 02 03 00 00 00 0A 40
                       39 01 00 00 00 00 09 D8 0F FF FF E0 0F FF FF E0
                       39 01 00 00 00 00 02 BD 00
                       05 01 00 00 78 00 02 11 00
                       05 01 00 00 14 00 02 29 00
          ];

init code:

        0xB9, 3, 0xFF,0x83,0x99,
        0xB4, 44, 0x00,0xFF,0x00,0xAC,0x00,0x9C,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x26,0x02,0x07,0x09,0x21,0x03,0x00,0x00,0x04,0xA4,0x88,0x00,0xAC,0x00,0x9C,0x00,0x00,0x08,0x00,0x00,0x02,0x00,0x24,0x02,0x07,0x09,0x00,0x00,0x04,0xA4,0x12,
        0xD3, 33, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x10,0x05,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x07,0x07,0x03,0x00,0x00,0x00,0x05,0x40,
        0xD8, 8, 0x28,0x2A,0x00,0x2A,0x28,0x02,0xC0,0x2A,
        0xBD, 1, 0x00,            //这是有数据的,区分05无参数,一个参数用15是不是可以
        REGFLAG_DELAY, 5, ,
        0x11, 0, ,
        REGFLAG_DELAY, 120, ,
        0x29, 0, ,               //注意这里是没有数据的
        REGFLAG_DELAY, 20, ,     //延时


DSI PHY Timing可通过高通提供的表格DSI Timing Parameters User Interactive Spreadsheet (80-NH713-1) 计算

不同平台phy timing计算出来的结果是不同的,控制方式也会不同,使用的DSI PHY 2.0.0计算出的结果是如下

kernel/msm-4.19/techpack/display/msm/dsi/dsi_phy_hw_v2_0.c
查看dtsi中phy-timings的传参过程,个人感觉只用到了以上的CTRL_4 to 8控制寄存器的代码


qcom,mdss-dsi-display-timings
                timing@0
                         qcom,mdss-dsi-panel-phy-timings =           
                                 [23 1E 07 08 05 02 04 a0            //Data0  前五位是excel中计算得出的,ctrl 4 to 8 
                                 23 1E 07 08 05 02 04 a0             //Data1  后三位感觉是hardcode,需要再研究一下
                                 23 1E 07 08 05 02 04 a0             //Data2  
                                 23 1E 07 08 05 02 04 a0             //Data3
                                 23 18 07 08 05 02 04 a0];           //CLK
                         qcom,display-topology = <1 0 1>;
                         qcom,default-topology-index = <0>;
            ;

kernel/msm-4.19/techpack/display/msm/dsi/dsi_phy_timing_v2_0.c
phy-timing其中每一位数据所对应的含义如下,如果MIPI测试项中出现错误的,应该就是修改phy-timings中的值

 


LCD的硬件接口


Display相关的引脚:

MIPI信号时钟线:LCD_D2_P LCD_D2_N LCD_DCK_P DSI接口 ( DSI0_LN2_P DSI接口 )
TE引脚: MDP_VSYNC_P (Video模式不使用 )
复位引脚:LCD_RESET_N GPIO82
供电相关:LCD_VCC_EN GPIO60 LCD_IOVDD_1P8 VREG_L9A_1P8 1.65V to 3.3V
LCD_CONN_AVEE_5P VDISP_P PM1632 3.1V to 5.8V
LCD_CONN_AVDD_5P VDISP_M PM1632 -3.1V to -5.8V
背光正极:LCD_BL_LEDA (Anode阳极,Cathode阴极)
背光负极:LEDK1 LEDK2 接WLED_SINK1 WLED_SINK2 ( 背光物理结构布局为2串并列起来,所以负极有2串 )
背光使能引脚: WLED_EN GPIO6
背光控制引脚:WLED_PWM GPIO8


VDD1 对应原理图中的IOVDD
VSP( Positive source output voloatge ) 对应原理图偏压电源正极
VSN( Negative source output voloatge ) 对应原理图偏压电压负极

sde_dsi: qcom,dsi-display-primary

                vddio-supply = <&L9A>;
                lab-supply = <&lcdb_ldo_vreg>;
                ibb-supply = <&lcdb_ncp_vreg>;
  ...             
qcom,panel-supply-entry@0
                        reg = <0>;
                        qcom,supply-name = "vddio";
                        qcom,supply-min-voltage = <1800000>;
                        qcom,supply-max-voltage = <1800000>;
                        qcom,supply-enable-load = <62000>;
                        qcom,supply-disable-load = <80>;
                        qcom,supply-post-on-sleep = <20>;  //ms
                ;

                qcom,panel-supply-entry@1
                        reg = <1>;
                        qcom,supply-name = "lab";
                        qcom,supply-min-voltage = <4600000>;
                        qcom,supply-max-voltage = <6000000>;
                        qcom,supply-enable-load = <100000>;
                        qcom,supply-disable-load = <100>;
                        qcom,supply-pre-on-sleep = <1>;
                ;

                qcom,panel-supply-entry@2
                        reg = <2>;
                        qcom,supply-name = "ibb";
                        qcom,supply-min-voltage = <4600000>;
                        qcom,supply-max-voltage = <6000000>;
                        qcom,supply-enable-load = <100000>;
                        qcom,supply-disable-load = <100>;
                        qcom,supply-post-on-sleep = <20>;
                ;

除了供电时序还有可以确认以下配置

dtsi:
    qcom,mdss-dsi-lp11-init; //确保reset 信号拉低时,clock和data都要及时被拉高,某些IC时序有此要求
    
    qcom,mdss-dsi-lane-0-state;
    qcom,mdss-dsi-lane-1-state;
    qcom,mdss-dsi-lane-2-state;// 2lane remove the config
    qcom,mdss-dsi-lane-3-state;// 2lane remove the config
xml:
    <DSILP11AtInit>True</DSILP11AtInit>
    
    <DSILanes>4</DSILanes> // 2lane → 2
————————————————

 

以上是关于Android Qcom lcd display 学习的主要内容,如果未能解决你的问题,请参考以下文章

Android Qcom LCD display 学习

Android Qcom lcd display 学习

Qcom android L ro.sf.lcd_density属性修改

QCOM LCD调试

[RK3288][Android6.0] Display驱动初始化流程小结

qcom Android Camera