[DESCRIPTION]
ili9806c和ili9805c在开启ESD机制使用过程中概率性出现闪线,闪线颜色和当前屏幕最下方颜色类似,而关闭ESD,则不会复现问题
[SOLUTION]
该问题原因是ILITEK这两颗video mode IC在停掉数据后会内部启count报Hsync,再开启ESD机制后,read完寄存器后,其内部Hsync有可能会撞到第一次的Vsync,这样就会导致HS的第一条line异常,采用最后一条line去补到第一条line。
可以如下修改:
mediatek\platform\mt6572\kernel\drivers\video\dsi_drv.c
添加如下红色部分code
DSI_STATUS DSI_StartTransfer(bool isMutexLocked)
{
……
DSI_WaitForEngineNotBusy();
#if 1 //3 add by MTK haitao for send Hsync package
while(DSI_REG->DSI_INTSTA.BUSY);
{
……
DSI_WaitForEngineNotBusy();
#if 1 //3 add by MTK haitao for send Hsync package
while(DSI_REG->DSI_INTSTA.BUSY);
OUTREG32(&DSI_REG->DSI_INTSTA,
0x0);
DSI_clk_HS_mode(1);
DSI_BackUpCmdQ();
DSI_SetMode(CMD_MODE);
UTREGBIT(DSI_INT_ENABLE_REG,DSI_REG->DSI_INTEN,RD_RDY,0);
UTREGBIT(DSI_INT_ENABLE_REG,DSI_REG->DSI_INTEN,CMD_DONE,0);
OUTREG32(&DSI_CMDQ_REG->data[0], 0x00002100);
OUTREG32(&DSI_REG->DSI_CMDQ_SIZE, 1);
OUTREGBIT(DSI_START_REG,DSI_REG->DSI_START,DSI_START,0);
OUTREGBIT(DSI_START_REG,DSI_REG->DSI_START,DSI_START,1);
while(DSI_REG->DSI_INTSTA.CMD_DONE == 0);
OUTREGBIT(DSI_INT_STATUS_REG,DSI_REG->DSI_INTSTA,CMD_DONE,0);
UDELAY(20);
OUTREG32(&DSI_CMDQ_REG->data[0], 0x00003100);
OUTREG32(&DSI_REG->DSI_CMDQ_SIZE, 1);
OUTREGBIT(DSI_START_REG,DSI_REG->DSI_START,DSI_START,0);
OUTREGBIT(DSI_START_REG,DSI_REG->DSI_START,DSI_START,1);
while(DSI_REG->DSI_INTSTA.CMD_DONE == 0);
OUTREGBIT(DSI_INT_STATUS_REG,DSI_REG->DSI_INTSTA,CMD_DONE,0);
OUTREGBIT(DSI_INT_ENABLE_REG,DSI_REG->DSI_INTEN,RD_RDY,1);
OUTREGBIT(DSI_INT_ENABLE_REG,DSI_REG->DSI_INTEN,CMD_DONE,1);
DSI_RestoreCmdQ();
DSI_SetMode(lcm_params->dsi.mode);
DSI_clk_HS_mode(1);
#endif
// To trigger frame update.
DSI_Start();
……
}
DSI_clk_HS_mode(1);
DSI_BackUpCmdQ();
DSI_SetMode(CMD_MODE);
UTREGBIT(DSI_INT_ENABLE_REG,DSI_REG->DSI_INTEN,RD_RDY,0);
UTREGBIT(DSI_INT_ENABLE_REG,DSI_REG->DSI_INTEN,CMD_DONE,0);
OUTREG32(&DSI_CMDQ_REG->data[0], 0x00002100);
OUTREG32(&DSI_REG->DSI_CMDQ_SIZE, 1);
OUTREGBIT(DSI_START_REG,DSI_REG->DSI_START,DSI_START,0);
OUTREGBIT(DSI_START_REG,DSI_REG->DSI_START,DSI_START,1);
while(DSI_REG->DSI_INTSTA.CMD_DONE == 0);
OUTREGBIT(DSI_INT_STATUS_REG,DSI_REG->DSI_INTSTA,CMD_DONE,0);
UDELAY(20);
OUTREG32(&DSI_CMDQ_REG->data[0], 0x00003100);
OUTREG32(&DSI_REG->DSI_CMDQ_SIZE, 1);
OUTREGBIT(DSI_START_REG,DSI_REG->DSI_START,DSI_START,0);
OUTREGBIT(DSI_START_REG,DSI_REG->DSI_START,DSI_START,1);
while(DSI_REG->DSI_INTSTA.CMD_DONE == 0);
OUTREGBIT(DSI_INT_STATUS_REG,DSI_REG->DSI_INTSTA,CMD_DONE,0);
OUTREGBIT(DSI_INT_ENABLE_REG,DSI_REG->DSI_INTEN,RD_RDY,1);
OUTREGBIT(DSI_INT_ENABLE_REG,DSI_REG->DSI_INTEN,CMD_DONE,1);
DSI_RestoreCmdQ();
DSI_SetMode(lcm_params->dsi.mode);
DSI_clk_HS_mode(1);
#endif
// To trigger frame update.
DSI_Start();
……
}