这次移植U-Boot到一个2440的板子,主要花了一些时间在主频的设置上。
使用的模板依然为smdk2410,需要把board目录下的smdk2410文件夹拷贝到自己创建的board/my2440目录下(我们的板子就命名为my2440了,呵呵!),然后把include/configs/smdk2410.h文件拷贝为include/configs/my2440.h。关于频率的修改,有以下几个地方:
1、my2440.h
这里要修改一个宏
#define CONFIG_SYS_CLK_FREQ 16934400
smdk2410板子上这个宏被定义为12000000,那是因为2410板子上使用的外部晶振为12M,而我的2440板子上使用的外部晶振为16.9344M的晶振;假设你的板子上使用的外面晶振为12M,那么当然应该定义为12000000。
2、设置系统主频
这个是在cpu/arm920t/start.s文件中,在关闭了看门狗、禁止了所有中断后,需要设置系统主频。
ldr r0, =CLKDIVN
mov r1, #5
str r1, [r0]
此处把2410的3改为5,2410的FCLK、HCLK、PCLK的值为1:2:4,而2440上我们设置为1:4:8。
然后加入下面几行代码:
ldr r0, =MPLLCON
ldr r1, =0x0006e031
str r1, [r0]
这里设置MPLLCON寄存器,设置锁相环的分频值。具体的取值可查看2440的datasheet的第7章clock&power,第7.3.2节有一个表说明了各个取值所对应的频率。由于我的板子外部晶振为16.9344M,因此根据该表,欲设置为400M的主频,这个寄存器的值应该为0x00063031;若你的板子外部晶振为12M,并且你想选择405M的主频,那么根据该表,你应该设置该寄存器为0x0007f021。请一定注意你板子上的外部晶振频率。
3、同样是主频
在board/my2440/smdk2410.c文件中,做如下修改
#define FCLK_SPEED 1
#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 = 400MHz */
#define M_MDIV 0x6e
#define M_PDIV 0x3
#define M_SDIV 0x1
#endif
注意上面几个红色的值,和第二步中的说明一致。
4、speed相关
在cpu/arm920t/s3c24x0/speed.c中
修改 get_PLLCLK函数如下:
static ulong get_PLLCLK(int pllreg)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
ulong r, m, p, s;
if (pllreg == MPLL)
r = clk_power->MPLLCON;
else if (pllreg == UPLL)
r = clk_power->UPLLCON;
else
hang();
m = ((r & 0xFF000) >> 12) + 8;
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
if (pllreg == MPLL)
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
else
return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
}
然后修改 get_HCLK函数如下:
ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
//return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
return (get_FCLK()/4);
}
到这里,和频率相关的地方修改就完成了。
阅读(2279) | 评论(0) | 转发(0) |