之前對這個uboot的源碼了解有些許遺忘。最近做AVB校驗,需要uboot到kernel的這個過程。這里再復習一下。
與大多數BootLoader一樣,uboot的啟動過程分為BL1和BL2兩個階段。
BL1階段通常是開發板的配置等設備初始化代碼,需要依賴依賴于SoC體系結構,通常用匯編語言來實現;
BL2階段主要是對外部設備如網卡、Flash等的初始化以及uboot命令集等的自身實現,通常用C語言來實現。
1、BL1階段
uboot的BL1階段代碼通常放在start.s文件中,用匯編語言實現,其主要代碼功能如下:
? (1) 指定uboot的入口。在鏈接腳本uboot.lds中指定uboot的入口為start.S中的_start。
? (2)設置異常向量(exception vector)
? (3)關閉IRQ、FIQ,設置SVC模式
? (4)關閉L1 cache、設置L2 cache、關閉MMU
? (5)根據OM引腳確定啟動方式
? (6)在SoC內部SRAM中設置棧
? (7)lowlevel_init(主要初始化系統時鐘、SDRAM初始化、串口初始化等)
? (8)設置開發板供電鎖存
? (9)設置SDRAM中的棧
? (10)將uboot從SD卡拷貝到SDRAM中
? (11)設置并開啟MMU
? (12)通過對SDRAM整體使用規劃,在SDRAM中合適的地方設置棧
? (13)清除bss段,遠跳轉到start_armboot執行,BL1階段執行完
2、BL2階段
start_armboot函數位于lib_arm/board.c中,是C語言開始的函數,也是BL2階段代碼中C語言的 主函數,同時還是整個u-boot(armboot)的主函數,BL2階段的主要功能如下:
? (1)規劃uboot的內存使用
? (2)遍歷調用函數指針數組init_sequence中的初始化函數
? (3)初始化uboot的堆管理器mem_malloc_init
? (4)初始化SMDKV210開發板的SD/MMC控制器mmc_initialize
? (5)環境變量重定位env_relocate
? (6)將環境變量中網卡地址賦值給全局變量的開發板變量
? (7)開發板硬件設備的初始化devices_init
? (8)跳轉表jumptable_init
? (9)控制臺初始化console_init_r
? (10)網卡芯片初始化eth_initialize
? (11)uboot進入主循環main_loop
這里主要對第二個階段BL2進行一個分析。
3、start_armboot函數分析
start_armboot函數的主要功能如下:
? (1)遍歷調用函數指針數組init_sequence中的初始化函數
依次遍歷調用函數指針數組init_sequence中的函數,如果有函數執行出錯,則執行hang函數,打印出”### ERROR ### Please RESET the board ###”,進入死循環。
? (2)初始化uboot的堆管理器mem_malloc_init
? (3)初始化SMDKV210的SD/MMC控制器mmc_initialize
? (4)環境變量重定位env_relocate
? (5)將環境變量中網卡地址賦值給全局變量的開發板變量
? (6)開發板硬件設備的初始化devices_init
? (7)跳轉表jumptable_init
? (8)控制臺初始化console_init_r
? (9)網卡芯片初始化eth_initialize
? (10)uboot進入主循環main_loop
-
soc
+關注
關注
38文章
4199瀏覽量
218796 -
函數
+關注
關注
3文章
4345瀏覽量
62870 -
開發板
+關注
關注
25文章
5121瀏覽量
97973 -
Uboot
+關注
關注
4文章
125瀏覽量
28293
發布評論請先 登錄
相關推薦
評論