转自: https://blog.csdn.net/VERBOR/article/details/115128511?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242

Qualcomm&MTK平台lcd/tp调试及问题总结

LCD原理结构
        LCD背光板
        下偏光板
        薄膜基板(TFT)
        液晶
        彩色滤光片
        上偏光片
        原理
视图如下
高通平台
    lk启动方式下(主要安卓8之前)
    kernel移植
            .dtsi中
背光的软件流程如下
    1.bootloader部分
    2.kernel部分
    主要背光功耗控制方法

LCD原理结构

目前主要使用的显示屏有TFT-LCD,OLED

LCD背光板

  • 为屏显提供基本光源

下偏光板

  • 使背光传出光线方向一致传向

薄膜基板(TFT)

  • 控制液晶扭转,电压变化控制扭转度数由主要有driver ic控制

液晶

  • 液晶分子受TFT控制,扭转角度影响光线透过率从而控制像素的亮度,影响灰阶(常用8位控制器)256级灰度控制,RGB三原色就是256X256X256 = 1677216种色彩,国际主要10位控制器

彩色滤光片

  • 红蓝绿三基色上色作用

上偏光片

  • 和下偏光片共同配合呈垂直角度

原理

背光发出光源,通过下偏光片进入,我们通过tft基板控制液晶分子扭转电压和扭转角度相关,从而控制单个像素的明暗强度,再透过滤光片从而实现多种色彩,不同强弱产生不同的画面,对待屏幕常见参数有 gamma 值,对比度,饱和度.可以通过高通QDCM 工具进行在线调试.

视图如下

高通平台

lk启动方式下(主要安卓8之前)

准备工作

device/qcom/common/display/tools 路径下先去配置自己的.xml文件

根据寄存器具体配置(其在panel.h下的有树解析)

PanelFrameRate(刷新速率)PanelWidthPanelHeight(分辨率) HFrontPorch, HBackPorch, HPulseWidth(水平前沿值,水平后沿值,水平脉冲宽度)VBackPorch, VFrontPorch, VPulseWidth(垂直后沿值与上面相对应) DSILanes(通道数),在提供的 spec 中查找(找关键字即可)或者找fae进行确认

TClkPost, TClkPre(指定模式切换前后的字节时钟周期)需要通过高通相关文档通过以上数据计算(相关计算qcm文档80-NH713-1_Y)具体的一些计算包括时序在80-P3255-33里面有详细介绍。

perl parser.pl .xml panel 生成相关lk下的.h与kernel下的.dtsi文件

先把.h文件放入lk/dev/gcdb/display/include/目录下

将屏名称加入bootable/bootloader/lk/target/platform/oem_panel.c 中去, 可在此文件中参考其它屏的格式加入其名称,注意大小写. 在该文件中int oem_panel_select中找到默认的panel进行替换即可. bootable/bootloader/lk/target/platform路径下target_display.c文件中设置reset, bkl, 以及enablegpio口进行供电. 屏幕的兼容主要也是在该函数中进行的

用生成的.h文件添加到bootable/bootloader/lk/dev/gcdb/display/include下面

修改bootable/bootloader/lk/target/platform/oem_panel.c如下:

#include “.h”
#include “include/panel_ili9881c_1080p_video.h”
// enum { (加入自己的panel名称)
emum{
    …
    ILI9881C_1080P_VIDEO_PANEL,
    UNKNOWN_PANEL
    };

// static struct panel_list supp_panels (加入自己的panel名称)
static struct panel_list supp_panels[] = {
    {“nt35596_1080p_video”, NT35596_1080P_VIDEO_PANEL},
    {“ili9881c_1080p_video”, ILI9881C_1080P_VIDEO_PANEL},
};

// static int init_panel_data 添加case TRULY_1080P_VIDEO_PANEL(相应panel去解析自己的.h文件)
// case ILI9881C_1080P_VIDEO_PANEL:(与.相对应即可)
panelstruct->paneldata = &ili9881c_1080p_video_panel_data;
panelstruct->panelres = &ili9881c_1080p_video_panel_res;
panelstruct->color = &ili9881c_1080p_video_color;

//int oem_panel_select在相应platfom下替换自己的panel
case HW_PLATFORM_XXx:
panel_id = ILI9881C_1080P_VIDEO_PANEL;

kernel移植

为例 kernel/msm-4.9/arch/arm6/boot/dts/qcom/ 路径下的scorpio-qrd-sku4.dtsi

上电部分:&tlmm { pmx_mdss { mdss_dsi_active: mdss_dsi_active {
mux {
设置屏休眠唤醒动作的上下电 pins = “gpio25”, “gpio61”, “gpio97”;};
config {
pins = “gpio25”, “gpio61”, “gpio97”;};};
mdss_dsi_suspend: mdss_dsi_suspend {
mux {pins = “gpio25”, “gpio61”, “gpio97”;};
config {pins = “gpio25”, “gpio61”, “gpio97”;};};};};
&mdss_dsi0 { lab-supply = <&lcdb_ldo_vreg>;
ibb-supply = <&lcdb_ncp_vreg>;
vdd-supply; //VDD供电
qcom,dsi-pref-prim-pan = <&dsi_td4310_1080p_video>;//使用td4310,兼容的话可直接加上空格即可,主要兼容操作通过lk,区分id脚
qcom,platform-bklight-en-gpio = <&tlmm 97 0>;//gpio97供电背光
pinctrl-names = “mdss_default”, “mdss_sleep”;
pinctrl-0 = <&mdss_dsi_active &mdss_te_active>;
pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>;
qcom,platform-te-gpio = <&tlmm 24 0>;设置te脚//命令控制
qcom,platform-reset-gpio = <&tlmm 61 0>;设置reset脚
qcom,platform-enable-gpio = <&tlmm 25 0>;ennable脚};

// pwm控制
&dsi_td4310_1080p_video {
qcom,mdss-dsi-bl-pmic-control-type = “bl_ctrl_pwm”;//背光pwm控制方式
qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>;
qcom,mdss-dsi-bl-pmic-bank-select = <0>;
qcom,mdss-dsi-pwm-gpio = <&pm8953_gpios 8 0>;查看原理图
qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
};

//wled背光控制方式
qcom,mdss-dsi-bl-pmic-control-type = “bl_ctrl_wled”;
qcom,mdss-dsi-bl-min-level = <1>;
qcom,mdss-dsi-bl-max-level = <4095>;

//DCS控制方式
qcom,mdss-dsi-bl-pmic-control-type = “bl_ctrl_dcs”;

大致上电部分如上电确认好没什么问题,我们把前面生成的.dtsi文件放在该文件下,将其加入到scorpio-mdss-panel.dtsi中方式如默认使用的屏.加入屏的时序时序可通过fae提供的proch值,以及高通官方提供的时序计算表格进行计算(表格使用时确认好系统默认使用的时序代码版本)

debug 串口log

[ 3.738288] mdss_dsi_find_panel_of_node: cmdline:0:qcom,mdss_dsi_ili9881c_1080p_video:1:none:cfg:single_dsi panel_name:qcom,mdss_dsi_ili9881c_1080p_video
[ 3.743813] mdss_dsi_panel_init: Panel Name = ili9881c 1080p video mode dsi panel
[ 3.757658] mdss_dsi_panel_timing_from_dt: found new timing “qcom,mdss_dsi_ili9881c_1080p_video” (fffffff2ece971e8)

看下相应的panel有无加载成功 然后单独列一些.h.dtsi中一些注意的参数

时序周期

qcom,mdss-dsi-panel-timings-phy-v2 = [1e 1b 04 06 02 03 04 a0
1e 1b 04 06 02 03 04 a0
1e 1b 04 06 02 03 04 a0
1e 1b 04 06 02 03 04 a0
1e 0e 04 05 02 03 04 a0];
qcom,mdss-dsi-t-clk-post = <0x0a>;
qcom,mdss-dsi-t-clk-pre = <0x1e>;
static struct panel_config ili9881c_1080p_video_panel_data = {
“qcom,mdss_dsi_ili9881c_1080p_video”, “dsi:0:”, “qcom,mdss-dsi-panel”,
10, 0, “DISPLAY_1”, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL};
// 生成的可能会上两个值补上0,NULL可以看下结构体成员panel.h里面
static struct lane_configuration ili9881c_1080p_video_lane_config = {
4, 0, 1, 1, 1, 1, 0};//与上相同少个值加上去
static char ili9881c_1080p_video_on_cmd189[] = {
0x02, 0x00, 0x29, 0xC0,
0x11, 0x00, 0xFF, 0xFF,};
static char ili9881c_1080p_video_on_cmd190[] = {
0x02, 0x00, 0x29, 0xC0,
0x29, 0x00, 0xFF, 0xFF,};
{0x8, ili9881c_1080p_video_on_cmd189, 0x78},
{0x8, ili9881c_1080p_video_on_cmd190, 0x28}static struct labibb_desc ili9881c_1080p_video_labibb = {
0, 1, 4600000, 6000000, 4600000, 6000000, 3, 3, 1, 0}; //偏压与dtsi对应即可
.dtsi中
qcom,mdss-dsi-panel-controller = <&mdss_dsi0>;
qcom,mdss-dsi-panel-type = “dsi_video_mode”;可选video还是cmd
qcom,mdss-dsi-panel-destination = “display_1”;
qcom,mdss-dsi-panel-framerate = <60>;//帧率设置
qcom,mdss-dsi-virtual-channel-id = <0>;
qcom,mdss-dsi-stream = <0>;
qcom,mdss-dsi-panel-width = <1080>;//宽度
qcom,mdss-dsi-panel-height = <2160>;//高度
qcom,mdss-dsi-h-front-porch = <24>;//水平前沿值
qcom,mdss-dsi-h-back-porch = <4>;//水平后沿
qcom,mdss-dsi-h-pulse-width = <4>;//水平脉冲宽度
qcom,mdss-dsi-h-sync-skew = <0>;
qcom,mdss-dsi-v-back-porch = <30>;//垂直后沿
qcom,mdss-dsi-v-front-porch = <4>;//垂直前沿
qcom,mdss-dsi-v-pulse-width = <2>;//垂直脉冲宽度
qcom,mdss-dsi-h-left-border = <0>;//左边框
qcom,mdss-dsi-h-right-border = <0>;//右边框
qcom,mdss-dsi-v-top-border = <0>;//上边框
qcom,mdss-dsi-v-bottom-border = <0>;//下边框

qcom,mdss-dsi-on-command =< >;//添加亮屏初始化寄存器列表,大多数厂商提供 spec,需要我们一个一个加进去,需要小心,寄存器太多的话出问题不好找.个别厂商例如scorpio项目中这部分就直接加入了tp中的update.img里面去了, 在开机的时候能够直接将寄存器写入flash中.dtsi里面只留下了11 29 oncommond标识 和28 10 off commond 标识
qcom,mdss-dsi-lane-map = “lane_map_0123”;//4调lane,有些是2条,对应上spec就可以
qcom,mdss-dsi-lane-0-state;
qcom,mdss-dsi-lane-1-state;
qcom,mdss-dsi-lane-2-state;
qcom,mdss-dsi-lane-3-state;
qcom,mdss-dsi-reset-sequence = <1 10>, <0 10>, <1 10>;//reset延时,可直接询问fae,自行查看Datesheet手册也可以.符合要求就可以

背光的软件流程如下

1.bootloader部分

上面是调用流程,主要通过msm8952_pwm_baclight_ctrl()来配置

2.kernel部分

背光控制方式,由控制电路决定,以pwm为例 1.先注册了mdss_dsi_ctrl驱动以及解析背光设备树里面的设置 从红色代码可知背光调节通过调用mdss_dsi_panel_bl_ctrl()实现,另外pwm_request()函数的实现

第43行表示请求一个PWM设备,ctrl->pwm_lpg_chan是PWM设备索引,"lcd-bklt"表示PWM设备的标签。并让ctrl->pwm_bl指向于此设备。

2.注册mdss_fb驱动和注册lcd-backlight mdss_fb.c通过led_classdev_register注册一个led classdev 路径/sys/class/led/lcd-backlight 设置背光亮度的函数见红色的函数指针brightness_set 指向mdss_fb_set_bl_brightness()

背光调节流程 例如在sys/class/leds/lcd-backlight里面 echo 255 > brightness HALL层节点调用底层mdss_dsi_panel_bklt_pwm()流程如下

主要背光功耗控制方法

lcm主要以tft-lcd类型来说 屏幕功耗最高的还是背光的led耗电太高 1.LABC(自适应感光调整) 该方法需要配合光线传感器,就是常见的背光自动调整,大多设备都支持 2.CABC(内容式的背光调整) 该方式根据图像内容调节背光,主要是通过提升图像的灰阶亮度和降低背光亮度 获取到相同或者接近的显示效果. 3.LABC+CABC 目前主流的背光降低功耗的方法,要看ic中是否都支持

东西感觉挺多,后面再补吧

标签: aosp

添加新评论