S3C2440有兩個PLL(phase locked loop)一個是MPLL,一個是UPLL。MPLL用於CPU及其他外圍器件,UPLL用於USB。用於產生FCLK, HCLK, PCLK三種頻率,這三種頻率分別有不同的用途:
FCLK是CPU提供的時鐘信號。
HCLK是為AHB總線提供的時鐘信號, Advanced High-performance Bus,主要用於高速外設,比如內存控制器,中斷控制器,LCD控制器, DMA 等。
從S3C2440的DataSheet裡可以看到,S3C2440最大支持400MHz的主頻,但是這並不意味著一定工作在400MHz下面,可以通過設定MPLL, UPLL寄存器來設定CPU的工作頻率。 盡管在CPU上電(power-on)或者復位(reset)後,MPLL就開始進入工作狀態,但是此時MPLL的輸出(Mpll)並不作為系統的時鐘,而是直接使用外部信號EXTCLK或者外部時鐘晶振作為系統時鐘。直到軟件初始化MPLL寄存器(rMPLLCON),寫入了有效的值過後,系統才開始使用MPLL的輸出(Mpll)作為系統時鐘。雖然很多時候我們不必重新設置MPLL寄存器(rMPLLCON)新的值,但是為了使系統使用其輸出作為時鐘信號,在軟件初始化系統部分,還是要向rMPLLCON寫入一個有效的舊的值。這樣子才使系統處於正確的工作狀態。
關於MPLL的計算方法
1. U32 mpll_val=0;
mpll_val = (92<<12)|(1<<4)|(1);
算得mpll_val的二進制:0101 1100 0000 0001 0001
注意:(92<<12)中的92為十進制數,轉換為二進制為0x5C。
2. ChangeMPllValue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);
代入1算得:ChangeMPllValue(0x5C,1,1);
3. 找到ChangeMPllValue子函數
void ChangeMPllValue(int mdiv,int pdiv,int sdiv)
{
rMPLLCON = (mdiv<<12) | (pdiv<<4) | sdiv;
}
4. 調用子函數,得到rMPLLCON二進制為:0101 1100 0000 0001 0001
5. 根據S3C2440A官方datasheet:
PLLCON Bit Deion
MDIV [19:12] Main divider control
PDIV [9:4] Pre-divider control
SDIV [1;0] Post divider control
以及MPLL Control Register
Mpll=(2*m*Fin)/(p*2s)
m=(MDIV+8) p=(PDIV+2) s=SDIV
因rMPLLCON二進制為:0101 1100 0000 0001 0001,所以
m=(MDIV+8)=([19:12]+8)=92+8=100
p=(PDIV+2)=([9:4]+2)=1+2=3
s=SDIV=[1:0]=1
Mpll=(2*m*Fin)/(p*2s)=(2*100*12)/(3*2)=400M
PCLK是為APB總線提供的時鐘信號,Advanced Peripherals Bus,主要用於低速外設,比如看門狗,UART控制器, IIS, I2C, SDI/MMC, GPIO,RTC and SPI等。
---------------------------------分割線---------------------------------
S3C2440上RTC時鐘驅動開發實例分析 http://www.linuxidc.com/Linux/2013-06/86042.htm
S3C2440的UART功能測試 http://www.linuxidc.com/Linux/2013-05/85158.htm
S3C2440 地址分配硬件連接及其啟動原理分析 http://www.linuxidc.com/Linux/2013-04/83218.htm
S3C2440時鐘設置 http://www.linuxidc.com/Linux/2013-03/81245.htm
linux-2.6.14移植到S3C2440 http://www.linuxidc.com/Linux/2012-12/77125.htm
S3C2440開發板LED驅動——ioremap 映射 http://www.linuxidc.com/Linux/2012-12/76084.htm
---------------------------------分割線---------------------------------