lcm in qcom

lcm需要生产的相关文件

根据fae提供的相关资料去配置自己的.xml文件,如下:

device/qcom/common/display/tools: panel_nt35596_1080p_video.xmlpanel_nt35590_720p_cmd.xml(具体使用的是cmd 或video的lcm看spec获取)

用fae提供的资料去生成自己的.xml

具体需要填充的参数有如下:

< OnCommand > 根据寄存器具体配置(其在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文件(设备输的具体解析请见

https://blog.csdn.net/sinat_34606064/article/details/77921323(里面有更详细的干货!!!))

到这里需要的相关文件已具备

lcm in lk

用生成的.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;

具体lk流程(盗张图)
在这里插入图片描述
lk相关配置完成

lcm in kernel

与lk差不多把生成的dts加入让其解析 在kernel/msm-4xx/arch/arm64/boot/dts/qcom/xx-mdss-panels.dtsi

#include "dsi-panel-ili9881c-1080p-video.dtsi"
 &mdss_dsi0 {

      lab-supply = <&lcdb_ldo_vreg>;
      ibb-supply = <&lcdb_ncp_vreg>;
      /delete-property/ vdd-supply;
      qcom,dsi-pref-prim-pan = <&dsi_ili9881c_1080p_video>;
      qcom,platform-bklight-en-gpio = <&pm8953_gpios 4 0>;
      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>;()
      qcom,platform-reset-gpio = <&tlmm 61 0>;
      qcom,platform-enable-gpio = <&tlmm 25 0>;

}; &dsi_ili9881c_1080p_video {

      qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_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>;

}; 一些电和gpio以及背光方式 

一些注意的事项

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有无加载成功

也可以adb shell cat proc/cmdline

需要计算的时序和周期:
for example : 45678{1e e 4 5 2} 4567890{1e 1b 4 6 2 3 4}

                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>;

这三个.h与.dtsi一致,参考前面的一些高通文档(懒得盗图了80-P3255-33?/\80-P8754-45)
如果不亮先检查下自己的配置和相应的寄存器 .h里需要注意的

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可以看下结构体成员

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对应即可

先到这里以后再补

其他平台(sdm845)

kernel 中差不多主要是设备树的配置,主要包括屏的初始化以及背光,还有相应的电;
aboot 的开机初始化移至uefi(cp侧)改动挺大的;

in kernel

在内核中设备树有所变更,尽量不要用生成的dtsi,可以根据屏的模式(cmd or video)去选择已有的dis-(mode).dtsi 拷贝进行相应更改,注意包头;

                    39 01 00 00 00 00 05 B8 03 06 00 00     //EQ Control Function For Source Driver
                    39 01 00 00 00 00 05 BD 01 40 14 14     //Display Timing Control
                    15 01 00 00 00 00 02 6F 01
                    15 01 00 00 00 00 02 C0 03
                    05 01 00 00 78 00 02 11 00
                    05 01 00 00 20 00 02 29 00
       qcom,mdss-dsi-off-command = [05 01 00 00 20 00 02 28 00              //display off
                    05 01 00 00 80 00 02 10 00];
                    包头规律请注意,uefi同理不太懂;
                    属性增减看需求;
sdm845-sde-display.dtsi
#include "dsi-panel-p101-1600x2560-video.dtsi"
	dsi_p101_leia_1080p_video_display: qcom,dsi-display@0 {
		compatible = "qcom,dsi-display";
		label = "dsi_p101_leia_1080p_video_display";
		qcom,display-type = "primary";
 
		qcom,dsi-ctrl = <&mdss_dsi0 &mdss_dsi1>;
		qcom,dsi-phy = <&mdss_dsi_phy0 &mdss_dsi_phy1>;
		clocks = <&mdss_dsi0_pll BYTECLK_MUX_0_CLK>,
			<&mdss_dsi0_pll PCLK_MUX_0_CLK>;
		clock-names = "mux_byte_clk", "mux_pixel_clk";
 
		pinctrl-names = "panel_active", "panel_suspend";
		pinctrl-0 = <&sde_dsi_active &sde_te_active &dsi_backlight_ctrl_default>;
		pinctrl-1 = <&sde_dsi_suspend &sde_te_suspend &dsi_backlight_ctrl_suspend>;
		qcom,platform-te-gpio = <&tlmm 10 0>;
		qcom,platform-reset-gpio = <&tlmm 6 0>;
		qcom,panel-mode-gpio = <&tlmm 52 0>;
 
		qcom,dsi-panel = <&dsi_p101_leia_1080p_video>;
		vddio-supply = <&pm8998_l14>;
		lab-supply = <&lab_regulator>;
		ibb-supply = <&ibb_regulator>;
	};/*copy个出来作出相应修改,注意下dsi-display@x顺序递增 //注意不要变更// */
 
&mdss_mdp {
	connectors = <&sde_rscc &sde_wb &sde_dp &dsi_p101_leia_1080p_video_display>;  //加载已有的ic
};
//其实平台的流程的差不多,开始调试时可以找默认的ic进行对比调试;

其实平台的流程的差不多,开始调试时可以找默认的ic进行对比调试;

sdm845-v2.1-4k-panel-qrd-overlay.dts
&dsi_p101_leia_1080p_video {
	qcom,panel-supply-entries = <&dsi_panel_pwr_supply>;
 
	qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_dcs";
	//qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>;
	//pwms = <&pmi8998_pwm_1 0 0>;
	//qcom,mdss-dsi-bl-pmic-bank-select = <0>;
	//qcom,mdss-dsi-pwm-gpio = <&pmi8998_gpios 2 0>;
	qcom,mdss-dsi-bl-min-level = <1>;
	qcom,mdss-dsi-bl-max-level = <4095>;
	qcom,mdss-dsi-mode-sel-gpio-state = "dual_port";
	qcom,panel-mode-gpio = <&tlmm 52 0>;
	qcom,platform-te-gpio = <&tlmm 10 0>;
	qcom,platform-reset-gpio = <&tlmm 6 0>;
};//copy 后做相应更改
 
&dsi_sharp_4k_dsc_video_display {
	/delete-property/ qcom,dsi-display-active;
};
 
&dsi_p101_leia_1080p_video {
	qcom,dsi-display-active;
}; //删除已有的ic加载/delete-property/ qcom,dsi-display-active;

没亮屏时先看有无背光

后续再补充;

in uefi

boot_images/QcomPkg/Include/Library/MDPPlatformLib.h
 
typedef enum {
  MDPPLATFORM_PANEL_NONE =0x0,                            /* No panel specified                     */
  MDPPLATFORM_PANEL_SIM_VIDEO_PANEL,                      /* Single DSI video mode simulation panel */
  .......
    MDPPLATFORM_PANEL_LEIA_P101_1080P_VIDEO,             /* P101 LEAA dual dsi video mode */
  MDPPLATFORM_PANEL_MAX
} MDPPlatformPanelType
加入id即可;
boot_images/QcomPkg/SDM845Pkg/Library/MDPPlatformLib/MDPPlatformLib.c
上述id 在这定义
 
#if 0
const static int8 Sharp_4k_video_dsc_xmldata[] =(所以的原有参数)
#endif
 
拷贝上述一个参数根据自己的参数进行填充;
const static int8 Leia_2k_video_dsc_xmldata[] =
     "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
                        " 05 11 00\n"
                       " ff f0\n"
                       " 05 29 00\n"
                       " ff f0\n"  //11 29 的延迟
                       "</DSIInitSequence>"
                       "<DSITermSequence>"
                       " 05 28\n"
                       " 05 10\n"
                       "</DSITermSequence>"
                       "<TLMMGPIODefaultLow units='hex list'>34</TLMMGPIODefaultLow>"
                       "<Group id='Backlight Configuration'>"
                       " <BacklightType units='MDP_Panel_BacklightType'>1</BacklightType>\n"
                       " <BacklightPmicControlType units='MDP_PmicBacklightControlType'>2</BacklightPmicControlType>\n"  
                       " <DisplayResetInfo>0 10 1000 10000 0</DisplayResetInfo>\n"
                       "</Group>\n";
#if 0
static PlatformDSIDetectParams panelList_0[](所有的元数据,主屏为0)
static PlatformDSIDetectParams panelList_1[]
#endif
copy 个下来
static PlatformDSIDetectParams panelList_0[] = {    /* subtype == 1 */
    // Panel #1 - Truly DSI Command Mode Panel (1440x2560 24bpp
	{  
		 0x06,                                                  // uCmdType
	     0x05,                                                  // total number of retry on failures
	 {
        {{0xDA, 0x00},                                       // address to read ID1
        {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     // expected readback
        }, 
        {{0xDB, 0x00},                                       // address to read ID2
        {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     // expected readback
        },
       {{0xFE, 0x00},                                       // address to read ID3
        {0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}     // expected readback
        }
	 },
      0,                                                     // Lane remap order {0, 1, 2, 3}
     Leia_2k_video_dsc_xmldata,                     // psPanelCfg (panel configuration)
       sizeof(Leia_2k_video_dsc_xmldata),             // uPanelCfgSize
     MDPPLATFORM_PANEL_LEIA_P101_1080P_VIDEO,       // eSelectedPanel 
       0                                                      // uFlags
   }
};
id 在这定义
const PanelInfoType gPanelList[] =
{
#if 0
.......其他不用的注释
#endif
  PANEL_CREATE_ENTRY("leia_wqxga_dual_vid",           MDPPLATFORM_PANEL_LEIA_P101_1080P_VIDEO,          "dsi_p101_leia_1080p_video_display:",       DISP_INTF_DSI, Leia_2k_video_dsc_xmldata,            DISP_TOPOLOGY_CONFIG_NONE,  DISP_TIMING_CONFIG_NONE, PLL_OVERRIDE_NONE, DISP_MODE_DUAL_DSI   | DISP_MODE_SKIP_BOOTLOADER | DISP_MODE_SEAMLESS_SPLASH_OFF,                                DISP_MODE_DUAL_DSI   | DISP_MODE_SKIP_BOOTLOADER | DISP_MODE_SEAMLESS_SPLASH_OFF,                                   DISP_MODE_DUAL_DSI   | DISP_MODE_SKIP_BOOTLOADER | DISP_MODE_SEAMLESS_SPLASH_OFF),
#if 0
#endif
 /*End of Table, DO NOT ADD PANEL BELOW THIS*/
 PANEL_CREATE_ENTRY("",                           MDPPLATFORM_PANEL_NONE,                         "",                                      DISP_INTF_NONE,NULL,                                  DISP_TOPOLOGY_CONFIG_NONE,  DISP_TIMING_CONFIG_NONE, PLL_OVERRIDE_NONE, DISP_MODE_NONE,                                    DISP_MODE_DUAL_DSI   | DISP_MODE_SKIP_BOOTLOADER,     DISP_MODE_DUAL_DSI   | DISP_MODE_SKIP_BOOTLOADER),
};
}
** FUNCTION: panel_ConfigGPIO()
** 
** DESCRIPTION:
**   Initialize LCD panel GPIOs and PMICs
**
**/
MDP_Status MDPPlatformConfigure(MDP_Display_IDType eDisplayId, MDPPlatformConfigType eConfig, MDPPlatformParams *pPlatformParams)
{
  MDP_Status               eStatus               = MDP_STATUS_OK;
  uint32                   uPanelID              = 0;
  MDPPlatformConfigType    ePlatformConfig;
  PlatformDSIDetectParams  *pPanelList           = NULL;
  uint32                   uPanelCnt;
 
注意这个函数的初始化,别走错了配置
build.sh
function boot() {
  echo BOOT building...
  sleep 2
  pushd boot_images/QcomPkg
  python buildex.py --variant LA -r RELEASE -t SDM845Pkg,QcomToolsPkg
  popd
} //xbl.elf ll
function adsp() {
  echo adsp building
  sleep 2
  pushd adsp_proc/build
  python ./build.py -c sdm845 -o clean -f ADSP
  python ./build.py -c sdm845 -o all -f ADSP
  popd
}

到此流程结束,见后续

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值