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
在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,烧写,运行,发现了熟悉的画面。
串口输出正常无乱码,说明时钟驱动移植成功!
80岁也要写程序