详细的bootloader的移植(3)

简介:
 

                                                                CopyCode2Ram
函数实现原理
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;
}









本文转自 chen138 51CTO博客,原文链接:http://blog.51cto.com/chenboqiang/267032,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
Shell Linux 芯片
嵌入式系统中u-boot和bootloader到底有什么区别
嵌入式系统中u-boot和bootloader到底有什么区别
463 1
嵌入式系统中u-boot和bootloader到底有什么区别
|
6月前
|
Linux 编译器 Go
Linux内核学习(四):Bootloader的特种兵-Uboot(二)
Linux内核学习(四):Bootloader的特种兵-Uboot(二)
637 0
|
6月前
|
存储 运维 Linux
Linux内核学习(三):Bootloader的特种兵-Uboot(一)
Linux内核学习(三):Bootloader的特种兵-Uboot(一)
84 0
|
机器学习/深度学习
|
内存技术 芯片 编译器