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;  //添加這個
 };


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章