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

本文详细介绍了U-Boot SPL(Secondary Program Loader)的移植过程及核心时钟初始化代码实现。通过修改配置文件并编写特定的初始化函数,确保U-Boot SPL仅完成必要的初始化任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移植 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 plain copy
  1. #define   APLL_CON0    0xE0100100  @FOUT_APLL = 1000 MHZ  
  2. #define   APLL_VAL     ((1<<31)|(125<<16)|(3<<8)|(1<<0))      
  3.            
  4. #define     MPLL_CON     0xE0100108  @FOUT_MPLL = 667 MHZ  
  5. #define   MPLL_VAL     ((1<<31)|(667<<16)|(12<<8)|(1<<0))   
  6.   
  7. #define     EPLL_CON0    0xE0100110  @FOUT_EPLL = 96 MHZ  
  8. #define   EPLL_VAL     ((1<<31)|(48<<16)|(3<<8)|(2<<0))   
  9.   
  10. #define     VPLL_CON       0xE0100120  @FOUT_VPLL = 54 MHZ  
  11. #define   VPLL_VAL     ((1<<31)|(108<<16)|(6<<8)|(3<<0))   
  12.   
  13. @ MOUT_MSYS = SCLKAPLL = FOUT_APLL = 1000MHz  
  14. @ MOUT_DSYS = SCLKMPLL = FOUT_MPLL = 667MHz  
  15. @ MOUT_PSYS = SCLKMPLL = FOUT_MPLL = 667MHz  
  16. @ ONENAND = HCLK_PSYS  
  17.   
  18. #define   CLK_SRC0     0xE0100200  
  19. #define   SRC0_VAL     ((1<<0)|(1<<4)|(1<<8)|(1<<12))  
  20.   
  21. @ APLL_RATIO = 0, freq(ARMCLK) = MOUT_MSYS / (APLL_RATIO + 1) = 1000MHz */  
  22. @ A2M_RATIO = 4, freq(A2M) = SCLKAPLL / (A2M_RATIO + 1) = 200MHz */  
  23. @ HCLK_MSYS_RATIO = 4, freq(HCLK_MSYS) = ARMCLK / (HCLK_MSYS_RATIO + 1) = 200MHz */  
  24. @ PCLK_MSYS_RATIO = 1, freq(PCLK_MSYS) = HCLK_MSYS / (PCLK_MSYS_RATIO + 1) = 100MHz */  
  25. @ HCLK_DSYS_RATIO = 3, freq(HCLK_DSYS) = MOUT_DSYS / (HCLK_DSYS_RATIO + 1) = 166MHz */  
  26. @ PCLK_DSYS_RATIO = 1, freq(PCLK_DSYS) = HCLK_DSYS / (PCLK_DSYS_RATIO + 1) = 83MHz */  
  27. @ HCLK_PSYS_RATIO = 4, freq(HCLK_PSYS) = MOUT_PSYS / (HCLK_PSYS_RATIO + 1) = 133MHz */  
  28. @ PCLK_PSYS_RATIO = 1, freq(PCLK_PSYS) = HCLK_PSYS / (PCLK_PSYS_RATIO + 1) = 66MHz */  
  29.   
  30. #define   CLK_DIV0 0xE0100300  
  31. #define   DIV0_VAL  ((0<<0)|(4<<4)|(4<<8)|(1<<12)|(3<<16)|(1<<20)|(4<<24)|(1<<28))    
  32.   
  33. /* 
  34.  * system_clock_init: Initialize core clock and bus clock. 
  35.  * void system_clock_init(void) 
  36.  */  
  37. system_clock_init:  
  38.     ldr r0, =APLL_CON0  
  39.     ldr r1, =APLL_VAL  
  40.     str r1, [r0]  
  41.       
  42.     ldr r0, =MPLL_CON  
  43.     ldr r1, =MPLL_VAL  
  44.     str r1, [r0]  
  45.       
  46.     ldr r0, =EPLL_CON0   
  47.     ldr r1, =EPLL_VAL  
  48.     str r1, [r0]  
  49.       
  50.     ldr r0, =VPLL_CON  
  51.     ldr r1, =VPLL_VAL  
  52.     str r1, [r0]  
  53.       
  54.     ldr r0, =CLK_SRC0  
  55.     ldr r1, =SRC0_VAL  
  56.     str r1, [r0]  
  57.       
  58.     ldr r0, =CLK_DIV0  
  59.     ldr r1, =DIV0_VAL  
  60.     str r1, [r0]  
  61.       
  62.     mov pc, lr  
     

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值