本文分析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