[002-u-boot-Exynos4412] SDK BL2阶段详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/pengfei240/article/details/77540391

0. 前言

本文以Exynos4412芯片为例,简要介绍了uboot的相关概念,并择重分析了BL2阶段的软件流程。

1. uboot简介

uboot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。

它的作用是进行系统引导(相当于BIOS)。它的目标包含以下两个方面:

  1. 支持多种嵌入式操作系统。如:Linux、NetBSD、VxWorks等。
  2. 支持多种嵌入式芯片架构。如:PowerPC、MIPS、x86、ARM等。

2. uboot硬件抽象

从uboot的设计目标中,我们可以得知uboot是一个跨平台、跨设备的引导程序,因此其对于硬件设备的抽象和封装就显得相当的重要。那么uboot是如何能以简介、高效的方式移植于不同的平台呢?它的解决方案是“board->machine->arch->cpu”框架。

  • ARCH:以指令集架构作为区分标准,对应于不同的CPU系列。
  • CPU:对应于IP Core的概念。
  • Machine:对应于SOC。指一些专业应用的场景,芯片厂商会在芯片上集成DSP、RAM、FLASH等外部器件,这些集成了其它功能的芯片被称为SOC。
  • Board: 对应于需要移植的单板。

3. BL2介绍

BL2是执行在iRAM中的代码,负责初始化CPU Core,系统时钟和DRAM控制器等,并负责将uboot的镜像拷贝到内存中。它可以解决iRAM空间较小的问题(iRAM只有256KB),衔接BL1和uboot阶段。

BL2由工具mkbl2生成,参看脚本sd_fusing.sh可知BL2实际上就是由uboot的前14K代码组成。

4. BL2软件流程

  • 橘黄色部分为BL2和uboot阶段共有的代码。
  • 紫色部分为BL2阶段特有的代码。
  • 蓝色部分为uboot阶段特有的代码。

5. 详细流程

u-boot.lds

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
 . = 0x00000000;
 . = ALIGN(4);
 .text :
 {
  arch/arm/cpu/armv7/start.o (.text)
  board/samsung/smdk4212/libsmdk4212.o (.text)
  arch/arm/cpu/armv7/exynos/libexynos.o (.text)
  *(.text)
 }
  1. 系统的入口函数为_start。入口函数的具体地址由CONFIG_SYS_TEXT_BASE定义。
  2. uboot镜像的前三个二进制文件依次为start.o -> libsmdk4212.o -> libexynos.o,因此我们如果需要在BL2中增加新功能,应该放到这三个二进制文件中。

start

lowlevel_init

Memory map

猜你喜欢

转载自blog.csdn.net/pengfei240/article/details/77540391
SDK
今日推荐