高通821平台LCD调试(3):LK部分流程(二)

总目录:高通821平台LCD调试

上一篇:LK部分流程(一)


一、GCDB初始化

./lk/dev/gcdb/display/gcdb_display.c

gcdb_display_init ()主要的初始化代码如下:在该函数中有一个重要的函数就是 oem_panel_select(),该函数就是根据你的hw_id 确定使用哪一款LCD,hw_id 这个是在高通的私有代码中传过来的。另外一个比较重要的函数是msm_display_init(&panel),这个函数将oem_panel_select中获得到的信息进行初始化动作,因此有必要首先需要分析oem_panel_select这个函数体的功能。

pan_type = oem_panel_select(panel_name, &panelstruct, &(panel.panel_info),
				 &dsi_video_mode_phy_db);
dsi_panel_init(&(panel.panel_info), &panelstruct)
panel.panel_info.mipi.mdss_dsi_phy_db = &dsi_video_mode_phy_db;
panel.pll_clk_func = mdss_dsi_panel_clock;
panel.dfps_func = mdss_dsi_mipi_dfps_config;
panel.power_func = mdss_dsi_panel_power;
panel.pre_init_func = mdss_dsi_panel_pre_init;
panel.bl_func = mdss_dsi_bl_enable;
panel.dsi2HDMI_config = mdss_dsi2HDMI_config;
/*
* If dfps enabled, reserve fb memory to store pll
* codes and pass pll codes values to kernel. */
if (panel.panel_info.dfps.panel_dfps.enabled) {
	panel.panel_info.dfps.dfps_fb_base = base;
	base += DFPS_PLL_CODES_SIZE;
	dprintf(SPEW, "dfps base=0x%p,d, fb_base=0x%p!\n",
	panel.panel_info.dfps.dfps_fb_base, base);
 }

panel.fb.base = base;
panel.fb.width =  panel.panel_info.xres;
panel.fb.height =  panel.panel_info.yres;
panel.fb.stride =  panel.panel_info.xres;
panel.fb.bpp =  panel.panel_info.bpp;
panel.fb.format = panel.panel_info.mipi.dst_format;
ret = msm_display_init(&panel);

二、oem_panel_select

指定panel_id = TIANMA_2K_VIDEO_PANEL,这个是实际选择屏起作用的选项

	switch (hw_id) {
	case HW_PLATFORM_MTP:
	case HW_PLATFORM_FLUID:
	case HW_PLATFORM_SURF:
		#if DISPLAY_AUO_SPLITDSI_VIDEO_PANEL
		panel_id = JDI_FHD_VIDEO_PANEL;
		#elif DISPLAY_SAMSUNG_FHD_VIDEO_PANEL
                panel_id = SAMSUNG_FHD_VIDEO_PANEL;
		#elif DISPLAY_TIANMA_FHD_VIDEO_PANEL
                panel_id = TIANMA_FHD_VIDEO_PANEL;
		#elif DISPLAY_TIANMA_2K_VIDEO_PANEL
				panel_id = TIANMA_2K_VIDEO_PANEL;
		#endif
		break;

然后会调用init_panel_data根据panel_id 来执行对应的初始化动作,初始化中获得的屏参数来源于

bootable/bootloader/lk/dev/gcdb/display/include/panel_tianma_2k_video.h,该头文件是按照panel.h为参考格式填充,具体参数由屏厂商提供。
case TIANMA_2K_VIDEO_PANEL:
		pan_type = PANEL_TYPE_DSI;
		pinfo->lcd_reg_en = 0;
		panelstruct->paneldata	  = &tianma_2k_dualdsi_video_panel_data;
		panelstruct->panelres	  = &tianma_2k_dualdsi_video_panel_res;
		panelstruct->color		  = &tianma_2k_dualdsi_video_color;
		panelstruct->videopanel   = &tianma_2k_dualdsi_video_video_panel;
		panelstruct->commandpanel = &tianma_2k_dualdsi_video_command_panel;
		panelstruct->state		  = &tianma_2k_dualdsi_video_state;
		panelstruct->laneconfig   = &tianma_2k_dualdsi_video_lane_config;
		panelstruct->paneltiminginfo
			= &tianma_2k_dualdsi_video_timing_info;
		panelstruct->panelresetseq
					 = &tianma_2k_dualdsi_video_reset_seq;
		panelstruct->backlightinfo = &tianma_2k_dualdsi_video_backlight;

		pinfo->labibb = &tianma_2k_dualdsi_video_labibb;

		pinfo->mipi.panel_on_cmds
			= tianma_2k_dualdsi_video_on_command;
		pinfo->mipi.num_of_panel_on_cmds
			= TIANMA_2K_DUALDSI_VIDEO_ON_COMMAND;
		pinfo->mipi.panel_off_cmds
			= tianma_2k_dualdsi_video_off_command;
		pinfo->mipi.num_of_panel_off_cmds
			= TIANMA_2K_DUALDSI_VIDEO_OFF_COMMAND;
		memcpy(phy_db->timing,
			tianma_2k_dualdsi_thulium_video_timings,
			MAX_TIMING_CONFIG * sizeof(uint32_t));
		pinfo->mipi.tx_eot_append = true;


		/*
		 * remove DUAL_PIPE_FLAG because on this target for this panel,
		 * it will be added based on one of the selected configurations.
		 */
		panelstruct->paneldata->panel_operating_mode &= ~DUAL_PIPE_FLAG;
		panelstruct->config = &tianma_2k_dualdsi_video_config0;
		if (oem_data) {
			switch (oem_data->cfg_num[0]) {
			case -1: /* default */
			case 0:
				panelstruct->config =
					&tianma_2k_dualdsi_video_config0;
				break;
			case 1:
				panelstruct->config =
					&tianma_2k_dualdsi_video_config1;
				break;
			default:
				dprintf(CRITICAL, "topology config%d not supported. fallback to default config0\n",
					oem_data->cfg_num[0]);
				panelstruct->config = &tianma_2k_dualdsi_video_config0;
			}
			//oem_data->swap_dsi_ctrl = 1;	// use swap
		}
		pinfo->lm_split[0] = panelstruct->config->lm_split[0];
		pinfo->lm_split[1] = panelstruct->config->lm_split[1];
		pinfo->num_dsc_enc = panelstruct->config->num_dsc_enc;
		break;
    下一篇:LK部分流程(三)



猜你喜欢

转载自blog.csdn.net/musicalspace/article/details/81010953
今日推荐