首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

iTop4412/Exynos4412 啟動流程詳解:iROM、BL1、BL2、內存映射與拷貝接口

     編輯:關於C語言

iTop4412/Exynos4412 啟動流程詳解:iROM、BL1、BL2、內存映射與拷貝接口

三星 Exynos4412 (iTop4412同款) 的啟動流程是嵌入式工程師必修課。本文詳細拆解 iROM 固件邏輯、BL1/BL2 階段任務、SRAM 內存映射、啟動設備選擇、iROM 提供的拷貝函數接口及 SD 卡分區示例。

一、啟動總覽

上電 → iROM (內部ROM, 不可見) → BL1 (SRAM) → BL2 (SRAM/DDR) → BL3 (OS, DDR) → 內核
  • iROM:出廠燒錄在片上ROM,不可修改,負責從啟動設備加載 BL1 到 SRAM。
  • BL1:首級加載器,驗證並加載 BL2 到 SRAM,建立信任鏈根。
  • BL2:二級加載器,初始化 DDR/時鐘/外設,加載 OS (BL3) 到 DDR 並驗證。
  • BL3:操作系統內核 (u-boot/kernel)。

二、iROM 階段:Direct Boot 與啟動設備選擇

1. Direct Boot 模式 (繞過常規流程)

  • 檢查寄存器 0x0202_0020 (Flag) == 0xFCBA_0D10。
  • 若滿足,直接跳轉到 0x0202_0024 指定地址執行(用於JTAG調試/快速啟動)。

2. 正常啟動:OM引腳決定啟動設備

讀取 OM[5:1] 引腳配置 (對應寄存器),映射表:

iROM 根據 OM 個選擇設備,調用內部拷貝函數將 BL1 讀入 SRAM。

三、BL1 流程:加載並驗證 BL2

  1. 讀取啟動模式寄存器,確認啟動設備。
  2. 調用 iROM 拷貝接口,從設備讀取 BL2 到 SRAM 指定位置。
  3. **完整性校驗**:使用內置公鑰驗證 BL2 簽名 (防篡改)。
  4. 驗證通過 → 跳轉執行 BL2;失敗 → 停機/進入 USB 下載模式。

關鍵點:BL1 代碼不依賴外部平台配置;安全上下文數據、BL2 公鑰內嵌於 BL1。

四、BL2 流程:初始化硬件、加載 OS

  1. 初始化系統時鐘 (PLL)、DDR 控制器 (關鍵:DDR 訓練)。
  2. 可選初始化:UART、網卡、eMMC、SD卡等外設驅動。
  3. 從啟動設備讀取 OS 鏡像 (BL3) 到 DDR。
  4. 校驗 OS 鏡像完整性 (簽名/哈希)。
  5. 跳轉到 DDR 中 OS 入口點執行。

獨立性:BL2 代碼不回調 BL1,邏輯自包含。

五、SRAM 內存映射 (關鍵地址)

SRAM 基址: 0x0202_0000
├── 0x0202_0000 - 0x0202_13FF (5KB) : iROM 預留區
├── 0x0202_0020 : Direct-Go Flag 寄存器
├── 0x0202_0024 : Direct-Go Address 寄存器
├── 0x0202_0030 - 0x0202_0070 : iROM 拷貝函數入口表 (見下表)
├── 0x0202_3000 : BL1 代碼 + 安全上下文 (8KB, 至 0x0202_4FFF)
├── 0x0202_5000 : BL2 加載區 (最大 14KB - 4B)
├── 0x0202_6BFC : BL2 校驗碼 (4字節)
├── 0x0202_6C00 : BL2 簽名位置
  • BL1 固定 8KB (8192 字節)。
  • BL2 最大 14KB - 4B,不足填 0。
  • BL1 可通過修改代碼調整 BL2 加載大小限制。

六、iROM 拷貝函數接口表 (BL1/BL2 可調用)

OM值二進制第一設備備用設備
200010SDMMC_CH2 (SD卡)USB
300011eMMC4.3_CH0USB
400100eMMC4.4_CH4USB
801000NAND 512B/8bit ECCUSB
901001NAND 2KB+USB
1910011eMMC4.3_CH0SDMMC_CH2
2010100eMMC4.4_CH4SDMMC_CH2
2411000NAND 512BSDMMC_CH2
2511001NAND 2KB+SDMMC_CH2

調用方式:函數指針強轉調用,如 ((int(*)(u32,u32,void*))0x02020030)(blk, cnt, dst)。

時鐘限制

  • 啟動時 SDMMC/eMMC 時鐘固定 20MHz (源自 MPLL)。
  • BL1/BL2 階段**禁止修改** SDMMC/eMMC 相關時鐘/PLL,否則拷貝函數失效。

七、SD 卡啟動分區示例 (參考)

SD卡分區佈局:
├── 保留區 (前若干扇區)
├── BL1 分區 (通常 16-32KB, 存放 BL1 二進制)
├── BL2 分區 (緊隨其後, 存放 BL2 二進制)
├── 環境變量分區 (可選, u-boot env)
├── 內核分區 (zImage/uImage)
├── 設備樹分區 (dtb)
├── 根文件系統分區 (ext4/ubifs)

iROM 讀取 BL1 時,從 BL1 分區起始扇區連續讀取 8KB 到 SRAM。

八、BL1/BL2 構建工具鏈

  • 工具下載:https://download.csdn.net/detail/cj675816156/9101607 (制作 BL1 簽名/校驗碼工具)。
  • 流程:編譯 BL1/BL2 源碼 → 簽名工具生成校驗碼/簽名 → 合併為最終二進制 → 燒寫 SD/eMMC 對應分區。

九、調試關鍵點

  1. OM引腳硬件配置是否正確(示波器/萬用表測量)。
  2. 串口輸出(UART0)是否在 BL1/BL2 早期初始化並打印日誌。
  3. DDR 初始化失敗是 BL2 最常見卡點(時序參數、訓練算法、PCB布線)。
  4. 簽名驗證失敗:公鑰不匹配、二進制被修改、校驗碼計算錯誤。
  5. JTAG/SWD 介入:Direct Boot 模式或 BL1/BL2 早期斷點調試。

Exynos4412 啟動流程體現了 ARM TrustZone 信任鏈思想:iROM (Root of Trust) → BL1 (Trust Anchor) → BL2 (Platform Init) → OS。精通內存映射、拷貝接口、時鐘約束、簽名驗證,是裸機移植、安全啟動、Board Bring-up 的核心竄力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
地址函數名功能參數返回
0x02020030SDMMC_ReadBlocks從SD/MMC讀塊到內存(u32 src_blk, u32 n_blks, void* dst)1/0
0x0202003CLoadBL2FromEmmc43Ch0從eMMC4.3啟動區讀BL2(u32 src_blk, u32* dst)1/0
0x02020040Emmc43_EndBootOp_eMMC結束eMMC4.3啟動模式voidvoid
0x02020044MSH_ReadFromFIFO_eMMC從eMMC4.4讀啟動區(u32 n_blks, void* dst)1/0
0x02020048MSH_EndBootOp_eMMC結束eMMC4.4啟動模式voidvoid
0x02020070LoadImageFromUsb從USB下載鏡像void1/0