android lk解读 (6)--panel的点亮

 还记得之前的kmian函数中有个app start么,马上就有一个现成的例子也就是panel在lk中是如何点亮的

首先看

APP_START(aboot)
	.init = aboot_init,
APP_END
看看init

void aboot_init(const struct app_descriptor *app)
{
	unsigned reboot_mode = 0;
	bool boot_into_fastboot = false;
	uint32_t voltage=0;
	unsigned i=0;
	unsigned pon_reason=0;
	uint8_t reg=0;
	//bsp kerwin add++ 	3074
	uint8_t is_cold_boot;	
	//bsp kerwin add++ 
	batt_voltage_low=false;

	/* Setup page size information for nv storage */
	if (target_is_emmc_boot())
	{
		page_size = mmc_page_size();
		page_mask = page_size - 1;
	}
	else
	{
		page_size = flash_page_size();
		page_mask = page_size - 1;
	}

	ASSERT((MEMBASE + MEMSIZE) > MEMBASE);

	device.charger_screen_enabled = 0;
	read_device_info(&device);

	pon_reason=pm8x41_get_pon_reason();
	if(pon_reason&0x04){
		pm8x41_disable_rtc_trigger();
		dprintf(CRITICAL,"shutdown for rtc trigger\n");
		shutdown_device();
	}

	boot_into_charger_mode = false;
	if(target_pause_for_battery_charge())
		if(!device.charger_screen_enabled)
			if (!(keys_get_state(KEY_HOME) || keys_get_state(KEY_VOLUMEUP) ||
				 keys_get_state(KEY_BACK) || keys_get_state(KEY_VOLUMEDOWN)))
				boot_into_charger_mode = true;
	for(i=0;i<5;i++)
		voltage+=pm8x41_get_batt_voltage();
	voltage=voltage/5;
	dprintf(INFO,"[BATT] batt voltage=%dmV\n",voltage/1000);
	is_cold_boot=pm8x41_get_is_cold_boot(); //1=cold,0=warm 

	pon_reason=pm8x41_get_pon_reason();
	if(((voltage<3500000) && (pon_reason & 0x80))||((voltage<3500000) && (!is_cold_boot)))//batt_voltage<3.5V and boot by key
		batt_voltage_low=true;
	else
		batt_voltage_low=false;	

	read_allow_oem_unlock(&device);

	/* Display splash screen if enabled */
#if DISPLAY_SPLASH_SCREEN
	dprintf(SPEW, "Display Init: Start\n");
	target_display_init(device.display_panel);   //这里的这个display_panel的名字的来源在之前的void cmd_oem_select_display_panel(const char *arg, void *data, unsigned size)里获取



	dprintf(SPEW, "Display Init: Done\n");
#endif
这个

void target_display_init(const char *panel_name)
{
	uint32_t panel_loop = 0;
	uint32_t ret = 0;

	panel_name += strspn(panel_name, " ");

	if (!strcmp(panel_name, NO_PANEL_CONFIG)
		|| !strcmp(panel_name, SIM_VIDEO_PANEL)
		|| !strcmp(panel_name, SIM_CMD_PANEL)) {
		dprintf(INFO, "Selected panel: %s\nSkip panel configuration\n",
			panel_name);
		return;
	}

	do {
		target_force_cont_splash_disable(false);
		ret = gcdb_display_init(panel_name, MDP_REV_50, MIPI_FB_ADDR);
		if (!ret || ret == ERR_NOT_SUPPORTED) {
			break;
		} else {
			target_force_cont_splash_disable(true);
			msm_display_off();
		}
	} while (++panel_loop <= oem_panel_max_auto_detect_panels());
	ASUS_Get_LCD_UNIQUE_ID();
}
然后跑到

int gcdb_display_init(const char *panel_name, uint32_t rev, void *base)
{
	int ret = NO_ERROR;
	int pan_type;

	pan_type = oem_panel_select(panel_name, &panelstruct, &(panel.panel_info),
				 &dsi_video_mode_phy_db);     //获取panel id和asus id,同事完成panel struct的一些数据的初始化

	if (pan_type == PANEL_TYPE_DSI) {
		init_platform_data();
		if (dsi_panel_init(&(panel.panel_info), &panelstruct)) {
			dprintf(CRITICAL, "DSI panel init failed!\n");
			ret = ERROR;
			goto error_gcdb_display_init;
		}

		panel.panel_info.mipi.mdss_dsi_phy_db = &dsi_video_mode_phy_db;
		panel.pll_clk_func = mdss_dsi_panel_clock;
		panel.power_func = mdss_dsi_panel_power;
		panel.pre_init_func = mdss_dsi_panel_pre_init;
		panel.bl_func = mdss_dsi_bl_enable;
		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;
	} else if (pan_type == PANEL_TYPE_EDP) {
		mdss_edp_panel_init(&(panel.panel_info));
		/* prepare func is set up at edp_panel_init */
                panel.clk_func = mdss_edp_panel_clock;
                panel.power_func = mdss_edp_panel_power;
		panel.bl_func = mdss_edp_bl_enable;
                panel.fb.format = FB_FORMAT_RGB888;
	} else {
		dprintf(CRITICAL, "Target panel init not found!\n");
		ret = ERR_NOT_SUPPORTED;
		goto error_gcdb_display_init;

	}

	panel.fb.base = base;
	panel.mdp_rev = rev;

	ret = msm_display_init(&panel);  //所有参数配置好之后这里点亮panel

error_gcdb_display_init:
	display_enable = ret ? 0 : 1;
	return ret;
}
看看

int oem_panel_select(const char *panel_name, struct panel_struct *panelstruct,
			struct msm_panel_info *pinfo,
			struct mdss_dsi_phy_ctrl *phy_db)
{
	uint32_t hw_id = board_hardware_id();
	uint32_t hw_subtype = board_hardware_subtype();
	int32_t panel_override_id;
	uint32_t target_id, plat_hw_ver_major;
	uint16_t ze600kl_cpu_id;
	if (panel_name) {
		panel_override_id = panel_name_to_id(supp_panels,
				ARRAY_SIZE(supp_panels), panel_name);

		if (panel_override_id < 0) {
			dprintf(CRITICAL, "Not able to search the panel:%s %d\n",
					 panel_name + strspn(panel_name, " "),hw_id);
		} else if (panel_override_id < UNKNOWN_PANEL) {
			/* panel override using fastboot oem command */
			panel_id = panel_override_id;

			dprintf(INFO, "OEM panel override:%s\n",
					panel_name + strspn(panel_name, " "));
			goto panel_init;
		}
	}

	mdelay(5);
	asus_lcd_id = (gpio_get(LCD_ID1) << 1) | (gpio_get(LCD_ID2));
	dprintf(CRITICAL, "[Display] asus_lcd_id(%d). \n",asus_lcd_id);

    switch (g_ASUS_PRJ_ID) {
		case ASUS_ZE550KL:
#ifdef FHD_IMAGE
            //image for ZE551KL
         if(asus_lcd_id == 3){
		 	dprintf(CRITICAL, "[Display] select panel:TM5P5_NT35596_1080P\n");
	        panel_id = TM5P5_NT35596_1080P_VIDEO_PANEL;
	        asus_lcd = TM5P5_1080P;
         }else{
			 dprintf(CRITICAL, "[Display] select panel:AUO5P5_NT35596_1080P\n");
			 panel_id = AUO5P5_NT35596_1080P_VIDEO_PANEL;
			 asus_lcd = AUO5P5_1080P;
         }
         break;
#endif
         if(asus_lcd_id == 3){
			 dprintf(CRITICAL, "[Display] select panel:TM5P5_OTM1284A_720P\n");
			 panel_id = TM5P5_OTM1284A_720P_VIDEO_PANEL;
			 asus_lcd = TM5P5_720P;
         }else{
			 dprintf(CRITICAL, "[Display] select panel:CPT5P5_OTM1284A_720P\n");
			 panel_id = CPT5P5_OTM1284A_720P_VIDEO_PANEL;
			 asus_lcd = CPT5P5_720P;
         }
			break;
		case ASUS_ZE600KL:
           //panel select for ZE600KL
#ifdef FHD_IMAGE
		if(asus_lcd_id == 1){
			dprintf(INFO,"[Display] panel: TM_OTM1901A_1080P\n");
		panel_id = TM_OTM1901A_1080P_VIDEO_PANEL;
		asus_lcd = TM_1080P;
		}else{
		dprintf(INFO,"[Display] panel: AUO_OTM1901A_1080P\n");
		panel_id = AUO_OTM1901A_1080P_VIDEO_PANEL;
		asus_lcd = AUO_1080P;
		}
		break;
#endif
           //<asus-Jeffery20150226+>
			if(asus_lcd_id == 2){
				dprintf(INFO, "[Display] panel:IVO_NT35521S_720P\n");
				panel_id = IVO_NT35521S_720P_VIDEO_PANEL;
				asus_lcd = IVO_720P;
			}
            else{
				//Set default panel to CPT. CPT:asus_lcd_id=3 
                dprintf(INFO, "[Display] panel:CPT_ILI9881C_720P\n");
                panel_id = CPT_ILI9881C_720P_VIDEO_PANEL;
				asus_lcd = CPT_720P;
            }
            //<asus-Jeffery20150226->
			break;
	    case ASUS_ZX550KL:
			//panel select for ZX550KL
			if(asus_lcd_id == 3){
			   dprintf(CRITICAL, "[Display] select panel:TM5P5_NT35596_1080P\n");
			   panel_id = TM5P5_NT35596_1080P_VIDEO_PANEL;
			   asus_lcd = TM5P5_1080P;
			}else{
				dprintf(CRITICAL, "[Display] select panel:AUO5P5_NT35596_1080P\n");
				panel_id = AUO5P5_NT35596_1080P_VIDEO_PANEL;
				asus_lcd = AUO5P5_1080P;
			}
			break;
	    case ASUS_ZD550KL:
			//panel select for ZD550KL
			if(asus_lcd_id == 3){
			   dprintf(CRITICAL, "[Display] select panel:TM5P5_NT35596_1080P\n");
			   panel_id = TM5P5_NT35596_1080P_VIDEO_PANEL;
			   asus_lcd = TM5P5_1080P;
			}else{
				dprintf(CRITICAL, "[Display] select panel:AUO5P5_NT35596_1080P\n");
				panel_id = AUO5P5_NT35596_1080P_VIDEO_PANEL;
				asus_lcd = AUO5P5_1080P;
			}
			break;
		default:
			dprintf(CRITICAL, "Display not enabled for %d HW type\n",
					hw_id);
			return PANEL_TYPE_UNKNOWN;
    }
	sprintf(cmd_lcd_id, " LCD_ID=%d ", asus_lcd);
	sprintf(show_lcd_id," LCD_ID=0x%d ", asus_lcd);

panel_init:
	/*
	 * Update all data structures after 'panel_init' label. Only panel
	 * selection is supposed to happen before that.
	 */
	//<asus-Jeffery20150702+> add for msm8939 v3 to dcdc mode
	switch(g_ASUS_PRJ_ID){
		case ASUS_ZE600KL:
				ze600kl_cpu_id = (gpio_get(ZE600KL_PRJ_ID1)<<2)|(gpio_get(ZE600KL_PRJ_ID2)<<1)|gpio_get(ZE600KL_PRJ_ID3);
				dprintf(CRITICAL, "[Jeffery] ZE600KL cpu id = %d\n",ze600kl_cpu_id);
				if(ze600kl_cpu_id == 5){ // msm8939 v3
					phy_db->regulator_mode = DSI_PHY_REGULATOR_DCDC_MODE;
					memcpy(panel_regulator_settings,
						dcdc_regulator_settings, REGULATOR_SIZE);
				}else{ //msm8939 v2
					phy_db->regulator_mode = DSI_PHY_REGULATOR_LDO_MODE;
					memcpy(panel_regulator_settings,
						ldo_regulator_settings, REGULATOR_SIZE);

				}
			break;
			default:
				phy_db->regulator_mode = DSI_PHY_REGULATOR_LDO_MODE;
				memcpy(panel_regulator_settings,
					ldo_regulator_settings, REGULATOR_SIZE);
				break;
		
	}
		//<asus-Jeffery20150702-> add for msm8939 v3 to dcdc mode
		
	pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;
	return init_panel_data(panelstruct, pinfo, phy_db);
}

在看看

static int init_panel_data(struct panel_struct *panelstruct,
			struct msm_panel_info *pinfo,
			struct mdss_dsi_phy_ctrl *phy_db)
{
	int pan_type = PANEL_TYPE_DSI;

	switch (panel_id) {
	//<asus-Jeffery20150320+>
    case IVO_NT35521S_720P_VIDEO_PANEL:
        panelstruct->paneldata    = &ivo_nt35521s_720p_video_panel_data;
        panelstruct->panelres     = &ivo_nt35521s_720p_video_panel_res;
        panelstruct->color        = &ivo_nt35521s_720p_video_color;
        panelstruct->videopanel   = &ivo_nt35521s_720p_video_video_panel;
        panelstruct->commandpanel = &ivo_nt35521s_720p_video_command_panel;
        panelstruct->state        = &ivo_nt35521s_720p_video_state;
        panelstruct->laneconfig   = &ivo_nt35521s_720p_video_lane_config;
        panelstruct->paneltiminginfo =&ivo_nt35521s_720p_video_timing_info;
        panelstruct->panelresetseq = &ivo_nt35521s_720p_video_reset_seq;
        panelstruct->backlightinfo = &ivo_nt35521s_720p_video_backlight;
        pinfo->mipi.panel_cmds = ivo_nt35521s_720p_video_on_command;
        pinfo->mipi.num_of_panel_cmds = IVO_NT35521S_720P_VIDEO_ON_COMMAND;
        memcpy(phy_db->timing, ivo_nt35521s_720p_video_timings,TIMING_SIZE);
        break;
    case CPT_ILI9881C_720P_VIDEO_PANEL:
        panelstruct->paneldata    = &cpt_ili9881c_720p_video_panel_data;
        panelstruct->panelres     = &cpt_ili9881c_720p_video_panel_res;
        panelstruct->color        = &cpt_ili9881c_720p_video_color;
        panelstruct->videopanel   = &cpt_ili9881c_720p_video_video_panel;
        panelstruct->commandpanel = &cpt_ili9881c_720p_video_command_panel;
        panelstruct->state        = &cpt_ili9881c_720p_video_state;
        panelstruct->laneconfig   = &cpt_ili9881c_720p_video_lane_config;
        panelstruct->paneltiminginfo =&cpt_ili9881c_720p_video_timing_info;
        panelstruct->panelresetseq = &cpt_ili9881c_720p_video_reset_seq;
        panelstruct->backlightinfo = &cpt_ili9881c_720p_video_backlight;
        pinfo->mipi.panel_cmds = cpt_ili9881c_720p_video_on_command;
        pinfo->mipi.num_of_panel_cmds = CPT_ILI9881C_720P_VIDEO_ON_COMMAND;
        memcpy(phy_db->timing, cpt_ili9881c_720p_video_timings,TIMING_SIZE);
        break;
	case AUO_OTM1901A_1080P_VIDEO_PANEL:
		panelstruct->paneldata    = &auo_otm1901a_1080p_video_panel_data;
        panelstruct->panelres     = &auo_otm1901a_1080p_video_panel_res;
        panelstruct->color        = &auo_otm1901a_1080p_video_color;
        panelstruct->videopanel   = &auo_otm1901a_1080p_video_video_panel;
        panelstruct->commandpanel = &auo_otm1901a_1080p_video_command_panel;
        panelstruct->state        = &auo_otm1901a_1080p_video_state;
        panelstruct->laneconfig   = &auo_otm1901a_1080p_video_lane_config;
        panelstruct->paneltiminginfo =&auo_otm1901a_1080p_video_timing_info;
        panelstruct->panelresetseq = &auo_otm1901a_1080p_video_reset_seq;
        panelstruct->backlightinfo = &auo_otm1901a_1080p_video_backlight;
        pinfo->mipi.panel_cmds = auo_otm1901a_1080p_video_on_command;
        pinfo->mipi.num_of_panel_cmds = AUO_OTM1901A_1080P_VIDEO_ON_COMMAND;
        memcpy(phy_db->timing, auo_otm1901a_1080p_video_timings,TIMING_SIZE);
        break;
	case TM_OTM1901A_1080P_VIDEO_PANEL:
		panelstruct->paneldata    = &tm_otm1901a_1080p_video_panel_data;
        panelstruct->panelres     = &tm_otm1901a_1080p_video_panel_res;
        panelstruct->color        = &tm_otm1901a_1080p_video_color;
        panelstruct->videopanel   = &tm_otm1901a_1080p_video_video_panel;
        panelstruct->commandpanel = &tm_otm1901a_1080p_video_command_panel;
        panelstruct->state        = &tm_otm1901a_1080p_video_state;
        panelstruct->laneconfig   = &tm_otm1901a_1080p_video_lane_config;
        panelstruct->paneltiminginfo =&tm_otm1901a_1080p_video_timing_info;
        panelstruct->panelresetseq = &tm_otm1901a_1080p_video_reset_seq;
        panelstruct->backlightinfo = &tm_otm1901a_1080p_video_backlight;
        pinfo->mipi.panel_cmds = tm_otm1901a_1080p_video_on_command;
        pinfo->mipi.num_of_panel_cmds = TM_OTM1901A_1080P_VIDEO_ON_COMMAND;
        memcpy(phy_db->timing, tm_otm1901a_1080p_video_timings,TIMING_SIZE);
        break;
    //<asus-Jeffery20150320->
	//ASUS_BSP: Wigman ++
	case TM5P5_OTM1284A_720P_VIDEO_PANEL:
		panelstruct->paneldata    = &otm1284a_720p_video_panel_data;
		panelstruct->panelres     = &otm1284a_720p_video_panel_res;
		panelstruct->color        = &otm1284a_720p_video_color;
		panelstruct->videopanel   = &otm1284a_720p_video_video_panel;
		panelstruct->commandpanel = &otm1284a_720p_video_command_panel;
		panelstruct->state        = &otm1284a_720p_video_state;
		panelstruct->laneconfig   = &otm1284a_720p_video_lane_config;
		panelstruct->paneltiminginfo
			= &otm1284a_720p_video_timing_info;
		panelstruct->panelresetseq
					 = &otm1284a_720p_video_reset_seq; 
		panelstruct->backlightinfo = &otm1284a_720p_video_backlight;
		pinfo->mipi.panel_cmds
			= otm1284a_720p_video_on_command;
		pinfo->mipi.num_of_panel_cmds
			= OTM1284A_720P_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
			otm1284a_720p_video_timings, TIMING_SIZE);
		pinfo->mipi.signature 	= TM_720P_VIDEO_SIGNATURE;
		break;
	case CPT5P5_OTM1284A_720P_VIDEO_PANEL:
		panelstruct->paneldata    = &cpt5p5_otm1284a_720p_video_panel_data;
		panelstruct->panelres	  = &cpt5p5_otm1284a_720p_video_panel_res;
		panelstruct->color		  = &cpt5p5_otm1284a_720p_video_color;
		panelstruct->videopanel   = &cpt5p5_otm1284a_720p_video_video_panel;
		panelstruct->commandpanel = &cpt5p5_otm1284a_720p_video_command_panel;
		panelstruct->state		  = &cpt5p5_otm1284a_720p_video_state;
		panelstruct->laneconfig   = &cpt5p5_otm1284a_720p_video_lane_config;
		panelstruct->paneltiminginfo
			= &cpt5p5_otm1284a_720p_video_timing_info;
		panelstruct->panelresetseq
					 = &cpt5p5_otm1284a_720p_video_reset_seq; 
		panelstruct->backlightinfo = &cpt5p5_otm1284a_720p_video_backlight;
		pinfo->mipi.panel_cmds
			= cpt5p5_otm1284a_720p_video_on_command;
		pinfo->mipi.num_of_panel_cmds
			= CPT5P5_OTM1284A_720P_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
			cpt5p5_otm1284a_720p_video_timings, TIMING_SIZE);
		pinfo->mipi.signature	= CPT_720P_VIDEO_SIGNATURE;
		break;
	case TM5P5_NT35596_1080P_VIDEO_PANEL:
		panelstruct->paneldata    = &tm5p5_nt35596_1080p_video_panel_data;
		panelstruct->panelres     = &tm5p5_nt35596_1080p_video_panel_res;
		panelstruct->color        = &tm5p5_nt35596_1080p_video_color;
		panelstruct->videopanel   = &tm5p5_nt35596_1080p_video_video_panel;
		panelstruct->commandpanel = &tm5p5_nt35596_1080p_video_command_panel;
		panelstruct->state        = &tm5p5_nt35596_1080p_video_state;
		panelstruct->laneconfig   = &tm5p5_nt35596_1080p_video_lane_config;
		panelstruct->paneltiminginfo
			= &tm5p5_nt35596_1080p_video_timing_info;
		panelstruct->panelresetseq
					 = &tm5p5_nt35596_1080p_video_reset_seq; 
		panelstruct->backlightinfo = &tm5p5_nt35596_1080p_video_backlight;
		pinfo->mipi.panel_cmds
			= tm5p5_nt35596_1080p_video_on_command;
		pinfo->mipi.num_of_panel_cmds
			= TM5P5_NT35596_1080P_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
			tm5p5_nt35596_1080p_video_timings, TIMING_SIZE);
		pinfo->mipi.signature 	= TM_1080P_VIDEO_SIGNATURE;
		break;		
	case AUO5P5_NT35596_1080P_VIDEO_PANEL:
		panelstruct->paneldata    = &auo5p5_nt35596_1080p_video_panel_data;
		panelstruct->panelres     = &auo5p5_nt35596_1080p_video_panel_res;
		panelstruct->color        = &auo5p5_nt35596_1080p_video_color;
		panelstruct->videopanel   = &auo5p5_nt35596_1080p_video_video_panel;
		panelstruct->commandpanel = &auo5p5_nt35596_1080p_video_command_panel;
		panelstruct->state        = &auo5p5_nt35596_1080p_video_state;
		panelstruct->laneconfig   = &auo5p5_nt35596_1080p_video_lane_config;
		panelstruct->paneltiminginfo
			= &auo5p5_nt35596_1080p_video_timing_info;
		panelstruct->panelresetseq
					 = &auo5p5_nt35596_1080p_video_reset_seq; 
		panelstruct->backlightinfo = &auo5p5_nt35596_1080p_video_backlight;
		pinfo->mipi.panel_cmds
			= auo5p5_nt35596_1080p_video_on_command;
		pinfo->mipi.num_of_panel_cmds
			= AUO5P5_NT35596_1080P_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
			auo5p5_nt35596_1080p_video_timings, TIMING_SIZE);
		break;	
	//ASUS_BSP: Wigman --
	case JDI_1080P_VIDEO_PANEL:
		panelstruct->paneldata    = &jdi_1080p_video_panel_data;
		panelstruct->paneldata->panel_with_enable_gpio = 1;
		panelstruct->panelres     = &jdi_1080p_video_panel_res;
		panelstruct->color        = &jdi_1080p_video_color;
		panelstruct->videopanel   = &jdi_1080p_video_video_panel;
		panelstruct->commandpanel = &jdi_1080p_video_command_panel;
		panelstruct->state        = &jdi_1080p_video_state;
		panelstruct->laneconfig   = &jdi_1080p_video_lane_config;
		panelstruct->paneltiminginfo
			= &jdi_1080p_video_timing_info;
		panelstruct->panelresetseq
					 = &jdi_1080p_video_panel_reset_seq;
		panelstruct->backlightinfo = &jdi_1080p_video_backlight;
		pinfo->mipi.panel_cmds
			= jdi_1080p_video_on_command;
		pinfo->mipi.num_of_panel_cmds
			= JDI_1080P_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
			jdi_1080p_video_timings, TIMING_SIZE);
		pinfo->mipi.signature 	= JDI_1080P_VIDEO_SIGNATURE;
		break;
	case NT35590_720P_VIDEO_PANEL:
		panelstruct->paneldata    = &nt35590_720p_video_panel_data;
		panelstruct->panelres     = &nt35590_720p_video_panel_res;
		panelstruct->color        = &nt35590_720p_video_color;
		panelstruct->videopanel   = &nt35590_720p_video_video_panel;
		panelstruct->commandpanel = &nt35590_720p_video_command_panel;
		panelstruct->state        = &nt35590_720p_video_state;
		panelstruct->laneconfig   = &nt35590_720p_video_lane_config;
		panelstruct->paneltiminginfo
					 = &nt35590_720p_video_timing_info;
		panelstruct->panelresetseq
					 = &nt35590_720p_video_panel_reset_seq;
		panelstruct->backlightinfo = &nt35590_720p_video_backlight;
		pinfo->mipi.panel_cmds
					= nt35590_720p_video_on_command;
		pinfo->mipi.num_of_panel_cmds
					= NT35590_720P_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
				nt35590_720p_video_timings, TIMING_SIZE);
		pinfo->mipi.signature 	= NT35590_720P_VIDEO_SIGNATURE;
		break;
	case NT35590_720P_CMD_PANEL:
		panelstruct->paneldata    = &nt35590_720p_cmd_panel_data;
		panelstruct->panelres     = &nt35590_720p_cmd_panel_res;
		panelstruct->color        = &nt35590_720p_cmd_color;
		panelstruct->videopanel   = &nt35590_720p_cmd_video_panel;
		panelstruct->commandpanel = &nt35590_720p_cmd_command_panel;
		panelstruct->state        = &nt35590_720p_cmd_state;
		panelstruct->laneconfig   = &nt35590_720p_cmd_lane_config;
		panelstruct->paneltiminginfo = &nt35590_720p_cmd_timing_info;
		panelstruct->panelresetseq
					= &nt35590_720p_cmd_panel_reset_seq;
		panelstruct->backlightinfo = &nt35590_720p_cmd_backlight;
		pinfo->mipi.panel_cmds
					= nt35590_720p_cmd_on_command;
		pinfo->mipi.num_of_panel_cmds
					= NT35590_720P_CMD_ON_COMMAND;
		memcpy(phy_db->timing,
				nt35590_720p_cmd_timings, TIMING_SIZE);
		pinfo->mipi.signature 	= NT35590_720P_CMD_SIGNATURE;
		break;
	case INNOLUX_720P_VIDEO_PANEL:
		panelstruct->paneldata    = &innolux_720p_video_panel_data;
		panelstruct->panelres     = &innolux_720p_video_panel_res;
		panelstruct->color        = &innolux_720p_video_color;
		panelstruct->videopanel   = &innolux_720p_video_video_panel;
		panelstruct->commandpanel = &innolux_720p_video_command_panel;
		panelstruct->state        = &innolux_720p_video_state;
		panelstruct->laneconfig   = &innolux_720p_video_lane_config;
		panelstruct->paneltiminginfo
					= &innolux_720p_video_timing_info;
		panelstruct->panelresetseq
					= &innolux_720p_video_reset_seq;
		panelstruct->backlightinfo = &innolux_720p_video_backlight;
		pinfo->mipi.panel_cmds
					= innolux_720p_video_on_command;
		pinfo->mipi.num_of_panel_cmds
					= INNOLUX_720P_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
				innolux_720p_video_timings, TIMING_SIZE);
		break;
	case OTM8019A_FWVGA_VIDEO_PANEL:
		panelstruct->paneldata    = &otm8019a_fwvga_video_panel_data;
		panelstruct->panelres     = &otm8019a_fwvga_video_panel_res;
		panelstruct->color        = &otm8019a_fwvga_video_color;
		panelstruct->videopanel   = &otm8019a_fwvga_video_video_panel;
		panelstruct->commandpanel = &otm8019a_fwvga_video_command_panel;
		panelstruct->state        = &otm8019a_fwvga_video_state;
		panelstruct->laneconfig   = &otm8019a_fwvga_video_lane_config;
		panelstruct->paneltiminginfo
					= &otm8019a_fwvga_video_timing_info;
		panelstruct->panelresetseq
					= &otm8019a_fwvga_video_reset_seq;
		panelstruct->backlightinfo = &otm8019a_fwvga_video_backlight;
		pinfo->mipi.panel_cmds
					= otm8019a_fwvga_video_on_command;
		pinfo->mipi.num_of_panel_cmds
					= OTM8019A_FWVGA_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
				otm8019a_fwvga_video_timings, TIMING_SIZE);
		break;
	case OTM1283A_720P_VIDEO_PANEL:
		panelstruct->paneldata    = &otm1283a_720p_video_panel_data;
		panelstruct->panelres     = &otm1283a_720p_video_panel_res;
		panelstruct->color        = &otm1283a_720p_video_color;
		panelstruct->videopanel   = &otm1283a_720p_video_video_panel;
		panelstruct->commandpanel = &otm1283a_720p_video_command_panel;
		panelstruct->state        = &otm1283a_720p_video_state;
		panelstruct->laneconfig   = &otm1283a_720p_video_lane_config;
		panelstruct->paneltiminginfo
					= &otm1283a_720p_video_timing_info;
		panelstruct->panelresetseq
					= &otm1283a_720p_video_reset_seq;
		panelstruct->backlightinfo = &otm1283a_720p_video_backlight;
		pinfo->mipi.panel_cmds
					= otm1283a_720p_video_on_command;
		pinfo->mipi.num_of_panel_cmds
					= OTM1283A_720P_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
				otm1283a_720p_video_timings, TIMING_SIZE);
		break;
	case NT35596_1080P_VIDEO_PANEL:
		panelstruct->paneldata    = &nt35596_1080p_skuk_video_panel_data;
		panelstruct->panelres     = &nt35596_1080p_skuk_video_panel_res;
		panelstruct->color        = &nt35596_1080p_skuk_video_color;
		panelstruct->videopanel   = &nt35596_1080p_skuk_video_video_panel;
		panelstruct->commandpanel = &nt35596_1080p_skuk_video_command_panel;
		panelstruct->state        = &nt35596_1080p_skuk_video_state;
		panelstruct->laneconfig   = &nt35596_1080p_skuk_video_lane_config;
		panelstruct->paneltiminginfo
					= &nt35596_1080p_skuk_video_timing_info;
		panelstruct->panelresetseq
					= &nt35596_1080p_skuk_video_reset_seq;
		panelstruct->backlightinfo = &nt35596_1080p_skuk_video_backlight;
		pinfo->mipi.panel_cmds
					= nt35596_1080p_skuk_video_on_command;
		pinfo->mipi.num_of_panel_cmds
					= NT35596_1080P_SKUK_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
				nt35596_1080p_skuk_video_timings, TIMING_SIZE);
		break;
	case SHARP_WQXGA_DUALDSI_VIDEO_PANEL:
		panelstruct->paneldata    = &sharp_wqxga_dualdsi_video_panel_data;
		panelstruct->panelres     = &sharp_wqxga_dualdsi_video_panel_res;
		panelstruct->color        = &sharp_wqxga_dualdsi_video_color;
		panelstruct->videopanel   = &sharp_wqxga_dualdsi_video_video_panel;
		panelstruct->commandpanel = &sharp_wqxga_dualdsi_video_command_panel;
		panelstruct->state        = &sharp_wqxga_dualdsi_video_state;
		panelstruct->laneconfig   = &sharp_wqxga_dualdsi_video_lane_config;
		panelstruct->paneltiminginfo
			= &sharp_wqxga_dualdsi_video_timing_info;
		panelstruct->panelresetseq
					 = &sharp_wqxga_dualdsi_video_reset_seq;
		panelstruct->backlightinfo = &sharp_wqxga_dualdsi_video_backlight;
		pinfo->mipi.panel_cmds
			= sharp_wqxga_dualdsi_video_on_command;
		pinfo->mipi.num_of_panel_cmds
			= SHARP_WQXGA_DUALDSI_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
			sharp_wqxga_dualdsi_video_timings, TIMING_SIZE);
		pinfo->mipi.signature 	= SHARP_WQXGA_DUALDSI_VIDEO_SIGNATURE;
		break;
	case JDI_FHD_VIDEO_PANEL:
                panelstruct->paneldata    = &jdi_fhd_video_panel_data;
                panelstruct->panelres     = &jdi_fhd_video_panel_res;
                panelstruct->color        = &jdi_fhd_video_color;
                panelstruct->videopanel   = &jdi_fhd_video_video_panel;
                panelstruct->commandpanel = &jdi_fhd_video_command_panel;
                panelstruct->state        = &jdi_fhd_video_state;
                panelstruct->laneconfig   = &jdi_fhd_video_lane_config;
                panelstruct->paneltiminginfo
                                        = &jdi_fhd_video_timing_info;
                panelstruct->panelresetseq
                                        = &jdi_fhd_video_reset_seq;
                panelstruct->backlightinfo = &jdi_fhd_video_backlight;
                pinfo->mipi.panel_cmds
                                        = jdi_fhd_video_on_command;
                pinfo->mipi.num_of_panel_cmds
                                        = JDI_FHD_VIDEO_ON_COMMAND;
                memcpy(phy_db->timing,
                                jdi_fhd_video_timings, TIMING_SIZE);
                break;
	case HX8379A_FWVGA_VIDEO_PANEL:
		panelstruct->paneldata    = &hx8379a_fwvga_video_panel_data;
		panelstruct->panelres     = &hx8379a_fwvga_video_panel_res;
		panelstruct->color        = &hx8379a_fwvga_video_color;
		panelstruct->videopanel   = &hx8379a_fwvga_video_video_panel;
		panelstruct->commandpanel = &hx8379a_fwvga_video_command_panel;
		panelstruct->state        = &hx8379a_fwvga_video_state;
		panelstruct->laneconfig   = &hx8379a_fwvga_video_lane_config;
		panelstruct->paneltiminginfo
					= &hx8379a_fwvga_video_timing_info;
		panelstruct->panelresetseq
					= &hx8379a_fwvga_video_reset_seq;
		panelstruct->backlightinfo = &hx8379a_fwvga_video_backlight;
		pinfo->mipi.panel_cmds
					= hx8379a_fwvga_video_on_command;
		pinfo->mipi.num_of_panel_cmds
					= HX8379A_FWVGA_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
					hx8379a_fwvga_video_timings, TIMING_SIZE);
		break;
	case HX8394D_720P_VIDEO_PANEL:
		panelstruct->paneldata	  = &hx8394d_720p_video_panel_data;
		panelstruct->panelres	  = &hx8394d_720p_video_panel_res;
		panelstruct->color		  = &hx8394d_720p_video_color;
		panelstruct->videopanel   = &hx8394d_720p_video_video_panel;
		panelstruct->commandpanel = &hx8394d_720p_video_command_panel;
		panelstruct->state		  = &hx8394d_720p_video_state;
		panelstruct->laneconfig   = &hx8394d_720p_video_lane_config;
		panelstruct->paneltiminginfo
					 = &hx8394d_720p_video_timing_info;
		panelstruct->panelresetseq
					 = &hx8394d_720p_video_panel_reset_seq;
		panelstruct->backlightinfo = &hx8394d_720p_video_backlight;
		pinfo->mipi.panel_cmds
					= hx8394d_720p_video_on_command;
		pinfo->mipi.num_of_panel_cmds
					= HX8394D_720P_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
				hx8394d_720p_video_timings, TIMING_SIZE);
		pinfo->mipi.signature = HX8394D_720P_VIDEO_SIGNATURE;
		break;
	case NT35521_WXGA_VIDEO_PANEL:
		panelstruct->paneldata    = &nt35521_wxga_video_panel_data;
		panelstruct->panelres     = &nt35521_wxga_video_panel_res;
		panelstruct->color        = &nt35521_wxga_video_color;
		panelstruct->videopanel   = &nt35521_wxga_video_video_panel;
		panelstruct->commandpanel = &nt35521_wxga_video_command_panel;
		panelstruct->state        = &nt35521_wxga_video_state;
		panelstruct->laneconfig   = &nt35521_wxga_video_lane_config;
		panelstruct->paneltiminginfo
					= &nt35521_wxga_video_timing_info;
		panelstruct->panelresetseq
					= &nt35521_wxga_video_reset_seq;
		panelstruct->backlightinfo = &nt35521_wxga_video_backlight;
		pinfo->mipi.panel_cmds
					= nt35521_wxga_video_on_command;
		pinfo->mipi.num_of_panel_cmds
					= NT35521_WXGA_VIDEO_ON_COMMAND;
		memcpy(phy_db->timing,
				nt35521_wxga_video_timings, TIMING_SIZE);
		break;
	case UNKNOWN_PANEL:
	default:
		memset(panelstruct, 0, sizeof(struct panel_struct));
		memset(pinfo->mipi.panel_cmds, 0, sizeof(struct mipi_dsi_cmd));
		pinfo->mipi.num_of_panel_cmds = 0;
		memset(phy_db->timing, 0, TIMING_SIZE);
		pan_type = PANEL_TYPE_UNKNOWN;
		break;
	}
	return pan_type;
}
最后点亮panel

int msm_display_init(struct msm_fb_panel_data *pdata)
{
	int ret = NO_ERROR;

	panel = pdata;
	if (!panel) {
		ret = ERR_INVALID_ARGS;
		goto msm_display_init_out;
	}

	/* Turn on panel */
	if (pdata->power_func)
		ret = pdata->power_func(1, &(panel->panel_info));

	if (ret)
		goto msm_display_init_out;

	/* Enable clock */
	if (pdata->clk_func)
		ret = pdata->clk_func(1);

	/* Only enabled for auto PLL calculation */
	if (pdata->pll_clk_func)
		ret = pdata->pll_clk_func(1, &(panel->panel_info));

	if (ret)
		goto msm_display_init_out;

	/* pinfo prepare  */
	if (pdata->panel_info.prepare) {
		/* this is for edp which pinfo derived from edid */
		ret = pdata->panel_info.prepare();
		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;
	}

	if (ret)
		goto msm_display_init_out;

	ret = msm_fb_alloc(&(panel->fb));
	if (ret)
		goto msm_display_init_out;

	ret = msm_display_config();
	if (ret)
		goto msm_display_init_out;

	fbcon_setup(&(panel->fb));
	display_image_on_screen();
	ret = msm_display_on();
	if (ret)
		goto msm_display_init_out;

	if (pdata->post_power_func)
		ret = pdata->post_power_func(1);
	if (ret)
		goto msm_display_init_out;

	/* Turn on backlight */
	if (pdata->bl_func)
		ret = pdata->bl_func(1);

	if (ret)
		goto msm_display_init_out;

msm_display_init_out:
	return ret;
}








然后

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值