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);
-
- 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);
(3)设置LCD的时钟源、时钟分频
VSYNC是帧频率,HSYNC是行频率,VCLK是显示控制器行扫描时使用的频率,我们要设置的就是这个频率,通过设置寄存器VIDCON0的CLKVAL字段来设置VCLK的频率。
CLKVAL字段就是LCD时钟源的分频,它们的关系如下图所示:
要计算CLKVAL的值,先假设LCD的输出频率为60Hz,能过下面的公式可以得出CLKVAL:
示例代码:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 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;
- }
- else if(eClkSrc == SRC_MOUT_EPLL)
- {
- LCD_SetClkSrc(SRC_MOUT_EPLL);
- dVclkSrc = 97700000;
- }
- else if(eClkSrc == SRC_DOUT_MPLL)
- {
- LCD_SetClkSrc(SRC_DOUT_MPLL);
- dVclkSrc = 100000000;
- }
- else if(eClkSrc == SRC_FIN_EPLL)
- {
- LCD_SetClkSrc(SRC_FIN_EPLL);
- dVclkSrc = 12000000;
- }
- 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;
-
- }