//------------------------------------------------------------
// Function Name : LCD_SetClkSrc
//
// Function Desctiption :
// This function sets video clock source
//
//------------------------------------------------------------
void LCD_SetClkSrc(CLK_SRC eClkSrc)
{
u32 uVidConVal;
u32 uClkSrc, uEpllCon0;
uClkSrc =
(eClkSrc == SRC_HCLK) ? H_CLK_INPUT :
(eClkSrc == SRC_27M) ? EXT_CLK_1_INPUT : EXT_CLK_0_INPUT;
uVidConVal=Inp32(LCD_BASE+rVIDCON0);
uVidConVal &= ~(0x3<<2);
uVidConVal |= uClkSrc;
LcdcOutp32(rVIDCON0, uVidConVal);
uClkSrc = Inp32SYSC(0x1C);
uEpllCon0 = Inp32SYSC(0x14);
if(eClkSrc == SRC_MOUT_EPLL)
{
Outp32SYSC(0x14, uEpllCon0 |(1u<<31));
Delay(100);
Outp32SYSC(0x1C, uClkSrc & ~(0x3<<26) |(1<<2));
}
else if (eClkSrc == SRC_DOUT_MPLL) Outp32SYSC(0x1C, uClkSrc & ~(0x3<<26)|(1<<26));
else if (eClkSrc == SRC_FIN_EPLL) Outp32SYSC(0x1C, uClkSrc & ~(0x3<<7)|(2<<26));
}
根据LCD时钟源的类型来设置寄存器,时钟源可能是:
typedef enum
{
SRC_HCLK, SRC_MOUT_EPLL, SRC_DOUT_MPLL, SRC_FIN_EPLL, SRC_27M
} CLK_SRC;
(1)设置VIDCON0寄存器
如果时钟源是HCLK或27M,只需设置此寄存器。如果是SRC_MOUT_EPLL, SRC_DOUT_MPLL, SRC_FIN_EPLL,还需要设置系统控制器中的CLKSRC寄存器
(2)设置系统控制器中的CLKSRC寄存器,选择LCD的时钟源
第26,27位是LCD_SEL字段。
另外EPLLCON0的31位表示启用EPLL: