根据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
在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, 0n'
'orr r1, r1, #0xc0000000n'
'mcr p15, 0, r1, c1, c0, 0n'
:::'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,烧写,运行,发现了熟悉的画面。
串口输出正常无乱码,说明时钟驱动移植成功!