uboot-2010.06移植到mini2440经验(2)配置时钟

在文章(1)编译出的uboot.bin,烧在mini2440上串口是没有输出的,原因在与时钟问题

1、修改board/samsung/mini2440.c

#define FCLK_SPEED 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
#define M_PDIV  0x2
#define M_SDIV  0x1
#endif
int board_init (void)
{
    struct s3c24x0_clock_power * const clk_power =
                    s3c24x0_get_base_clock_power();
    struct s3c24x0_gpio * const gpio = s3c24x0_get_base_gpio();
/*******************此处为自己添加**************************/
    clk_power->CLKDIVN=0X5;//FCLK:HCLK:PCK=1:1/4:1/8
    /* configure MPLL */
    clk_power->MPLLCON = ((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV);//FCLK:405M
    /* to reduce PLL lock time, adjust the LOCKTIME register */
    clk_power->LOCKTIME = 0xFFFFFF;
/*******************此处为自己添加**************************/
    /* some delay between MPLL and UPLL */
    delay (4000);

我们可以修改板子相关头文件mini2440.h中的:

#defineCONFIG_SYS_PROMPT"smdk2410 # "/* Monitor Command*/

改成

#defineCONFIG_SYS_PROMPT"mini2440 $ "/* Monitor Command*/

这样在终端中的命令提示符就变成"mini2440 $"


2、修正 get_PCLK 函数

   打开arch/arm/cpu/arm920t/s3c24x0/speed.c

   a.修改get_PLLCLK函数

static ulong get_PLLCLK(int pllreg)
{
//获取时钟相关特殊功能的基地址,可以自己体通过source insight对相关函数进行跟踪
    struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
    ulong r, m, p, s;
    if (pllreg == MPLL)
        r = readl(&clk_power->MPLLCON);//获取MPLLCON的值,不建议使用这种方法:r=clk_power->MPLLCON!!
    else if (pllreg == UPLL)
        r = readl(&clk_power->UPLLCON);
    else
        hang();
//计算m  p  s的值,依据:上面的截图和数据手册的P255页的表!!
    m = ((r & 0xFF000) >> 12) + 8;
    p = ((r & 0x003F0) >> 4) + 2;
    s = r & 0x3;
//获取PLLCLK,依据:上面的图!!CONFIG_SYS_CLK_FREQ这就是Fin,在mini2440.h中已经定义!!
//return (CONFIG_SYS_CLK_FREQ * m) / (p << s); //改成如下
return  (2 * CONFIG_SYS_CLK_FREQ * m) / (p << s);
}

   b.修改get_HCLK函数

ulong get_HCLK(void)
{
    struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
    unsigned int hdivn=(readl(&clk_power->CLKDIVN)&(0x3<<1))>>1;
    ulong hclk;
    if(hdivn==0)
    {
        hclk=get_FCLK();
    }
    else if(hdivn==0x1)
    {
        hclk=get_FCLK()/2;
    }
    else if(hdivn==0x2)
    {
        if((readl(&clk_power->CAMDIVN)&(1<<9))==0)
        {
                hclk=get_FCLK()/4;
        }
        else
        {
            hclk=get_FCLK()/8;
        }
    }
    else
    {
        if((readl(&clk_power->CAMDIVN)&(1<<8))==0)
        {
                hclk=get_FCLK()/3;
        }
        else
        {
                hclk=get_FCLK()/6;
        }
    }
    return hclk;
}

3、修正struct s3c24x0_clock_power 结构体

   打开include/asm/arch-s3c24x0/s3c24x0.h

struct s3c24x0_clock_power {
         u32     LOCKTIME;
         u32     MPLLCON;
         u32     UPLLCON;
         u32     CLKCON;
         u32     CLKSLOW;
         u32     CLKDIVN;
         u32     CAMDIVN;  //添加这个
 };


你可能感兴趣的:(uboot)