u-boot-2011.03在TQ2440上的移植(2)--初始化时钟

时间:2022-06-01 16:37:08

smdk2440的初始化设置

1、u-boot主要的目录结构如下

  2、启动流程图下图
 
 
由上图可知

u-bootstage1代码通常放在cpu/xxxx/start.S文件中,他用汇编语言写成;

u-bootstage2代码通常放在lib_xxxx/board.c文件中,他用C语言写成。
3、在include/configs/smdk2440.h头文件中添加CONFIG_S3C2440宏
vi include/configs/smdk2440.h 在第40行添加
#define CONFIG_S3C2440 1
 
4、stage1阶段的硬件设备初始化。
vi arch/arm/cpu/arm920t/start.S
去掉117,118行点亮AT91RM9200DK系列LED的代码
/*
bl coloured_LED_init
bl red_LED_on
*/
 
5、在u-boot中添加对S3C2440一些寄存器的支持、添加中断禁止部分和时钟设置部分
在164行添加如下红色内容
# if defined(CONFIG_S3C2410)
    ldr  r1, =0x3ff
    ldr  r0, =INTSUBMSK
    str  r1, [r0]
# endif
/*164行*/
# if defined(CONFIG_S3C2440)//添加s3c2440的中断禁止部分
    ldr  r1, =0x7fff        //根据2440芯片手册,INTSUBMSK寄存器有15位可用  
    ldr  r0, =INTSUBMSK
    str  r1, [r0]
# endif
# if defined(CONFIG_S3C2440)   //添加s3c2440的时钟部分
#define MPLLCON   0x4C000004   //系统主频配置寄存器基地址
#define UPLLCON   0x4C000008   //USB时钟频率配置寄存器基地址
    ldr  r0, =CLKDIVN          //设置分频系数FCLK:HCLK:PCLK = 1:4:8
    mov  r1, #5
    str  r1, [r0]
 
    ldr  r0, =MPLLCON  //设置系统主频为405MHz 
    ldr  r1, =0x7F021  //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分
    str  r1, [r0]
 
    ldr  r0, =UPLLCON  //设置USB时钟频率为48MHz 
    ldr  r1, =0x38022  //这个值参考芯片手册“PLL VALUE SELECTION TABLE”部分
    str  r1, [r0]
# else //其他开发板的时钟部分,这里就不用管了,我们现在是做2440的
 
6、S3C2440的时钟部分除了在start.S中添加外,还要分别在board/samsung/smdk2440/smdk2440.c和cpu/arm920t/s3c24x0/speed.c中修改或添加部分代码,如下:
vi board/samsung/smdk2440/smdk2440.c
时钟部分修改第34行和在45行添加如下红色部分
#define FCLK_SPEED 2       //设置默认等于2,即下面红色代码部分有效
#if FCLK_SPEED==0          /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV    0xC3
#define M_PDIV    0x4
#define M_SDIV    0x1
#elif FCLK_SPEED==1        /* Fout = 202.8MHz */
#define M_MDIV    0xA1
#define M_PDIV    0x3
#define M_SDIV    0x1
#elif FCLK_SPEED==2        /* Fout = 405MHz */
#define M_MDIV    0x7F     //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define M_PDIV    0x2
#define M_SDIV    0x1

#endif
 
USB时钟部分修改第51行和在61行添加如下红色部分
#define USB_CLOCK 2        //设置默认等于2,即下面红色代码部分有效
#if USB_CLOCK==0
#define U_M_MDIV    0xA1
#define U_M_PDIV    0x3
#define U_M_SDIV    0x1
#elif USB_CLOCK==1
#define U_M_MDIV    0x48
#define U_M_PDIV    0x3
#define U_M_SDIV    0x2
#elif USB_CLOCK==2         /* Fout = 48MHz */
#define U_M_MDIV    0x38   //这三个值根据S3C2440芯片手册“PLL VALUE SELECTION TABLE”部分进行设置
#define U_M_PDIV    0x2
#define U_M_SDIV    0x2
#endif
7、vi arch/arm/cpu/arm920t/s3c24x0/speed.c //根据设置的分频系数FCLK:HCLK:PCLK = 1:4:8修改获取时钟频率的函数
get_PLLCLK函数修改第66行如下
 
static ulong get_PLLCLK(int pllreg)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
    ulong r, m, p, s;
    if (pllreg == MPLL)
    r = clk_power->MPLLCON;
    else if (pllreg == UPLL)
    r = clk_power->UPLLCON;
    else
    hang();
    m = ((r & 0xFF000) >> 12) + 8;
    p = ((r & 0x003F0) >> 4) + 2;
    s = r & 0x3;
#if defined(CONFIG_S3C2440)
    if(pllreg == MPLL)
    {   //参考S3C2440芯片手册上的公式:PLL=(2 * m * Fin)/(p * 2s)
        return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
    }
#endif
    return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
}
 
修改84行get_HCLK函数为
/* return HCLK frequency */
ulong get_HCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
#if defined(CONFIG_S3C2440)
    return(get_FCLK()/4);
#endif
    return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
}