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(刷新速率)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中是否都支持

在这里插入图片描述
东西感觉挺多,后面再补吧

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐