U-Boot-2009-03移植笔记(第二阶段:时钟!)

根据U-Boot-2009-03移植笔记(第二阶段移植准备)最后的总结,需要针对S3C2440来移植时钟初始化的代码。

在lib_arm/board.c中,个init_sequence数组,定义了所有的初始化函数指针。

时钟的驱动,在函数board_init中,位于board/xinna2440/xinna2440.c,我们这里只支持S3C2440,删除文件头部的时钟参数宏定义,直接改为

 1 #define FCLK_SPEED 1
 2 
 3 #define M_MDIV    0x7f
 4 #define M_PDIV    0x2
 5 #define M_SDIV    0x1
 6 
 7 #define USB_CLOCK 1
 8 
 9 #define U_M_MDIV    0x38
10 #define U_M_PDIV    0x2
11 #define U_M_SDIV    0x2
12 #define S3C2440_CLKDIV    0x5 
S3C2440时钟参数定义

在board_init函数的clk_power->LOCKTIME = 0xFFFFFF;语句前,增加汇编代码:

    /* to reduce PLL lock time, adjust the LOCKTIME register */
    clk_power->CLKDIVN = S3C2440_CLKDIV;
    __asm__(    "mrc    p15, 0, r1, c1, c0, 0\n" 
             "orr    r1, r1, #0xc0000000\n" 
             "mcr    p15, 0, r1, c1, c0, 0\n"
             :::"r1"
           );

然后修改cpu/arm920t/s3c24x0/speed.c。

 1 DECLARE_GLOBAL_DATA_PTR;  /*添加代码*/
 2 static ulong get_PLLCLK(int pllreg)
 3 {
 4     S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
 5     ulong r, m, p, s;
 6 
 7     if (pllreg == MPLL)
 8     r = clk_power->MPLLCON;
 9     else if (pllreg == UPLL)
10     r = clk_power->UPLLCON;
11     else
12     hang();
13 
14     m = ((r & 0xFF000) >> 12) + 8;
15     p = ((r & 0x003F0) >> 4) + 2;
16     s = r & 0x3;
17 
18     if(pllreg == MPLL)   /*修改get_PLLCLK返回值*/
19         return  ((CONFIG_SYS_CLK_FREQ * m * 2) /(p << s)); 
20     else if(pllreg == UPLL)
21         return ((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));   /* S3C2440 */
22 }
23 
24 /* return FCLK frequency */
25 ulong get_FCLK(void)
26 {
27     return(get_PLLCLK(MPLL));
28 }
29 
30 /* return HCLK frequency */
31 ulong get_HCLK(void)
32 {
33     S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
34     return get_FCLK() / 4; /*修改get_HCLK返回值*/
35 }
36 
37 /* return PCLK frequency */
38 ulong get_PCLK(void)
39 {
40     S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
41 
42     return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK());
43 }
44 
45 /* return UCLK frequency */
46 ulong get_UCLK(void)
47 {
48     return(get_PLLCLK(UPLL));
49 }

保存,编译,打开minicom,烧写,运行,发现了熟悉的画面。

 

串口输出正常无乱码,说明时钟驱动移植成功!

 

posted @ 2013-05-29 14:14  浮云人生  阅读(260)  评论(0编辑  收藏  举报