It is found that calling LCDIFDisplayFrameBuffer(..) is critical to gpio interrupts.
BOOL LCDIFDisplayFrameBuffer(const void* pData)
{
hw_lcdif_ctrl_t ctrl_reg;
UINT32 physAddress;
ctrl_reg.U = HW_LCDIF_CTRL_RD();
physAddress = (UINT32) pData;
if (ctrl_reg.B.DOTCLK_MODE || ctrl_reg.B.DVI_MODE) {
HW_LCDIF_NEXT_BUF_WR(physAddress);
if (ctrl_reg.B.RUN != 1)
HW_LCDIF_CUR_BUF_WR(physAddress);
} else {
if (ctrl_reg.B.RUN == 1)
while (HW_LCDIF_CTRL.B.RUN == 1) ;
HW_LCDIF_CUR_BUF_WR(physAddress);
} //if/else
ctrl_reg.B.DATA_SELECT = DATA_MODE;
ctrl_reg.B.WAIT_FOR_VSYNC_EDGE = ctrl_reg.B.VSYNC_MODE;
ctrl_reg.B.RUN = 1;
HW_LCDIF_CTRL_WR(ctrl_reg.U);
return TRUE;
}
After calling LCDIFDisplayFrameBuffer(), gpio interrupts works fine. If I just comment all the code in LCDIFDisplayFrameBuffer(), gpio interrupts fail! HW_LCDIF_CTRL register is NOT related with GPIO at all, incredibel!
The behavior of gpio interrupt is like X_CLK is slow down so that interrupt pulse (about 84ns) can not be detected. HW_CLKCTRL_XBUS.DIV is set to 1, therfore the X_CLK should be 24MHz.