在文章(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; //添加这个
};
转载于:https://blog.51cto.com/svoday/1291005