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三原色就是256X256X2561677216种色彩,国际主要10位控制器

彩色滤光片

         红蓝绿三基色上色作用

上偏光片

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

原理

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

视图如下

高通平台

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

准备工作
device/qcom/common/display/tools路径下先去配置自己的.xml文件
根据寄存器具体配置(其在panel.h下的有树解析)
PanelFrameRate(刷新速率)PanelWidth,PanelHeight(分辨率) 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,以及enable的gpio口进行供电
屏幕的兼容主要也是在该函数中进行的

用生成的.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中是否都支持


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

QualcommMTK平台lcd/tp调试及问题总结(一)----背光相关推荐

  1. 高通平台 lcd driver 调试小结

    一.概述 1.1 简介 本文档主要包括LCD模块的驱动流程分析.Framebuffer相关知识.Gralloc等相关内容,以及LCD调试的一些经验和相关bug的分析和讲解. 1.2  开发环境 And ...

  2. MTK |Android KKL 平台TP调试

    MTK Android KK&L 平台TP调试 一. 简介 二. 硬件电路 三. 添加TP的简单流程(以GT9XX为例) 3.1首先在Projecconfig.mk定义的TP宏控 3.2如果是 ...

  3. SM7250(高通5G)平台LCD bringup

    写在前面的话 高通平台显示这一块,自从去年开始,高通全面使用SMxxxx命名的芯片 比如高端系列:SM8350(骁龙888),SM8250(骁龙865),SM8150(骁龙855) 中端系列:SM72 ...

  4. 展讯平台 LCD(Mipi)移植步骤及问题归纳

    PortingGuide Backlight 背光的硬件设计有两种情况:  1. 内置并联背光  2. 外置串联背光  对于 1 的情况,步骤如下:  1.移植对应的 lcd 驱动.  2.设置u-b ...

  5. 全志 Tina Linux LCD显示屏调试指南 支持MIPI DSI RGB LVDS I8080 SPI等接口,开发板支持百问网T113 D1-H哪吒 DongshanPI-D1s V853

    1 概述 编写目的 本文档将介绍sunxi 平台Display Engine 模块中LCD 的调试方法. LCD 调试方法,调试手段. LCD 驱动编写. lcd0 节点下各个属性的解释. 典型LCD ...

  6. 【Android 逆向】代码调试器开发 ( 使用 NDK 中的 ndk-build + Android.mk 编译 Android 平台的代码调试器可执行应用 )

    文章目录 一.Android 平台代码调试器代码 二.Android.mk 构建脚本内容 三.Application.mk 构建脚本内容 四.正式编译 五.博客资源 一.Android 平台代码调试器 ...

  7. 高通 android平台LCD驱动分析

    目前手机芯片厂家提供的源码里包含整个LCD驱动框架,一般厂家会定义一个xxx_fb.c的源文件,注册一个平台设备和平台驱动,在驱动的probe函数中来调用register_framebuffer(), ...

  8. 如何使用物联网低代码平台进行设备调试?

    AIRIOT物联网低代码平台具有设备调试功能,通过数据调试,可判断设备接入时间否正常. 如何使用AIRIOT平台进行设备调试,操作如下: 设备调试 设备调试用于平台接入资产后,进行数据的调试,可以查看 ...

  9. LCD+TP for linux BSP

    ===================  LCD =================== /* 屏幕ID */ #define ATK4342        0X4342    /* 4.3寸480* ...

最新文章

  1. 电脑软件:5个实用的Windows软件,大幅度提高你的工作效率!
  2. java循环遍历类属性_java循环遍历类属性 get 和set值方法
  3. url 解析一个url里面的参数,获取地址栏参数信息
  4. Python全栈开发记录_第三篇(linux(ubuntu)的操作)
  5. java double的加法_java Double 进行加减乘除
  6. linux查看某个端口的流量_Linux下如何对端口流量进行统计
  7. 几种降维思想方法总结
  8. 中国石油大学(北京)本科毕业论文答辩PPT模板
  9. 坚果pro3刷miui_锤子科技坚果Pro 3(12GB/256GB/全网通)手机卡怎么办?
  10. html自动写对联,HTML 实现网站对联广告位
  11. 基于java的婚恋交友动态网站
  12. 【历史上的今天】9 月 27 日:“3Q 大战”正式打响;第一个被通缉的电脑黑客;知名“美女病毒”作者被定罪
  13. DB2数据库配置db cfg
  14. android 怎样删除sim卡中的联系人
  15. 38、Java——汽车租赁系统(JDBC+MySQL+Apache DBUtils)
  16. 如何做自己开发一个app
  17. 北师大 外国教育史-6(新教育运动)
  18. jQuery-动画效果
  19. poi操作ppt图表史上最完整示例演示
  20. 数据赋能--数字化转型价值起点

热门文章

  1. 教你如何用思维导图把一本书内容绘制成一张A4纸!
  2. linux查看告警日志,linux怎么查看硬件告警
  3. 程序员每天每周每月每年应该做的事
  4. STATA 学习笔记 :相关系数
  5. [译] linux内存管理之RSS和VSZ的区别
  6. reactrouter4路由钩子_React-Router4.x中文文档
  7. 虚拟机booting from hard disk_一分钟带您快速了解虚拟机软件
  8. 四色原型的学习心得分享
  9. 规则引擎——IBM ODM(ILog)——基本使用步骤
  10. 值得重视的网络安全问题