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 模式下的datatype,0Eh 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 学习的主要内容,如果未能解决你的问题,请参考以下文章
Qcom android L ro.sf.lcd_density属性修改