在uboot原来的代码里,有系统时钟的初始化函数,在board/samsung/smdkv210/lowlevel_init.S的system_clock_init函数,我大概看了一下,寄存器不一样,而且是汇编写的,所以我就改成用c语言来实现,在BL1阶段初始化一下,BL2阶段就不用重新初始化了。
1.arch/arm/lib/spl.c +43添加
//SystemClock #define APLL_LOCK (*(volatile unsigned int *)0xE0100000) #define MPLL_LOCK (*(volatile unsigned int *)0xE0100008) #define EPLL_LOCK (*(volatile unsigned int *)0xE0100010) #define VPLL_LOCK (*(volatile unsigned int *)0xE0100020) #define APLL_CON0 (*(volatile unsigned int *)0xE0100100) #define APLL_CON1 (*(volatile unsigned int *)0xE0100104) #define MPLL_CON (*(volatile unsigned int *)0xE0100108) #define EPLL_CON0 (*(volatile unsigned int *)0xE0100110) #define EPLL_CON1 (*(volatile unsigned int *)0xE0100114) #define VPLL_CON (*(volatile unsigned int *)0xE0100120) #define CLK_SRC0 (*(volatile unsigned int *)0xE0100200) #define CLK_DIV0 (*(volatile unsigned int *)0xE0100300) #define SETPLL(mdiv, pdiv, sdiv) ((1<<31)|(mdiv<<16)|(pdiv<<8)|(sdiv<<0)) #define APLL_MDIV 250 #define APLL_PDIV 6 #define APLL_SDIV 1 #define APLL_CON0_VAL SETPLL (APLL_MDIV, APLL_PDIV, APLL_SDIV) #define MPLL_MDIV 667 #define MPLL_PDIV 12 #define MPLL_SDIV 1 #define MPLL_CON_VAL SETPLL (MPLL_MDIV, MPLL_PDIV, MPLL_SDIV) #define PCLK_PSYS_RATIO 1 #define HCLK_PSYS_RATIO 4 #define PCLK_DSYS_RATIO 1 #define HCLK_DSYS_RATIO 3 #define PCLK_MSYS_RATIO 1 #define HCLK_MSYS_RATIO 4 #define A2M_RATIO 4 #define APLL_RATIO 0 #define CLK_DIV0_VAL ( (APLL_RATIO<<0)|\ (A2M_RATIO<<4)|\ (HCLK_MSYS_RATIO<<8)|\ (PCLK_MSYS_RATIO<<12)|\ (HCLK_DSYS_RATIO<<16)|\ (PCLK_DSYS_RATIO<<20)|\ (HCLK_PSYS_RATIO<<24)|\ (PCLK_PSYS_RATIO<<28) )
void init_SystemClock (void) { int i; //CLK_DIV0 = 0; APLL_CON0 = APLL_CON0_VAL; MPLL_CON = MPLL_CON_VAL; CLK_SRC0 = 0x1111; CLK_DIV0 = CLK_DIV0_VAL; //for (i=65535; i>=0; i--); }
/*#define CONFIG_SYS_PROMPT "SMDKC100 # "*/ #define CONFIG_SYS_PROMPT "SMDKV210 # "
4. include/configs/smdkv210.h +206
/*#define CONFIG_IDENT_STRING " for SMDKC100"*/ #define CONFIG_IDENT_STRING " for SMDKV210"
5. arch/arm/lib/spl.c +183
void __weak board_init_f(ulong dummy) { __attribute__((noreturn)) void (*uboot)(void); #if 0 /* Set the stack pointer. */ asm volatile("mov sp, %0\n" : : "r"(CONFIG_SPL_STACK)); /* Clear the BSS. */ memset(__bss_start, 0, __bss_end__ - __bss_start); /* Set global data pointer. */ gd = &gdata; board_init_r(NULL, 0); #endif /* // test #define GPH0CON (*(volatile unsigned int *)0xE0200C00) #define GPH0DAT (*(volatile unsigned int *)0xE0200C04) GPH0CON = (1<<0) | (1<<4) | (1<<8) | (1<<12); GPH0DAT = 10; */ init_SystemClock(); uart_init(); copy_uboot_to_ram(); //printf ("jump to u-boot image\r\n"); /* Jump to U-Boot image */ uboot = (void *)CONFIG_SYS_TEXT_BASE; (*uboot)(); }