天天看点

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植u-boot-spl.bin(时钟初始化)

      移植 u-boot-spl.bin,我们采用 SPL 方式,因此需要在单板配置文件 u-boot-2014.04/include/configs/tiny210.h 中添加宏:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植u-boot-spl.bin(时钟初始化)

     我们可以进行如下操作,只编译 u-boot-spl.bin,这里没有在命令行指定交叉编译器,因为我已经在 Makefile 里添加了工具链:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植u-boot-spl.bin(时钟初始化)

       但是编译出错,我们前面分析得知在 u-boot-2014.04/arch/arm/lib/board.c 中定义了一个函数 board_init_f,这个函数进行了非常多的初始化操作,由于 u-boot-spl.bin 的最终目的只是把 BL2 从外部存储器(SD 卡、NAND)拷贝到 SDRAM,所以 u-boot-spl.bin 只需初始化时钟、SDRAM、NAND,然后调用一个拷贝函数,拷贝完成后直接跳转到 SDRAM 执行 BL2,就完事了,我们可以修改 crt0.S,不让其调用 board_init_f。

      由于这些操作只需要在 u-boot-spl.bin 中进行,因此这里使用 CONFIG_SPL_BUILD 宏来控制,当编译u-boot-spl.bin 才会将这些初始化代码编译进 u-boot-spl.bin,而编译 u-boot.bin 时就不会。在 u-boot-2014.04/board/samsung/tiny210/lowlevel_init.S 中的初始化都是汇编代码, 但汇编我用的不是太熟,我可以使用C 语言,所以,对于时钟初始化来说,我使用汇编,对内存初始化来说,使用C语言,将其修改为:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植u-boot-spl.bin(时钟初始化)

     现在开始编写时钟初始化代码,即system_clock_init: 查看了很多资料,总结了时钟初始化的代码和注释,贴在下面:

#define	  APLL_CON0	   0xE0100100  @FOUT_APLL = 1000 MHZ
#define   APLL_VAL     ((1<<31)|(125<<16)|(3<<8)|(1<<0))    
         
#define		MPLL_CON     0xE0100108  @FOUT_MPLL = 667 MHZ
#define   MPLL_VAL     ((1<<31)|(667<<16)|(12<<8)|(1<<0)) 

#define		EPLL_CON0    0xE0100110  @FOUT_EPLL = 96 MHZ
#define   EPLL_VAL     ((1<<31)|(48<<16)|(3<<8)|(2<<0)) 

#define		VPLL_CON 	   0xE0100120  @FOUT_VPLL = 54 MHZ
#define   VPLL_VAL     ((1<<31)|(108<<16)|(6<<8)|(3<<0)) 

@ MOUT_MSYS = SCLKAPLL = FOUT_APLL = 1000MHz
@ MOUT_DSYS = SCLKMPLL = FOUT_MPLL = 667MHz
@ MOUT_PSYS = SCLKMPLL = FOUT_MPLL = 667MHz
@ ONENAND = HCLK_PSYS

#define   CLK_SRC0     0xE0100200
#define   SRC0_VAL     ((1<<0)|(1<<4)|(1<<8)|(1<<12))

@ APLL_RATIO = 0, freq(ARMCLK) = MOUT_MSYS / (APLL_RATIO + 1) = 1000MHz */
@ A2M_RATIO = 4, freq(A2M) = SCLKAPLL / (A2M_RATIO + 1) = 200MHz */
@ HCLK_MSYS_RATIO = 4, freq(HCLK_MSYS) = ARMCLK / (HCLK_MSYS_RATIO + 1) = 200MHz */
@ PCLK_MSYS_RATIO = 1, freq(PCLK_MSYS) = HCLK_MSYS / (PCLK_MSYS_RATIO + 1) = 100MHz */
@ HCLK_DSYS_RATIO = 3, freq(HCLK_DSYS) = MOUT_DSYS / (HCLK_DSYS_RATIO + 1) = 166MHz */
@ PCLK_DSYS_RATIO = 1, freq(PCLK_DSYS) = HCLK_DSYS / (PCLK_DSYS_RATIO + 1) = 83MHz */
@ HCLK_PSYS_RATIO = 4, freq(HCLK_PSYS) = MOUT_PSYS / (HCLK_PSYS_RATIO + 1) = 133MHz */
@ PCLK_PSYS_RATIO = 1, freq(PCLK_PSYS) = HCLK_PSYS / (PCLK_PSYS_RATIO + 1) = 66MHz */

#define   CLK_DIV0 0xE0100300
#define	  DIV0_VAL 	((0<<0)|(4<<4)|(4<<8)|(1<<12)|(3<<16)|(1<<20)|(4<<24)|(1<<28))	

/*
 * system_clock_init: Initialize core clock and bus clock.
 * void system_clock_init(void)
 */
system_clock_init:
	ldr r0, =APLL_CON0
	ldr r1, =APLL_VAL
	str r1, [r0]
	
	ldr r0, =MPLL_CON
	ldr r1, =MPLL_VAL
	str r1, [r0]
	
	ldr r0, =EPLL_CON0 
	ldr r1, =EPLL_VAL
	str r1, [r0]
	
	ldr r0, =VPLL_CON
	ldr r1, =VPLL_VAL
	str r1, [r0]
	
	ldr r0, =CLK_SRC0
	ldr r1, =SRC0_VAL
	str r1, [r0]
	
	ldr r0, =CLK_DIV0
	ldr r1, =DIV0_VAL
	str r1, [r0]
	
	mov pc, lr
           

      在lowlevel_init调用了两个函数system_clock_init、ddr_init。我们已经实现了汇编代码的system_clock_init,下节 我们在 u-boot-2014.04/board/samsung/tiny210/tiny210.c 中用C语言实现它。