歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> S3C2440時鐘設置

S3C2440時鐘設置

日期:2017/3/1 9:59:59   编辑:Linux編程

S3C2440時鐘設置

#define MDIV_405 0x7f << 12

#define PSDIV_405 0x21

#define LOCKTIME_OFFSET 0x00

#define MPLLCON_OFFSET 0x04

#define CLKCON_OFFSET 0x0c

#define CLKDIVN_OFFSET 0x14

#define CAMDIVN_OFFSET 0x18

/*******************************************************************************************

* Reference to S3C2440 datasheet: Chap 7 Clock&Power Management

*

* Initialize System Clock FCLK=400MHz HCLK=100MHz PCLK=50MHz

* FCLK is used by ARM920T

* HCLK is used for AHB bus, which is used by the ARM920T, the memory controller,

* the interrupt controller, the LCD controller, the DMA and USB host block.

* PCLK is is used for APB bus,which is used by the peripherals such as WDT,IIS,I2C,

* PWM timer,MMC interface,ADC,UART,GPIO,RTC and SPI.

******************************************************************************************/


/*Set LOCKTIME as default value 0x00ffffff*/

ldr r0, =ELFIN_CLOCK_POWER_BASE

ldr r1, =0x00ffffff

str r1, [r0, #LOCKTIME_OFFSET] /*Set Clock Divider*/


/*******************************************************************************************

* Reference to S3C2440 datasheet: Chap 7-8 ~ Page 242

*

* Set the selection of Dividing Ratio between FCLK,HCLK and PCLK as FCLK:HCLK:PCLK = 1:4:8.

* This ratio is determined by HDIVN(here is 2) and PDIVN(here is 1) control register.

* Refer to the s3c2440 datasheet

*******************************************************************************************/


ldr r0, =ELFIN_CLOCK_POWER_BASE

mov r1, #5

str r1, [r0, #CLKDIVN_OFFSET] /*Set Clock Divider*/

mrc p15, 0, r1, c1, c0, 0

orr r1, r1, #0xc0000000

mcr p15, 0, r1, c1, c0, 0

/***************************************************************************************

* Reference to S3C2440 datasheet: Chap 7-20 ~ Page 254

*

* Set MPLLCON(0x4C000004) register as:

* [19:12]: MDIV(Main Divider control)=0x7F

* [9:4]: PDIV(Pre-devider control)=0x02

* [1:0]: SDIV(Post divider control)=0x01

*

* MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)

* m=(MDIV+8), p=(PDIV+2), s=SDIV

*

* So FCLK=((2*(127+8)*Fin)) / ((2+2)*2^1)

* = (2*135*12MHz)/8

* = 405MHz

* For FCLK:HCLK:PCLK=1:4:8, so HCLK=100MHz, PCLK=50MHz

***************************************************************************************/


mov r1, #ELFIN_CLOCK_POWER_BASE

mov r2, #MDIV_405

add r2, r2, #PSDIV_405

str r2, [r1, #MPLLCON_OFFSET]

/* wait at least 200us to stablize all clock */

mov r2, #0x10000

1: subs r1, r1, #1

bne 1b

mov pc, lr

S3C2440 CPU默認的工作主頻為12MHz或16.9344MHz,在我的2440的開發板上上使用的是12MHZ,這裡使用最多的也是12M。使用PLL電路可以產生更高的主頻供CPU及外圍器件使用。

S3C2440有兩個PLL:MPLL和UPLL,UPLL專用與USB設備。MPLL用於CPU及其他外圍器件。

通過MPLL會產生三個部分的時鐘頻率:FCLK、HCLK、PLCK。FCLK用於CPU核,HCLK用於AHB總線的設備(比如SDRAM),PCLK用於APB總線的設備(比如UART)。

設置S3c2440的時鐘頻率就是設置MPLL的幾個寄存器:

1、LOCKTIME:設為0x00ffffff

MPLL啟動後需要等待一段時間(Lock Time),使得其輸出穩定。位[23:12]用於UPLL,位[11:0]用於MPLL。使用確省值0x00ffffff即可。

2、CLKDIVN:用來設置FCLK:HCLK:PCLK的比例關系,默認為1:1:1

這裡值設為0x05(HDIVN=2, PDIVN=1),即FCLK:HCLK:PCLK=1:4:8

3、MPLLCON:設為(0x7f << 12)|(0x02 << 4)|(0x01),即0x7f0021

對於MPLLCON寄存器,[19:12]為MDIV,[9:4]為PDIV,[1:0]為SDIV。有如下計算公式:

MPLL(FCLK) = (2 * m * Fin)/(p * 2^s)

m=(MDIV+8), p=(PDIV+2), s=SDIV Fin 即默認輸入的時鐘頻率12MHz。MPLLCON設為0x7f0021,可以計算出FCLK=400MHz,再由CLKDIVN的設置可知:HCLK=100MHz,PCLK=50MHz。

到這裡我們應該徹底弄清楚了程序中經常出現的幾個CLK:

Fin,MPLL,UPLL,FCLK,HCLK,PCLK.

Fin指CPU外圍接的晶振本身的頻率,通常為12MHz。

MPLL和UPLL分別指的是用於供整機系統的PLL和專用於USB的UPLL。

FCLK = MPLL = (m * Fin)/(p + 2^s);

HCLK,PCLK受CLKDIVN寄存器的影響,即當FCLK確定後,CLKDIVN決定了HCLK和PCLK

Copyright © Linux教程網 All Rights Reserved