DISP_STATUS DISP_Init(UINT32 fbVA, UINT32 fbPA, BOOL isLcmInited) { DISP_STATUS r = DISP_STATUS_OK; if (!disp_drv_init_context()) { return DISP_STATUS_NOT_IMPLEMENTED; } // /* power on LCD before config its registers*/ // LCD_CHECK_RET(LCD_Init()); disp_drv_init_ctrl_if(); // For DSI PHY current leakage SW workaround. ///TODO: HOW!!! #if !defined (MTK_HDMI_SUPPORT) if((lcm_params->type!=LCM_TYPE_DSI) && (lcm_params->type!=LCM_TYPE_DPI)){ DSI_PHY_clk_switch(TRUE); DSI_PHY_clk_switch(FALSE); } #endif r = (disp_drv->init) ? (disp_drv->init(fbVA, fbPA, isLcmInited)) : DISP_STATUS_NOT_IMPLEMENTED; return r; }
DISP_STATUS DISP_SetBacklight_mode(UINT32 mode) { DISP_STATUS ret = DISP_STATUS_OK; disp_drv_init_context(); LCD_WaitForNotBusy(); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode == CMD_MODE) DSI_CHECK_RET(DSI_WaitForNotBusy()); if (!lcm_drv->set_backlight) { ret = DISP_STATUS_NOT_IMPLEMENTED; goto End; } if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) DSI_SetMode(CMD_MODE); lcm_drv->set_backlight_mode(mode); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) DSI_SetMode(lcm_params->dsi.mode); End: return ret; }
UINT32 DISP_GetPanelBPP(void) { PANEL_COLOR_FORMAT fmt; disp_drv_init_context(); if(disp_drv->get_panel_color_format == NULL) { return DISP_STATUS_NOT_IMPLEMENTED; } fmt = disp_drv->get_panel_color_format(); switch(fmt) { case PANEL_COLOR_FORMAT_RGB332: return 8; case PANEL_COLOR_FORMAT_RGB444: return 12; case PANEL_COLOR_FORMAT_RGB565: return 16; case PANEL_COLOR_FORMAT_RGB666: return 18; case PANEL_COLOR_FORMAT_RGB888: return 24; default: return 0; } }
PANEL_COLOR_FORMAT DISP_GetPanelColorFormat(void) { disp_drv_init_context(); return (disp_drv->get_panel_color_format) ? (disp_drv->get_panel_color_format()) : DISP_STATUS_NOT_IMPLEMENTED; }
UINT32 DISP_GetOutputBPPforDithering(void) { disp_drv_init_context(); return (disp_drv->get_dithering_bpp) ? (disp_drv->get_dithering_bpp()) : DISP_STATUS_NOT_IMPLEMENTED; }
DISP_STATUS DISP_SetFrameBufferAddr(UINT32 fbPhysAddr) { disp_drv_init_context(); return (disp_drv->set_fb_addr) ? (disp_drv->set_fb_addr(fbPhysAddr)) : DISP_STATUS_NOT_IMPLEMENTED; }
DISP_STATUS DISP_Capture_Framebuffer(unsigned int pvbuf, unsigned int bpp) { DISP_FUNC(); disp_drv_init_context(); return (disp_drv->capture_framebuffer) ? (disp_drv->capture_framebuffer(pvbuf, bpp)) : DISP_STATUS_NOT_IMPLEMENTED; }
DISP_STATUS DISP_Capture_Videobuffer(unsigned int pvbuf, unsigned int bpp, unsigned int video_rotation) { DISP_FUNC(); if (down_interruptible(&sem_update_screen)) { DISP_LOG("ERROR: Can't get sem_update_screen in DISP_Capture_Videobuffer()\n"); return DISP_STATUS_ERROR; } disp_drv_init_context(); LCD_Capture_Videobuffer(pvbuf, bpp, video_rotation); up(&sem_update_screen); return DISP_STATUS_OK; }
DISP_STATUS DISP_PanelEnable(BOOL enable) { static BOOL s_enabled = FALSE; disp_drv_init_context(); if (!lcm_drv->suspend || !lcm_drv->resume) { return DISP_STATUS_NOT_IMPLEMENTED; } if (enable && !s_enabled) { s_enabled = TRUE; if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DSI_SetMode(CMD_MODE); } lcm_drv->resume(); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { //DSI_clk_HS_mode(1); DSI_SetMode(lcm_params->dsi.mode); //DPI_CHECK_RET(DPI_EnableClk()); //DSI_CHECK_RET(DSI_EnableClk()); } } else if (!enable && s_enabled) { LCD_CHECK_RET(LCD_WaitForNotBusy()); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode == CMD_MODE) DSI_CHECK_RET(DSI_WaitForNotBusy()); s_enabled = FALSE; if (lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DPI_CHECK_RET(DPI_DisableClk()); udelay(200*1000); DSI_Reset(); DSI_clk_HS_mode(0); DSI_SetMode(CMD_MODE); } lcm_drv->suspend(); } return DISP_STATUS_OK; }
BOOL DISP_EsdRecoverCapbility(void) { if(!disp_drv_init_context()) return FALSE; if(lcm_drv->esd_check && lcm_drv->esd_recover) { return TRUE; } else { return FALSE; } }
DISP_STATUS DISP_PowerEnable(BOOL enable) { static BOOL s_enabled = FALSE; if (enable != s_enabled) s_enabled = enable; else return ; disp_drv_init_context(); return (disp_drv->enable_power) ? (disp_drv->enable_power(enable)) : DISP_STATUS_NOT_IMPLEMENTED; }
DISP_STATUS DISP_Init(UINT32 fbVA, UINT32 fbPA, BOOL isLcmInited) { if (!disp_drv_init_context()) { return DISP_STATUS_NOT_IMPLEMENTED; } /* power on LCD before config its registers*/ LCD_CHECK_RET(LCD_Init()); disp_drv_init_ctrl_if(); // disp_drv_set_io_driving_current(); return (disp_drv->init) ? (disp_drv->init(fbVA, fbPA, isLcmInited)) : DISP_STATUS_NOT_IMPLEMENTED; }
DISP_STATUS DISP_GetPWM(UINT32 divider, unsigned int *freq) { DISP_STATUS ret = DISP_STATUS_OK; disp_drv_init_context(); if (!lcm_drv->get_pwm) { ret = DISP_STATUS_NOT_IMPLEMENTED; goto End; } *freq = lcm_drv->get_pwm(divider); End: return ret; }
BOOL DISP_SelectDevice(const char* lcm_name) { LCD_STATUS ret; ret = LCD_Init(); printf("ret of LCD_Init() = %d\n", ret); lcm_drv = disp_drv_get_lcm_driver(lcm_name); if (NULL == lcm_drv) { printf("%s, disp_drv_get_lcm_driver() returns NULL\n", __func__); return FALSE; } disp_dump_lcm_parameters(lcm_params); return disp_drv_init_context(); }
DISP_STATUS DISP_SetBacklight(UINT32 level) { DISP_STATUS ret = DISP_STATUS_OK; disp_drv_init_context(); LCD_WaitForNotBusy(); if (!lcm_drv->set_backlight) { ret = DISP_STATUS_NOT_IMPLEMENTED; goto End; } lcm_drv->set_backlight(level); End: return ret; }
DISP_STATUS DISP_SetPWM(UINT32 divider) { DISP_STATUS ret = DISP_STATUS_OK; disp_drv_init_context(); LCD_WaitForNotBusy(); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode == CMD_MODE) DSI_CHECK_RET(DSI_WaitForNotBusy()); if (!lcm_drv->set_pwm) { ret = DISP_STATUS_NOT_IMPLEMENTED; goto End; } lcm_drv->set_pwm(divider); End: return ret; }
DISP_STATUS DISP_ConfigImmediateUpdate(BOOL enable) { disp_drv_init_context(); if(enable == TRUE) { LCD_TE_Enable(FALSE); } else { if(disp_drv->init_te_control) disp_drv->init_te_control(); else return DISP_STATUS_NOT_IMPLEMENTED; } is_immediateupdate = enable; return DISP_STATUS_OK; }
UINT32 DISP_GetVRamSize(void) { // Use a local static variable to cache the calculated vram size // static UINT32 vramSize = 0; if (0 == vramSize) { disp_drv_init_context(); vramSize = disp_drv->get_vram_size(); // Align vramSize to 1MB // vramSize = ALIGN_TO_POW_OF_2(vramSize, 0x100000); //printf("DISP_GetVRamSize: %u bytes\n", vramSize); } return vramSize; }
BOOL DISP_EsdCheck(void) { BOOL result = FALSE; disp_drv_init_context(); if(lcm_drv->esd_check == NULL) { return FALSE; } #if defined(CONFIG_ARCH_MT6575) if(get_chip_eco_ver()==CHIP_E1 && lcm_params->type==LCM_TYPE_DSI) { ///DSI read is inavailable for E1 return FALSE; } #endif if (down_interruptible(&sem_update_screen)) { DISP_LOG("ERROR: Can't get sem_update_screen in DISP_EsdCheck()\n"); return FALSE; } if(is_lcm_in_suspend_mode) { up(&sem_update_screen); return FALSE; } LCD_CHECK_RET(LCD_WaitForNotBusy()); if(lcm_params->type==LCM_TYPE_DSI) DSI_CHECK_RET(DSI_WaitForNotBusy()); result = lcm_drv->esd_check(); up(&sem_update_screen); return result; }
DISP_STATUS DISP_PowerEnable(BOOL enable) { DISP_STATUS ret = DISP_STATUS_OK; static BOOL s_enabled = TRUE; if (enable != s_enabled) s_enabled = enable; else return ret; if (down_interruptible(&sem_update_screen)) { DISP_LOG("ERROR: Can't get sem_update_screen in DISP_PowerEnable()\n"); return DISP_STATUS_ERROR; } disp_drv_init_context(); is_engine_in_suspend_mode = enable ? FALSE : TRUE; ret = (disp_drv->enable_power) ? (disp_drv->enable_power(enable)) : DISP_STATUS_NOT_IMPLEMENTED; if (enable) { DAL_OnDispPowerOn(); } // If in direct link mode, re-start LCD after system resume // if (enable && -1 != direct_link_layer) { LCD_CHECK_RET(LCD_StartTransfer(FALSE)); } up(&sem_update_screen); return ret; }
UINT32 DISP_GetScreenHeight(void) { disp_drv_init_context(); return lcm_params->height; }
UINT32 DISP_GetScreenWidth(void) { disp_drv_init_context(); return lcm_params->width; }
DISP_STATUS DISP_PanelEnable(BOOL enable) { static BOOL s_enabled = TRUE; DISP_STATUS ret = DISP_STATUS_OK; DISP_LOG("panel is %s\n", enable?"enabled":"disabled"); if (down_interruptible(&sem_update_screen)) { DISP_LOG("ERROR: Can't get sem_update_screen in DISP_PanelEnable()\n"); return DISP_STATUS_ERROR; } disp_drv_init_context(); is_lcm_in_suspend_mode = enable ? FALSE : TRUE; if (!lcm_drv->suspend || !lcm_drv->resume) { ret = DISP_STATUS_NOT_IMPLEMENTED; goto End; } if (enable && !s_enabled) { s_enabled = TRUE; if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DSI_SetMode(CMD_MODE); } lcm_drv->resume(); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { //DSI_clk_HS_mode(1); DSI_SetMode(lcm_params->dsi.mode); //DPI_CHECK_RET(DPI_EnableClk()); //DSI_CHECK_RET(DSI_EnableClk()); msleep(200); } } else if (!enable && s_enabled) { LCD_CHECK_RET(LCD_WaitForNotBusy()); if(lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode == CMD_MODE) DSI_CHECK_RET(DSI_WaitForNotBusy()); s_enabled = FALSE; if (lcm_params->type==LCM_TYPE_DSI && lcm_params->dsi.mode != CMD_MODE) { DPI_CHECK_RET(DPI_DisableClk()); //msleep(200); DSI_Reset(); DSI_clk_HS_mode(0); DSI_SetMode(CMD_MODE); } lcm_drv->suspend(); } End: up(&sem_update_screen); return ret; }