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