Android8.0 LCD启动流程初始化(qcom MSM8953)

一、LK阶段LCD的初始化流程

       高通平台下的Android系统的正常运行,分为PBL、SBL1、LK、Kernel、android系统5个阶段,而LCD的初始化是在LK阶段。在LK阶段又分为target_init()和app_init()部分,LCD的初始化函数target_display_init()是在app_init()函数中的aboot_init()中加载的,在aboot_init()中先去判断系统是以哪种方式启动的,然后在进入target_display_init()函数中初始化LCD。大致流程如下:

Android8.0 LCD启动流程初始化(qcom MSM8953)_第1张图片

1.在target_display_init()函数中主要调用gcdb_display_init()函数,这个函数是一个核心函数。从这个函数值中一步步去运行。

2.进入oem_panel_select()函数去选择要使用那一款LCD屏,选择的机制有3种方式,第一种:根据LCD的引脚电平去判断,不同的LCD引脚的电平不一样;第二种:使用I2C读取寄存器方式去读取LCD芯片内部寄存器中的ID去判断;第三种:将第一种和第二种方式结合起来去判断是哪一款屏。

3.确定哪一款屏后,进入init_panel_data()函数去把屏的参数放到panel_struct结构体中,而屏参数的来自屏的头文件里,这个头文件里面包含了屏亮、屏灭、屏timing 、背光等参数。所有的屏的参数都存放在dev/gcdb/display/include下面。

4.存储好屏参数信息后,就进入dsi_panel_init()函数去开始初始化屏的相关参数,如:分辨率、颜色、操作模式、数据通道的配置。其实这个函数的实现就是把之前从屏头文件拷贝过来的参数在重新赋给另一变量。屏的操作模式分为两种:commend模式和video模式,两种模式的本质区别是通过有无RAM来区分的。

5.给函数指针赋值,把初始化用的函数的给函数指针,方便使用这些函数。进入终极函数msm_display_init(&panel),开始进行屏的一些初始化操作:1.给屏上电;2.配置及使能CLK;3.帧画面缓存区的申请;4.配置屏;5.点亮屏;6.打开背光。

6.经过上面5步,屏已经点亮了。如果要显示画面,只要从splash.img中读取出图片,然后通过fb缓冲区把图片显示出来。

二、LK中如何添加新的LCD

1.在存放屏ID的数组中加入屏ID和在该C文件中加入屏对应的头文件。

2.在init_panel_data()函数中添加把头文件的信息赋给panel_struct结构体代码。

三、LCD的bringup

LK阶段:

Android8.0 LCD启动流程初始化(qcom MSM8953)_第2张图片

       在这里主要就要加入屏设备信息和屏设备ID,来根据引脚状态获取屏的ID,LK阶段主要的设备信息在dev/.../include/xxxxx.h文件中,设备初始化的时候会根据里面的命令参数点亮屏,LK阶段的图片显示,是先从spflash.img中读取出图片,把图片放到FB中,来达到显示效果,这个初始化动作有一套接口去实现的,在一般情况下,不会有太大的错误和改动,所以只需要把屏的头文件和定义的设备ID加入到oem_panel.c文件即可。

kernel阶段:

1、关闭连续动画;

      在dtsi文件注释掉qcom,cont-splash-enabled字段即可;

2、使能背光,保证在bringup阶段受背光的影响;

     

背光的类型有三种类型,分别如下,目前使用的是wled背光(发光二极管)。

"bl_ctrl_pwm" = Backlight controlled by PWM gpio.

"bl_ctrl_wled" = Backlight controlled by WLED.

"bl_ctrl_dcs" = Backlight controlled by DCS commands.

Kernel中发送backlight 命令的函数是drivers/video/msm/mdss/mdss_dsi_panel.c下的mdss_dsi_panel_bl_ctrl()----->mdss_dsi_panel_bklt_dcs(); (在调试过程可以直接把brightness设置为定值,保证背光是好的,等屏点亮在去掉它)

Android8.0 LCD启动流程初始化(qcom MSM8953)_第3张图片

3、加入屏的设备树文件,并在平台的设备树中加入屏的设备树信息;

所有屏的dtsi文件都在arch/arm/boot/dts/qcom下,在bringup过程只需要把要加入的dtsi文件加入到该目录下,并在相应的平台msm8953-mdss.dtsi文件中include这个屏的dtsi即可。设备树里面的点亮命令qcom,mdss-dsi-on-command = [23 01 00 00 0a 00 02 b0 00],解析如下:

Android8.0 LCD启动流程初始化(qcom MSM8953)_第4张图片

4、选择LCD屏(在设备树里面配置好)

(1)、选择DSI为主要接口:

         &mdss_mdp {

                                qcom,mdss-pref-prim-intf = "dsi"; };

(2)、告诉DSI主机选择哪一款屏,以dsi_xxxxx_fhd_vid为例;

        &mdss_dsi0 {

                               qcom,dsi-pref-prim-pan = <&dsi_xxxxx_fhd_vid>;(默认屏)

                                pinctrl-names = "mdss_default", "mdss_sleep";

};

         &dsi_xxxxx_fhd_vid{

                                qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;

};

但实际上在匹配屏的时候,是根据LK传过来的display cmdline来匹配哪一款屏的;

问题display cmdline 是在哪里解析的?

-->是在加载DSI驱动的时候去解析的,在mdss_dsi_config_panel()中调用mdss_dsi_get_panel_cfg(panel_cfg, ctrl_pdata)去获取具体屏的信息,存放在panel_cfg中;

5、如何生成头文件和dtsi文件

高通平台下,在device/qcom/common/display/tools下有一个parser.pl 脚本,使用脚本来生成dtsi文件和头文件;

平台命令:perl  parser.pl  platform-msm8610.xml  platform

屏的命令:perl  parser.pl  panel_cmd.xml   panel

你可能感兴趣的:(display,LCD,display)