裸机S3C6410显示控制器(2)-RGB模式下初始化显示控制器

版权声明:☆☆☆原创文章,转载请注明来自: https://blog.csdn.net/xgbing/article/details/7791113

    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;

 }



没有更多推荐了,返回首页