在文章(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; //添加這個 };