LCD在工作之前必须作一些初始化。下面讲的是在使用RGB模式时的主要初始化工作。
(1)LCD各引脚的GPIO设置
RGB接口的信号如图:
(2)设置LCD的大小、工作模式、时序等。
LCD的时序图:
查看LCD的手册,找出相应的VSPW,VBPD,VFPD,HSPW,HBPD,HFPD等值,将这些值设置到VIDTCON0, VIDTCON1, VIDTCON2及部分VIDCON0寄存器中。
示例代码:
oLcdc.m_uLcdHSz = 320;
oLcdc.m_uLcdVSz = 240;
oLcdc.m_uVidOutFormat = VIDOUT_RGBIF;
oLcdc.m_uDitherMode = RDITHPOS_8BIT|GDITHPOS_8BIT|BDITHPOS_8BIT;
oLcdc.m_uDitherMode &= ~DITHERING_ENABLE;
LcdcOutp32(rVIDCON1, IHSYNC_INVERT | IVSYNC_INVERT |IVDEN_INVERT); //Check
LcdcOutp32(rVIDTCON0, VBPDE(VBPD_LTV350QV) | VBPD(VBPD_LTV350QV) | VFPD(VFPD_LTV350QV) | VSPW(VSPW_LTV350QV));
LcdcOutp32(rVIDTCON1, VFPDE(VFPD_LTV350QV) | HBPD(HBPD_LTV350QV) | HFPD(HFPD_LTV350QV) | HSPW(HSPW_LTV350QV));
LcdcOutp32(rVIDTCON2, LINEVAL(oLcdc.m_uLcdVSz-1) | HOZVAL(oLcdc.m_uLcdHSz-1));
LcdcOutp32(rDITHMODE, oLcdc.m_uDitherMode); // Fixed Dithering Matrix
(3)设置LCD的时钟源、时钟分频
VSYNC是帧频率,HSYNC是行频率,VCLK是显示控制器行扫描时使用的频率,我们要设置的就是这个频率,通过设置寄存器VIDCON0的CLKVAL字段来设置VCLK的频率。
CLKVAL字段就是LCD时钟源的分频,它们的关系如下图所示:
要计算CLKVAL的值,先假设LCD的输出频率为60Hz,能过下面的公式可以得出CLKVAL:
示例代码:
//------------------------------------------------------------
// Function Name : LCD_GetClkValAndClkDir
//
// Function Desctiption :
// This function calculates clkval and determines clock source
//
// Input : uLcdHSz, lcd horizontal size
// uLcdVSz, lcd vertical size
//
// Output : uClkVal, clock value for wanted vclk
// uClkDir, clock source
//
// Version :
//------------------------------------------------------------
void LCD_GetClkValAndClkDir(u32 uLcdHSz, u32 uLcdVSz, u32* uClkVal, u32* uClkDir, CLK_SRC eClkSrc)
{
double dTmpVal, dVclkSrc;
u32 uTotalTime;
if(eClkSrc == SRC_HCLK)
{
LCD_SetClkSrc(SRC_HCLK);
dVclkSrc = g_HCLK; //should be changed in your system clock condition
}
else if(eClkSrc == SRC_MOUT_EPLL)
{
LCD_SetClkSrc(SRC_MOUT_EPLL);
dVclkSrc = 97700000; //should be changed in your system clock condition
}
else if(eClkSrc == SRC_DOUT_MPLL)
{
LCD_SetClkSrc(SRC_DOUT_MPLL);
dVclkSrc = 100000000; //should be changed in your system clock condition
}
else if(eClkSrc == SRC_FIN_EPLL)
{
LCD_SetClkSrc(SRC_FIN_EPLL);
dVclkSrc = 12000000; //should be changed in your system clock condition
}
else if(eClkSrc == SRC_27M)
dVclkSrc = 27000000;
#if (LCD_MODULE_TYPE == LTP700WV_RGB ||LCD_MODULE_TYPE ==LTE480WV_RGB)
uLcdHSz+= HBPD_LTP700WV + HFPD_LTP700WV + HSPW_LTP700WV +3;
uLcdVSz+= VBPD_LTP700WV + VFPD_LTP700WV + VSPW_LTP700WV +3;
#elif (LCD_MODULE_TYPE == LTS222QV_SRGB)
uLcdHSz = uLcdHSz*3 + HBPD_LTS222QV + HFPD_LTS222QV + HSPW_LTS222QV +3;
uLcdVSz+= VBPD_LTS222QV + VFPD_LTS222QV + VSPW_LTS222QV +3;
#elif (LCD_MODULE_TYPE == LTV300GV_RGB)
uLcdHSz += HBPD_LTV300GV + HFPD_LTV300GV + HSPW_LTV300GV +3;
uLcdVSz+= VBPD_LTV300GV + VFPD_LTV300GV + VSPW_LTV300GV +3;
#elif (LCD_MODULE_TYPE == LTV350QV_RGB)
uLcdHSz += HBPD_LTV350QV + HFPD_LTV350QV + HSPW_LTV350QV +3;
uLcdVSz+= VBPD_LTV350QV + VFPD_LTV350QV + VSPW_LTV350QV +3;
#endif
uTotalTime =
#if (LCD_MODULE_TYPE == LTS222QV_CPU)
CS_SETUP_TIME + WR_SETUP_TIME + WR_ACT_TIME + WR_HOLD_TIME + 4;
#else
1;
#endif
dTmpVal = dVclkSrc/(double)(uTotalTime*uLcdHSz*uLcdVSz*LCD_FRM_RATE) - 1;
dTmpVal = (dTmpVal+0.5)*10;
*uClkVal = (int)(dTmpVal/10.0);
*uClkDir = (*uClkVal<1) ? 0 : 1;
}