您的位置:首页 > 其它

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

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



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



但是编译出错,我们前面分析得知在 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语言,将其修改为:



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

[cpp] view
plaincopy

#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语言实现它。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐