还记得之前的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;
}
然后