[DESCRIPTION]
MT6589 DSI Video Mode的屏,加入ESD机制后每隔2S会闪一下屏,但是把MIPI clock改为
MT6589 DSI Video Mode的屏,加入ESD机制后每隔2S会闪一下屏,但是把MIPI clock改为
continuous clock则不会闪屏。 则属于这种情况,可以按照以下方法进行修改。
以SSD2075为例:
Root cause: SSD2075 IC内的电压DVDDH由MIPI clock generate形成。
MIPI clock一旦停掉,DVDDH就会drop,理论上就会有闪屏。 但是如果MIPI clock停掉的时间较短
的话,这个闪屏是不会被人眼所察觉到。
[SOLUTION]
解决思路:当读寄存器的时候,让MIPI clock保持HS 状态。
读完之后再把MIPI clock切到LP的bit 位置位
具体修改方法如下:
在alps/mediatek/kernel/drivers/video/disp_drv.c中
(1) 添加下面一行定义
static PDSI_REGS const DSI_REG = (PDSI_REGS)(DSI_BASE); //add by mtk
(1) 添加下面一行定义
static PDSI_REGS const DSI_REG = (PDSI_REGS)(DSI_BASE); //add by mtk
(2) 在DISP_ESDCheck()函数中添加几行,红色标记
BOOL DISP_EsdCheck(void)
{
BOOL result = FALSE;
DSI_TXRX_CTRL_REG tmp_reg; //add by mtk
tmp_reg=DSI_REG->DSI_TXRX_CTRL; //add by mtk
tmp_reg.HSTX_CKLP_EN = 0; //add by mtk
DSI_clk_HS_mode(1); //add by mtk
disp_drv_init_context();
MMProfileLogEx(MTKFB_MMP_Events.EsdCheck, MMProfileFlagPulse, 0x10, 0);
if(lcm_drv->esd_check == NULL && disp_drv->esd_check == NULL)
{
return FALSE;
}
if (down_interruptible(&sem_update_screen)) {
printk("ERROR: Can't get sem_update_screen in DISP_EsdCheck()\n");
return FALSE;
}
MMProfileLogEx(MTKFB_MMP_Events.EsdCheck, MMProfileFlagPulse, 0x11, 0);
if(is_lcm_in_suspend_mode)
{
up(&sem_update_screen);
return FALSE;
}
if(disp_drv->esd_check)
result |= disp_drv->esd_check();
MMProfileLogEx(MTKFB_MMP_Events.EsdCheck, MMProfileFlagPulse, 0x12, 0);
#ifndef MT65XX_NEW_DISP
LCD_CHECK_RET(LCD_WaitForNotBusy());
if(lcm_params->type==LCM_TYPE_DSI)
DSI_CHECK_RET(DSI_WaitForNotBusy());
if(lcm_drv->esd_check)
{
mutex_lock(&LcmCmdMutex);
result |= lcm_drv->esd_check();
mutex_unlock(&LcmCmdMutex);
}
#endif
up(&sem_update_screen);
tmp_reg.HSTX_CKLP_EN = 1; //add by mtk
return result;
}
{
BOOL result = FALSE;
DSI_TXRX_CTRL_REG tmp_reg; //add by mtk
tmp_reg=DSI_REG->DSI_TXRX_CTRL; //add by mtk
tmp_reg.HSTX_CKLP_EN = 0; //add by mtk
DSI_clk_HS_mode(1); //add by mtk
disp_drv_init_context();
MMProfileLogEx(MTKFB_MMP_Events.EsdCheck, MMProfileFlagPulse, 0x10, 0);
if(lcm_drv->esd_check == NULL && disp_drv->esd_check == NULL)
{
return FALSE;
}
if (down_interruptible(&sem_update_screen)) {
printk("ERROR: Can't get sem_update_screen in DISP_EsdCheck()\n");
return FALSE;
}
MMProfileLogEx(MTKFB_MMP_Events.EsdCheck, MMProfileFlagPulse, 0x11, 0);
if(is_lcm_in_suspend_mode)
{
up(&sem_update_screen);
return FALSE;
}
if(disp_drv->esd_check)
result |= disp_drv->esd_check();
MMProfileLogEx(MTKFB_MMP_Events.EsdCheck, MMProfileFlagPulse, 0x12, 0);
#ifndef MT65XX_NEW_DISP
LCD_CHECK_RET(LCD_WaitForNotBusy());
if(lcm_params->type==LCM_TYPE_DSI)
DSI_CHECK_RET(DSI_WaitForNotBusy());
if(lcm_drv->esd_check)
{
mutex_lock(&LcmCmdMutex);
result |= lcm_drv->esd_check();
mutex_unlock(&LcmCmdMutex);
}
#endif
up(&sem_update_screen);
tmp_reg.HSTX_CKLP_EN = 1; //add by mtk
return result;
}