uboot框架熟悉(一)itop4412-uboot2015引导阶段程序在各存储介质的分布

  本文分析itop4412开发板在uboot引导启动阶段,程序在各存储介质的分布情况,为理解uboot代码框架提供基础。以uboot2015为例,以外部SD/MMC作为启动介质。

目录

      一、itop4412-uboot2015镜像文件组成

      二、itop4412-uboot启动流程

            1>> 开机运行iROM中的代码

            2>> BL1阶段

            3>> BL2(SPL)阶段

            4>> uboot第二阶段代码

一、itop4412-uboot2015镜像文件组成

  在ubuntu中将uboot镜像烧写到SD卡的命令如下,功能是将uboot镜像文件itop4412-uboot.bin文件烧写到SD卡第1个扇区开始的地方:

    dd iflag=dsync oflag=dsync if=itop4412-uboot.bin of=/dev/sdb seek=1

  其中itop4412-uboot.bin由如下文件制作成:

    cat E4412_N.bl1.SCP2G.bin bl2.bin env.bin u-boot.bin > itop4412-uboot.bin

  其中,

  E4412_N.bl1.SCP2G.bin  :8KB,三星提供的bin文件,没有源码,下文称为BL1

  bl2.bin :16KB,uboot启动第一阶段代码,在uboot2015中称为SPL阶段,下文称为BL2

  env.bin :8KB,内容是全0的bin文件,在SD卡中占位8KB用于存储uboot的环境变量

  u-boot.bin :小于512KB,uboot启动第二阶段代码

  因此,itop4412 uboot2015镜像组成文件中,bl2.bin和u-boot.bin是移植uboot2015编译生成,其他几个是现成的bin文件,直接从讯为提供的SDK中获取。SD卡中程序分布如下:

 二、itop4412程序启动流程

  上图是itop4412的datasheet中的启动流程框图。上图中的BL1是由三星公司提供的,没有源码。OS是我们自己的程序,一般是我们自己移植的uboot。

启动流程:

1>> 开机运行iROM中的代码

 

  itop4412内部有个64KB的iROM,这个iROM的物理地址是0x0000_0000。ARM芯片启动时从物理地址0x0000_0000的存储介质中取第一条指令开始运行。三星在iROM中固化了一段启动代码,因此,芯片上电时首先运行iROM中的这段代码。这段代码主要做以下4个工作:

  1. 初始化出程序运行的基本环境,比如关闭看门狗、设置栈以及初始化时钟等;

  2. 读取OM脚判断uboot的启动介质(内部EMMC、外部SD/MMC卡等);

  3. 从启动介质加载BL1阶段代码到iRAM中特定的地址(0x0202_1400)处;itop4412的iRAM有256KB,起始物理地址是0x0202_0000;

  4. iROM中的启动代码对BL1代码做完整性校验,校验通过后,跳转到iRAM中的BL1运行。

  下图是官方文档中iRAM中程序的内存分布图,从图中可以看出,iROM中的程序除了做上述工作外,还将Product_ID、iRom_Version和Function_Ptr(这个是一些内存拷贝函数的指针,这些函数用于将EMMC或者SD/MMC中的程序拷贝到动态内存DRAM中,在uboot代码的第一阶段BL2程序中需要调用这里的函数将启动介质中的u-boot程序拷贝到DRAM中)拷贝到了iRAM的起始处,然后在iRAM中设置了自己使用的栈。

  至此,iROM结束使命,BL1开始运行。

2>> BL1阶段

  BL1阶段主要做如下工作:

  1. 从启动介质拷贝BL2代码(SPL阶段)到iRAM的0x0202_3400处,因此在编译uboot时,BL2的链接地址需要设置为0x0202_3400;

  2. 校验BL2的完整性,通过后跳到BL2运行

  在BL2中有两个数据Checksum和Signature,BL1对BL2的校验就是检查这两个数据。BL2有效程序必须小于14332B,14KB-4B的地方用于存放Checksum;14KB的地方用于存放Signature。

  Uboot2015中,编译出uboot的第一阶段SPL后,使用board/Samsung/itop4412/tools/mkitop4412spl.c计算校验和放到14KB-4B的地方。

  编译SPL阶段的脚本文件scripts/Makefile.spl中调用mkitop4412spl

3>> BL2(SPL)阶段

  至此我们自己移植的uboot开始运行,BL2还在iRAM中运行,主要做的工作是:

  1. 初始化时钟、初始化串口、初始化动态内存DRAM;

  2. 拷贝uboot第二阶段代码到DRAM中,然后跳转到DRAM中执行uboot第二阶段代码;

4>> uboot第二阶段代码

  uboot第二阶段会提供uboot的基本功能,比如命令行交互功能、环境变量读写功能、启动内核等。

三、总结

  整体程序运行时内存分布如下图所示:

  1. 开机运行iROM中的代码,根据OM引脚从启动介质加载BL1到iRAM中运行;

  2. BL1从启动介质加载BL2到iRAM中运行;

  3. BL2加载uboot第二阶段代码到DRAM中运行;

  4. uboot第二阶段代码运行,响应控制台命令,启动内核。

 


  本文仅是本人在熟悉uboot的代码框架过程中的记录,分析总结出来以便自己更好的理解,大家勿喷哈。参考了网上的博客没有一一列出。如有侵权,请联系删除。

参考博客:

   https://blog.csdn.net/pengfei240/article/details/75308150

 

 

posted @ 2020-07-02 17:48  小小的番茄  阅读(1055)  评论(0编辑  收藏  举报