1. 程式人生 > >[002-u-boot-Exynos4412] SDK BL2階段詳解

[002-u-boot-Exynos4412] SDK BL2階段詳解

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