ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

高通LCD开发常见问题&分析

2020-11-24 19:32:08  阅读:744  来源: 互联网

标签:常见问题 高通 LCD qcom mode dsi mdss 面板 panel


reference:https://blog.csdn.net/sinat_34606064/article/details/77921323

LCD driver的框架

以msm8909为例。

img

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

    img

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,垂直时钟周期。

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 16

1E 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

命令。关于格式,请参考

\kernel\drivers\video\msm\mdss\mdss

_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 00

02 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 78

02 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>, <1

10>;

 

根据您的面板规格进行定制

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模式——分辨率——平台——模组厂商

标签:常见问题,高通,LCD,qcom,mode,dsi,mdss,面板,panel
来源: https://www.cnblogs.com/schips/p/qualcomm_lcd_develop_faq.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有