CopyCode2Ram
函数实现原理 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

4 )修改 tq2440 目录下的 Makefile

COBJS :=  tq2440.o flash.o boot_init.o

5 )修改 tq2440.c

增加宏定义:

#define S3C2440_MPLL_400MHZ     ((0x7f<<12)|(0x02<<4)|(0x01))

#define S3C2440_UPLL_48MHZ      ((0x38<<12)|(0x02<<4)|(0x02))

S3C2440的主时钟源来自外部晶振(XTIPLL)或外部时钟(EXTCLK)。S3C2440有两个PLLphase locked loop)一个是MPLL,一个是UPLLMPLL用于CPU及其他外围器件,UPLL用于USB      

      1 MPLL, 用于产生FCLK, HCLK, PCLK三种频率, 这三种频率分别有不同的用途:

     FCLKCPU提供的时钟信号。
     HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器, DMA 等。 

S3C2440DataSheet里可以看到,S3C2440最大支持400MHz的主频,但是这并不意味着一定工作在400MHz下面,可以通过设定MPLL, UPLL寄存器来设定CPU的工作频率。

     PCLK是为APB总线提供的时钟信号,Advanced Peripherals Bus,主要用于低速外设,比如看门狗,UART控制器, IIS, I2C, SDI/MMC, GPIORTC and SPI等。

      2 UPLL,专门用于驱动USB host/Device。并且驱动USB host/Device的频率必须为48MHz

    果要设置MPLLUPLL,要注意它们的先后顺序,MPLLUPLL的设定是有前后顺序的,必须先设定UPLL,然后才能设定MPLL,而且中间需要大约7个空指令(NOP)的间隔。 

定义MPLL/UPLL/CLKDIV,参考S3C2440芯片用户手册,参考255页内容如下:

 

#define S3C2440_CLKDIV          0x05    /* FCLK:HCLK:PCLK = 1:4:8 */

该寄存器参考内如下:
修改 board_init 函数如下:

int board_init (void)

{

        S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();

        S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

        /* FCLK:HCLK:PCLK = 1:4:8 */

        clk_power->CLKDIVN = S3C2440_CLKDIV;

        /* change to asynchronous bus mod */

        __asm__(    "mrc    p15, 0, r1, c1, c0, 0\n"    /* read ctrl register   */  

                        "orr    r1, r1, #0xc0000000\n"      /* Asynchronous         */  

                        "mcr    p15, 0, r1, c1, c0, 0\n"    /* write ctrl register  */  

                        :::"r1"

                   );

        /* to reduce PLL lock time, adjust the LOCKTIME register */

        clk_power->LOCKTIME = 0xFFFFFF;

        /* configure MPLL */

        clk_power->MPLLCON = S3C2440_MPLL_400MHZ;

        /* some delay between MPLL and UPLL */

        delay (4000);

        /* configure UPLL */

        clk_power->UPLLCON = S3C2440_UPLL_48MHZ;

        /* some delay between MPLL and UPLL */

        delay (8000);

        /* set up the I/O ports */

        gpio->GPACON = 0x007FFFFF;

        gpio->GPBCON = 0x00044555;

        gpio->GPBUP = 0x000007FF;

        gpio->GPCCON = 0xAAAAAAAA;

        gpio->GPCUP = 0x0000FFFF;

        gpio->GPDCON = 0xAAAAAAAA;

        gpio->GPDUP = 0x0000FFFF;

        gpio->GPECON = 0xAAAAAAAA;

        gpio->GPEUP = 0x0000FFFF;

        gpio->GPFCON = 0x000055AA;

        gpio->GPFUP = 0x000000FF;

        gpio->GPGCON = 0xFF95FFBA;

        gpio->GPGUP = 0x0000FFFF;

        gpio->GPHCON = 0x002AFAAA;

        gpio->GPHUP = 0x000007FF;

        /* arch number of SMDK2410-Board */

        gd->bd->bi_arch_number = MACH_TYPE_S3C2440;

        /* adress of boot parameters */

        gd->bd->bi_boot_params = 0x30000100;

        icache_enable();

        dcache_enable();

        return 0;

}