uboot源码分析1-启动第一阶段

穿精又带淫゛_ 提交于 2020-02-16 00:08:10

1、不简单的头文件包含

  • #include <config.h>:这个文件的内容其实是包含了一个头文件:#include <configs/x210_sd.h>".
  • #include/version.h中包含了include/version_autogenerated.h,这个头文件就是配置过程中自动生成的。里面就一行内容:#define U_BOOT_VERSION "U-Boot 1.3.4"

2、启动代码的16字节头部

3、异常向量表的构建

4、用0xdeadbeef对齐填充

5、分配空间放TEXT_BASE  c3e00000

6、分配空间放uboot在DDR中的物理地址 33e00000

7、设置CPU为SVC模式

8、设置L2、L1cache和MMU

9、识别并暂存启动介质,因此执行完这一段代码后r3中存储了0x03,以后备用。

10、设置栈,并调用lowlevel_init;目的:栈是在SRAM中设置的,因为当前整个代码还在SRAM中运行,此时DDR还未被初始化还不能用

    10.1lowlevel_init详解

(1)先将LR入栈

(2)检查复位状态,防止DDR再次初始化; 冷上电时DDR是需要初始化才能用的;而热启动或者低功耗状态下的复位则不需要再次初始化  DDR。

(3)IO状态恢复

(4)关看门狗

(5)SRAM SROM相关GPIO设置

(6)开发板供电锁存

(7)判断当前代码执行在SRAM中还是在DDR。 原因:根据代码的位置判断时钟和DDR是否需要初始化

(8)[时钟初始化和DDR初始化]串口初始化打印'O'、trust zone初始化

    • 在 裸机中DMC0的256MB内存地址范围是0x20000000-0x2FFFFFFF;
    • 在uboot中DMC0的256MB内存地址范围为0x30000000-0x3FFFFFFF。
    • 在uboot中,可用的物理地址范围为:0x30000000-0x4FFFFFFF。一共512MB,其中30000000-3FFFFFFF为DMC0,40000000-4FFFFFFF为DMC1。
(9)返回地址,打印'K'

11、再次设置开发板供电锁存

12、再次设置栈,目的:DDR已经被初始化了,因此要把栈挪移到DDR中,所以要重新设置栈

13、再次判断当前地址以决定是否重定位,是为了决定是否进行uboot的relocate。

14、从D0037488这个内存地址读值,SD0通道启动时,这个值为EB000000;从SD2通道启动时,这个值为EB200000,然后调用movi_bl2_copy函数执行重定位

15、建立映射表并开启MMU

  • 地址映射的额外收益1:访问控制,在管理上对内存进行分块,然后每块进行独立的虚拟地址映射,然后在每一块的映射关系中同时还实现了访问控制(对该块可读、可写、只读、只写、不可访问等控制)
  • 地址映射的额外收益2:cache

16、再次设置栈,本次设置栈的目的是将栈放在比较合适(安全,紧凑而不浪费内存)的地方。

17、清理bss 注意表示bss段的开头和结尾地址的符号是从链接脚本u-boot.lds得来的。

18、跳转到第二阶段,执行_start_armboot

 
 
 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!