Chinaunix首页 | 论坛 | 博客
  • 博客访问: 515508
  • 博文数量: 87
  • 博客积分: 4086
  • 博客等级: 上校
  • 技术积分: 900
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 15:55
文章分类

全部博文(87)

文章存档

2012年(3)

2010年(13)

2009年(7)

2008年(64)

我的朋友

分类: LINUX

2010-06-17 22:48:43

这次移植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);
}
 
到这里,和频率相关的地方修改就完成了。
阅读(2206) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~