从target_display_init开始
void target_display_init(const char *panel_name){struct oem_panel_data oem;int32_t ret = 0;uint32_t panel_loop = 0;set_panel_cmd_string(panel_name);oem = mdss_dsi_get_oem_data();if (!strcmp(oem.panel, NO_PANEL_CONFIG)|| !strcmp(oem.panel, SIM_VIDEO_PANEL)|| !strcmp(oem.panel, SIM_DUALDSI_VIDEO_PANEL)|| !strcmp(oem.panel, SIM_CMD_PANEL)|| !strcmp(oem.panel, SIM_DUALDSI_CMD_PANEL)|| oem.skip) {dprintf(INFO, "Selected panel: %s\nSkip panel configuration\n",oem.panel);oem.cont_splash = false;}/* skip splash screen completely not just cont splash */if (!strcmp(oem.panel, DISABLE_PANEL_CONFIG)) {dprintf(INFO, "%s: disable splash screen \n",__func__);return;}do {target_force_cont_splash_disable(false);ret = gcdb_display_init(oem.panel, MDP_REV_50, (void *)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());if (!oem.cont_splash) {dprintf(INFO, "Forcing continuous splash disable\n");target_force_cont_splash_disable(true);}}int gcdb_display_init(const char *panel_name, uint32_t rev, void *base){int ret = NO_ERROR;int pan_type;dsi_video_mode_phy_db.pll_type = DSI_PLL_TYPE_28NM;panel.panel_info.disable_wled_labibb = false;pan_type = oem_panel_select(panel_name, &panelstruct, &(panel.panel_info), --------------1&dsi_video_mode_phy_db); // oem_panel_select()函数去选择要使用那一款LCD屏,并根据对应屏的panel-xxx.h中的各个结构体填充至panelstruct,panel.panel_info 和 dsi_video_mode_phy_db 中,并返回panel_type为 PANEL_TYPE_DSIif (pan_type == PANEL_TYPE_DSI) {if (update_dsi_display_config())goto error_gcdb_display_init;target_dsi_phy_config(&dsi_video_mode_phy_db); // 继续填充 dsi_video_mode_phy_db中的strength,regulator 和 laneCfgmdss_dsi_check_swap_status(); // 交换目标面板,使用适合的时钟,如果panel_dest为DISPLAY_1,则更改为DISPLAY_2(dsi_controller = "dsi:1:"),如果不为DISPLAY_1,则更改为 DISPLAY_1(dsi_controller = "dsi:0:")mdss_dsi_set_pll_src(); // 设置时钟if (dsi_panel_init(&(panel.panel_info), &panelstruct)) { // 将panel_struc中和其他函数指针赋予panel.panel_infodprintf(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; // 将填充好的dsi_video_mode_phy_db赋予panelpanel.pll_clk_func = mdss_dsi_panel_clock;panel.dfps_func = mdss_dsi_mipi_dfps_config;panel.power_func = mdss_dsi_panel_power; // 赋值屏的电源函数 ----------2panel.pre_init_func = mdss_dsi_panel_pre_init;panel.bl_func = mdss_dsi_bl_enable; // 使能屏的背光函数---------------------3panel.dsi2HDMI_config = mdss_dsi2HDMI_config;/** Reserve fb memory to store pll codes and pass* pll codes values to kernel.*/panel.panel_info.dfps.dfps_fb_base = base;base += DFPS_PLL_CODES_SIZE;panel.fb.base = base;dprintf(SPEW, "dfps base=0x%p,d, fb_base=0x%p!\n",panel.panel_info.dfps.dfps_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 if (pan_type == PANEL_TYPE_SPI) {panel.panel_info.xres = panelstruct.panelres->panel_width;panel.panel_info.yres = panelstruct.panelres->panel_height;panel.panel_info.bpp = panelstruct.color->color_format;panel.power_func = mdss_spi_panel_power;panel.bl_func = mdss_spi_bl_enable;panel.fb.base = base;panel.fb.width = panel.panel_info.xres;panel.fb.height = panel.panel_info.yres;panel.fb.bpp = panel.panel_info.bpp;panel.fb.format = FB_FORMAT_RGB565;panel.panel_info.type = SPI_PANEL;} 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); -------------------------------------4error_gcdb_display_init:display_enable = ret ? 0 : 1;return ret;}/** The list of panels that are supported on this target.* Any panel in this list can be selected using fastboot oem command.*/static struct panel_list supp_panels[] = {{"truly_1080p_video", TRULY_1080P_VIDEO_PANEL},{"truly_1080p_cmd", TRULY_1080P_CMD_PANEL},{"r69006_1080p_video", R69006_1080P_VIDEO_PANEL},{"r69006_1080p_cmd", R69006_1080P_CMD_PANEL},{"truly_wuxga_video", TRULY_WUXGA_VIDEO_PANEL},{"hx8399c_fhd_pluse_video", HX8399C_FHD_PLUSE_VIDEO_PANEL},{"hx8399c_hd_plus_video", HX8399C_HD_PLUS_VIDEO_PANEL},};
标号1 :oem_panel_select
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(); // return board.platform_hw ,获取hw_id,即board iduint32_t platform_subtype = board_hardware_subtype(); // return board.platform_subtypeint32_t panel_override_id;phy_db->pll_type = DSI_PLL_TYPE_THULIUM;if (panel_name) {panel_override_id = panel_name_to_id(supp_panels,ARRAY_SIZE(supp_panels), panel_name); // 根据panel_name在supp_panels数组中选择对应的panel_id,并将panel_id赋予panel_override_id if (panel_override_id < 0) {// 未能在supp_panels数组中找到对应的panel_iddprintf(CRITICAL, "Not able to search the panel:%s\n",panel_name + strspn(panel_name, " "));} 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; // 在supp_panels数组中找到了对应的panel_id,直接进入panel_init}}// 如果panel_name为空或未能在supp_panels数组中找到对应的panel_id,则利用hw_id和platform_subtype来确定switch (hw_id) { case HW_PLATFORM_MTP:panel_id = TRULY_1080P_VIDEO_PANEL;if (platform_subtype == 0x03)panel_id = HX8399C_FHD_PLUSE_VIDEO_PANEL;break;case HW_PLATFORM_SURF:case HW_PLATFORM_RCM:panel_id = TRULY_1080P_VIDEO_PANEL;if (platform_subtype == 0x02)panel_id = HX8399C_FHD_PLUSE_VIDEO_PANEL;break;case HW_PLATFORM_QRD:panel_id = R69006_1080P_CMD_PANEL;if (platform_subtype == 0x01 || platform_subtype == 0x03)panel_id = HX8399C_FHD_PLUSE_VIDEO_PANEL;break;default:dprintf(CRITICAL, "Display not enabled for %d HW type\n",hw_id);return PANEL_TYPE_UNKNOWN;}panel_init:/** Update all data structures after 'panel_init' label. Only panel* selection is supposed to happen before that.*/pinfo->pipe_type = MDSS_MDP_PIPE_TYPE_RGB;return init_panel_data(panelstruct, pinfo, phy_db);}
根据panel_id的不同,初始化传入的panelstruct,pinfo 和 phy_db 结构体,用于填充的各个结构体对象来源于一开始加入的各个屏对应的panel-xxxx.h
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) {case TRULY_1080P_VIDEO_PANEL:panelstruct->paneldata = &truly_1080p_video_panel_data;panelstruct->paneldata->panel_with_enable_gpio = 0;panelstruct->panelres= &truly_1080p_video_panel_res;panelstruct->color = &truly_1080p_video_color;panelstruct->videopanel = &truly_1080p_video_video_panel;panelstruct->commandpanel = &truly_1080p_video_command_panel;panelstruct->state = &truly_1080p_video_state;panelstruct->laneconfig = &truly_1080p_video_lane_config;panelstruct->paneltiminginfo= &truly_1080p_video_timing_info;panelstruct->panelresetseq= &truly_1080p_video_panel_reset_seq;panelstruct->backlightinfo = &truly_1080p_video_backlight;pinfo->mipi.panel_on_cmds= truly_1080p_video_on_command;pinfo->mipi.num_of_panel_on_cmds= TRULY_1080P_VIDEO_ON_COMMAND;pinfo->mipi.panel_off_cmds= truly_1080p_video_off_command;pinfo->mipi.num_of_panel_off_cmds= TRULY_1080P_VIDEO_OFF_COMMAND;memcpy(phy_db->timing,truly_1080p_14nm_video_timings,MAX_TIMING_CONFIG * sizeof(uint32_t));pinfo->dfps.panel_dfps = truly_1080p_video_dfps;pinfo->mipi.signature = TRULY_1080P_VIDEO_SIGNATURE;break;。。。。。。 // 省略其他屏的代码return pan_type;}
标号2:mdss_dsi_panel_power
static int mdss_dsi_panel_power(uint8_t enable,struct msm_panel_info *pinfo){int ret = NO_ERROR;if (enable) {ret = target_ldo_ctrl(enable, pinfo);mdelay(1000);/* Panel Reset */if (!panelstruct.paneldata->panel_lp11_init) { // paneldata是在init_panel_data中被赋值的,取决于自己添加的panel-xxx.hret = mdss_dsi_panel_reset(enable);}dprintf(SPEW, "Panel power on done\n");} else {/* Disable panel and ldo */ret = mdss_dsi_panel_reset(enable);ret = target_ldo_ctrl(enable, pinfo);dprintf(SPEW, "Panel power off done\n");}return ret;}int target_ldo_ctrl(uint8_t enable, struct msm_panel_info *pinfo){int rc = 0;uint32_t ldo_num = REG_LDO6 | REG_LDO17;if (platform_is_msm8956())ldo_num |= REG_LDO1;else if (platform_is_sdm439() || platform_is_sdm429())ldo_num |= REG_LDO5; /* LDO23 is enable by default */elseldo_num |= REG_LDO2;if (enable) {gpio_tlmm_config(enable_pwr.pin_id, 0,enable_pwr.pin_direction, enable_pwr.pin_pull,enable_pwr.pin_strength,enable_pwr.pin_state); // 将电源引脚gpio22配置为 3(8ma), 1(输出引脚), 0(no pull), 1(disable)gpio_set_dir(enable_pwr.pin_id, 2); // 将gpio22设置为使能regulator_enable(ldo_num); //给L2、L6和L17供电使能,如果硬件只有gpio 供电时,这个可能并不需要mdelay(10);if(!pinfo->disable_wled_labibb) { // 在 gcdb_display_init 中已设置为 panel.panel_info.disable_wled_labibb = false;rc = wled_init(pinfo);if (target_get_pmic() == PMIC_IS_PMI632)rc = qpnp_lcdb_enable(true);elserc = qpnp_ibb_enable(true); /*5V boost*/mdelay(50);}} else {/** LDO1, LDO2, LDO5 and LDO6 are shared with other subsystems.* Do not disable them.*/regulator_disable(REG_LDO17);}return NO_ERROR;}struct gpio_pin{char *pin_source;uint32_t pin_id;uint32_t pin_strength;uint32_t pin_direction;uint32_t pin_pull;uint32_t pin_state;};static struct gpio_pin enable_pwr = {"msmgpio", 22, 3, 1, 0, 1};
void gpio_tlmm_config(uint32_t gpio, uint8_t func,
uint8_t dir, uint8_t pull,
uint8_t drvstr, uint32_t enable)
gpio 表示的是gpio要配置的端口号;func 该gpio的功能函数;dir 配置gpio的方向(0入1出);pull 配置该gpio的动作(0无1下2保持3上),drvstr为强度(0位2mA,1为4mA,依次加2),enable配置是否启用(0为enable,1为disable)
gpio_tlmm_config参数的取值
/* GPIO TLMM: Direction */#define GPIO_INPUT0#define GPIO_OUTPUT1/* GPIO TLMM: Pullup/Pulldown */#define GPIO_NO_PULL 0#define GPIO_PULL_DOWN 1#define GPIO_KEEPER2#define GPIO_PULL_UP 3/* GPIO TLMM: Drive Strength */#define GPIO_2MA 0#define GPIO_4MA 1#define GPIO_6MA 2#define GPIO_8MA 3#define GPIO_10MA 4#define GPIO_12MA 5#define GPIO_14MA 6#define GPIO_16MA 7/* GPIO TLMM: Status */#define GPIO_ENABLE0#define GPIO_DISABLE 1void gpio_set_dir(uint32_t gpio, uint32_t dir){writel(dir, (uint32_t *)GPIO_IN_OUT_ADDR(gpio));return;}
dir的取值为
#define GPIO_STATE_LOW 0 disable#define GPIO_STATE_HIGH 2 enable
屏的reset
static uint32_t mdss_dsi_panel_reset(uint8_t enable){uint32_t ret = NO_ERROR;if (panelstruct.panelresetseq)ret = target_panel_reset(enable, panelstruct.panelresetseq,&panel.panel_info); // panelresetseq是在init_panel_data中被赋值的,取决于自己添加的panel-xxx.hreturn ret;}int target_panel_reset(uint8_t enable, struct panel_reset_sequence *resetseq,struct msm_panel_info *pinfo){int ret = NO_ERROR;uint32_t hw_id = board_hardware_id();uint32_t hw_subtype = board_hardware_subtype();if (platform_is_msm8956()) {reset_gpio.pin_id = 25;bkl_gpio.pin_id = 66;} else if (platform_is_msm8937()) {reset_gpio.pin_id = 60;bkl_gpio.pin_id = 98;enable_gpio.pin_id = 99;} else if (platform_is_msm8917()) { // 硬件原理图显示为msm8917:_gpio,此时设置复位引脚为8号脚,背光使能引脚为93号脚,符合硬件原理图reset_gpio.pin_id = 8;bkl_gpio.pin_id = 93;pinfo->mipi.use_enable_gpio = 0;} else if (platform_is_sdm439() || platform_is_sdm429()) {reset_gpio.pin_id = 60;} else if ((hw_id == HW_PLATFORM_QRD) &&(hw_subtype == HW_PLATFORM_SUBTYPE_POLARIS)) {enable_gpio.pin_id = 19;}if (enable) {if (pinfo->mipi.use_enable_gpio && !platform_is_msm8956()) { // use_enable_gpio为0,不走此路gpio_tlmm_config(enable_gpio.pin_id, 0,enable_gpio.pin_direction, enable_gpio.pin_pull,enable_gpio.pin_strength,enable_gpio.pin_state);gpio_set_dir(enable_gpio.pin_id, 2);}if (platform_is_sdm439() || platform_is_sdm429()) { // 不走此路/* enable PM GPIO-4 for backlight enable */struct pm8x41_gpio gpio_param = {.direction = PM_GPIO_DIR_OUT,.function = PM_GPIO_FUNC_HIGH,.vin_sel = 0, /* VIN_0 */.pull = PM_GPIO_NO_PULL,.output_buffer = PM_GPIO_OUT_CMOS,.out_strength = PM_GPIO_OUT_DRIVE_HIGH,};dprintf(SPEW, "%s: gpio=%d enable=%d\n", __func__,bkl_en_gpio.pin_id, enable);pm8x41_gpio_config(bkl_en_gpio.pin_id, &gpio_param);} else { // 同文件的定义 static struct gpio_pin bkl_gpio = {"msmgpio", 91, 3, 1, 0, 1}// pin_id 已 被更改为93, 将其配置为3(8ma),1(输出引脚),0 (no pull),1 (disable) gpio_tlmm_config(bkl_gpio.pin_id, 0,bkl_gpio.pin_direction, bkl_gpio.pin_pull,bkl_gpio.pin_strength, bkl_gpio.pin_state);gpio_set_dir(bkl_gpio.pin_id, 2); // 将gpio93设置为 enable}// 同文件的定义 static struct gpio_pin enable_gpio = { "msmgpio", 90, 3, 1, 0, 1};// pin_id 已 被更改为8, 将其配置为3(8ma),1(输出引脚),0 (no pull),1 (disable) gpio_tlmm_config(reset_gpio.pin_id, 0,reset_gpio.pin_direction, reset_gpio.pin_pull,reset_gpio.pin_strength, reset_gpio.pin_state);gpio_set_dir(reset_gpio.pin_id, 2); // 将gpio8设置为 enable/*struct panel_reset_sequence { 前2个元素均为数组uint8_t pin_state[TOTAL_RESET_GPIO_CTRL];uint32_t sleep[TOTAL_RESET_GPIO_CTRL];uint8_t pin_direction;};panelresetseq举例static struct panel_reset_sequence truly_1080p_video_panel_reset_seq = {{ 1, 0, 1, }, { 200, 200, 200, }, 2};*//* reset */for (int i = 0; i < RESET_GPIO_SEQ_LEN; i++) { // 按照举例的时序,复位脚就是高低高if (resetseq->pin_state[i] == GPIO_STATE_LOW) gpio_set_dir(reset_gpio.pin_id, GPIO_STATE_LOW);elsegpio_set_dir(reset_gpio.pin_id, GPIO_STATE_HIGH);mdelay(resetseq->sleep[i]);}if (platform_is_msm8956()) { // 此路不走gpio_tlmm_config(lcd_mode_gpio.pin_id, 0,lcd_mode_gpio.pin_direction, lcd_mode_gpio.pin_pull,lcd_mode_gpio.pin_strength, lcd_mode_gpio.pin_state);if (pinfo->lcdc.split_display || pinfo->lcdc.dst_split)gpio_set_dir(lcd_mode_gpio.pin_id, GPIO_STATE_LOW);elsegpio_set_dir(lcd_mode_gpio.pin_id, GPIO_STATE_HIGH);}} else if(!target_cont_splash_screen()) { // 此路不走gpio_set_dir(reset_gpio.pin_id, 0);if (pinfo->mipi.use_enable_gpio && !platform_is_msm8956())gpio_set_dir(enable_gpio.pin_id, 0);if (platform_is_msm8956())gpio_set_dir(lcd_mode_gpio.pin_id, 0);}return ret;}
标号3: mdss_dsi_bl_enable // 背光部分以后再分析
static int mdss_dsi_bl_enable(uint8_t enable){int ret = NO_ERROR;ret = panel_backlight_ctrl(enable);return ret;}static uint32_t panel_backlight_ctrl(uint8_t enable){uint32_t ret = NO_ERROR;if (panelstruct.backlightinfo)ret = target_backlight_ctrl(panelstruct.backlightinfo, enable);return ret;}int target_backlight_ctrl(struct backlight *bl, uint8_t enable){uint32_t ret = NO_ERROR;if (bl->bl_interface_type == BL_DCS)return ret;if ((target_get_pmic() == PMIC_IS_PMI632) &&(bl->bl_interface_type == BL_PWM)) {ret = pwm_backlight_ctrl(enable);} else {ret = msm8952_wled_backlight_ctrl(enable);}return ret;}
标号 4: msm_display_init分析
int msm_display_init(struct msm_fb_panel_data *pdata){/* Turn on panel */if (pdata->power_func)ret = pdata->power_func(1, &(panel->panel_info)); // 给panel上电if (pdata->dfps_func)ret = pdata->dfps_func(&(panel->panel_info));/* Enable clock */if (pdata->clk_func)ret = pdata->clk_func(1, &(panel->panel_info)); // 使能CLKif (pdata->update_panel_info)ret = pdata->update_panel_info();if (pdata->pll_clk_func)ret = pdata->pll_clk_func(1, &(panel->panel_info)); //调用calculate_clock_config(pinfo)计算时钟配置和调用target_panel_clock(enable, pinfo)配置目标panel的时钟/* 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;}// 分配framebufferret = msm_fb_alloc(&(panel->fb));fbcon_setup(&(panel->fb));display_image_on_screen(); // 显示logo图片调用fetch_image_from_partition()从splash分区获取lk logo图片,如果splash分区没有满足要求的数据,就显示默认的logoif ((panel->dsi2HDMI_config) && (panel->panel_info.has_bridge_chip))ret = panel->dsi2HDMI_config(&(panel->panel_info));ret = msm_display_config();ret = msm_display_on();if (pdata->post_power_func)ret = pdata->post_power_func(1);/* Turn on backlight */if (pdata->bl_func)ret = pdata->bl_func(1);}
函数msm_display_config:根据不同类型的屏进行不同的配置
case MIPI_VIDEO_PANEL:dprintf(INFO, "Config MIPI_VIDEO_PANEL.\n");mdp_rev = mdp_get_revision();if (mdp_rev == MDP_REV_50 || mdp_rev == MDP_REV_304 ||mdp_rev == MDP_REV_305)ret = mdss_dsi_config(panel);elseret = mipi_config(panel);if (pinfo->early_config)ret = pinfo->early_config((void *)pinfo);ret = mdp_dsi_video_config(pinfo, &(panel->fb));break;int mdss_dsi_config(struct msm_fb_panel_data *panel){int ret = NO_ERROR;struct msm_panel_info *pinfo;struct mipi_panel_info *mipi;struct dsc_desc *dsc = NULL;struct mipi_dsi_cmd cmd;#if (DISPLAY_TYPE_MDSS == 1)if (!panel)return ERR_INVALID_ARGS;pinfo = &(panel->panel_info);mipi = &(pinfo->mipi);if (pinfo->compression_mode == COMPRESSION_DSC) {dsc = &pinfo->dsc;if (dsc) {if (dsc->dsc2buf)dsc->dsc2buf(pinfo);}}dprintf(SPEW, "ctl_base=0x%08x, phy_base=0x%08x\n", mipi->ctl_base,mipi->phy_base);mdss_dsi_phy_init(mipi); //初始化dsi接口ret = mdss_dsi_host_init(mipi, mipi->dual_dsi,mipi->broadcast); // 初始化dsi接口的host控制器mdss_dsi_phy_contention_detection(mipi, mipi->phy_base);if (mipi->dual_dsi)mdss_dsi_phy_contention_detection(mipi, mipi->sphy_base);if (panel->pre_init_func) {ret = panel->pre_init_func();}if (mipi->force_clk_lane_hs)mdss_dsi_force_clk_lane_hs(mipi, mipi->dual_dsi);if (!mipi->cmds_post_tg) {ret = mdss_dsi_panel_initialize(mipi, mipi->broadcast);if (ret) {dprintf(CRITICAL, "dsi panel init error\n");goto error;}}if (dsc) {cmd.size = DCS_HDR_LEN + DSC_PPS_LEN;cmd.payload = dsc->pps_buf;cmd.wait = 0x10;mdss_dsi_cmds_tx(mipi, &cmd, 1, mipi->broadcast);}if (pinfo->rotate && panel->rotate)pinfo->rotate();#endiferror:return ret;}
msm_display_on
case MIPI_VIDEO_PANEL:dprintf(INFO, "Turn on MIPI_VIDEO_PANEL.\n");ret = mdp_dsi_video_on(pinfo);ret = mdss_dsi_post_on(panel);ret = mipi_dsi_on(pinfo);
参考博客:/u010787514/article/details/82632684#3、屏幕进一步初始化及点亮