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] 引腳配置 (對應寄存器),映射表:
| OM值 | 二進制 | 第一設備 | 備用設備 |
| 2 | 00010 | SDMMC_CH2 (SD卡) | USB |
| 3 | 00011 | eMMC4.3_CH0 | USB |
| 4 | 00100 | eMMC4.4_CH4 | USB |
| 8 | 01000 | NAND 512B/8bit ECC | USB |
| 9 | 01001 | NAND 2KB+ | USB |
| 19 | 10011 | eMMC4.3_CH0 | SDMMC_CH2 |
| 20 | 10100 | eMMC4.4_CH4 | SDMMC_CH2 |
| 24 | 11000 | NAND 512B | SDMMC_CH2 |
| 25 | 11001 | NAND 2KB+ | SDMMC_CH2 |
iROM 根據 OM 個選擇設備,調用內部拷貝函數將 BL1 讀入 SRAM。
三、BL1 流程:加載並驗證 BL2
- 讀取啟動模式寄存器,確認啟動設備。
- 調用 iROM 拷貝接口,從設備讀取 BL2 到 SRAM 指定位置。
- **完整性校驗**:使用內置公鑰驗證 BL2 簽名 (防篡改)。
- 驗證通過 → 跳轉執行 BL2;失敗 → 停機/進入 USB 下載模式。
關鍵點:BL1 代碼不依賴外部平台配置;安全上下文數據、BL2 公鑰內嵌於 BL1。
四、BL2 流程:初始化硬件、加載 OS
- 初始化系統時鐘 (PLL)、DDR 控制器 (關鍵:DDR 訓練)。
- 可選初始化:UART、網卡、eMMC、SD卡等外設驅動。
- 從啟動設備讀取 OS 鏡像 (BL3) 到 DDR。
- 校驗 OS 鏡像完整性 (簽名/哈希)。
- 跳轉到 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 可調用)
| 地址 | 函數名 | 功能 | 參數 | 返回 |
| 0x02020030 | SDMMC_ReadBlocks | 從SD/MMC讀塊到內存 | (u32 src_blk, u32 n_blks, void* dst) | 1/0 |
| 0x0202003C | LoadBL2FromEmmc43Ch0 | 從eMMC4.3啟動區讀BL2 | (u32 src_blk, u32* dst) | 1/0 |
| 0x02020040 | Emmc43_EndBootOp_eMMC | 結束eMMC4.3啟動模式 | void | void |
| 0x02020044 | MSH_ReadFromFIFO_eMMC | 從eMMC4.4讀啟動區 | (u32 n_blks, void* dst) | 1/0 |
| 0x02020048 | MSH_EndBootOp_eMMC | 結束eMMC4.4啟動模式 | void | void |
| 0x02020070 | LoadImageFromUsb | 從USB下載鏡像 | void | 1/0 |
調用方式:函數指針強轉調用,如 ((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 對應分區。
九、調試關鍵點
- OM引腳硬件配置是否正確(示波器/萬用表測量)。
- 串口輸出(UART0)是否在 BL1/BL2 早期初始化並打印日誌。
- DDR 初始化失敗是 BL2 最常見卡點(時序參數、訓練算法、PCB布線)。
- 簽名驗證失敗:公鑰不匹配、二進制被修改、校驗碼計算錯誤。
- JTAG/SWD 介入:Direct Boot 模式或 BL1/BL2 早期斷點調試。
Exynos4412 啟動流程體現了 ARM TrustZone 信任鏈思想:iROM (Root of Trust) → BL1 (Trust Anchor) → BL2 (Platform Init) → OS。精通內存映射、拷貝接口、時鐘約束、簽名驗證,是裸機移植、安全啟動、Board Bring-up 的核心竄力。
- 上一篇文章: scanf 深度解析:參數傳遞機制、輸入掃描流程、返回值應用
- 下一篇文章: 二叉查找樹 C 實現全解析:插入、查找、刪除、遍歷、銷毀與通用設計模式
Copyright ©
程式碼之家 All Rights Reserved