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


    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

     
     
     
  • 相关阅读:
    从Android Launcher源码学习自定义标签
    Android的TextView使用Html来处理图片显示、字体样式、超链接等
    mysql的字符串函数
    JavaScript求当月天数
    keycode对照表
    Android onMeasure方法介绍
    SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替
    表单的内容用WORD形式保存
    在LOTUS NOTES 中通过ODBC访问关系数据库的方法
    通过LEI技术实现NOTES与SQL2000数据交换
  • 原文地址:https://www.cnblogs.com/zyj23/p/12315377.html
Copyright © 2020-2023  润新知