經(jīng)過(guò)了上一篇的配置,我們已經(jīng)執(zhí)行make就可以編譯出一個(gè)uboot.bin,但這還不夠,首先,此時(shí)的uboot并不符合三星芯片對(duì)bootloader的格式要求,同時(shí),此時(shí)的uboot.bin也沒(méi)有結(jié)合我們的開(kāi)發(fā)板進(jìn)行配置,還無(wú)法使用。而要進(jìn)行這樣的個(gè)性化配置,前提條件就是對(duì)uboot開(kāi)機(jī)流程和編譯系統(tǒng)有所了解,本文主要討論前者。在三星的SoC中, 啟動(dòng)流程可以分為三個(gè)階段BL0, BL1, BL2, BL3, 三星自己的手冊(cè)對(duì)BL1的解釋也不盡相同, 一種是將在iRAM中運(yùn)行的程序都?xì)w結(jié)為BL1; 一種是將iRAM中三星加密的代碼bl1.bin作為BL1, iRAM中剩余的部分作為BL2, 本文采用后者, 他們的主要分工如下:
BL0: ARM的起始地址都是0地址, 三星的芯片一般將0地址映射到iROM中, BL0就是指iROM中固化的啟動(dòng)代碼, 主要負(fù)責(zé)加載BL1
BL1: 三星對(duì)于bootloader的加密代碼bl1.bin, 要放在外設(shè)中uboot.bin的頭上, 和一部分uboot.bin一起加載到iRAM中運(yùn)行.
BL2: 從(nand/sd/usb)中拷貝的uboot.bin頭最大14K到iRAM中代碼中除去bl1.bin后剩余的部分, 負(fù)責(zé)設(shè)置CPU為SVC模式, 關(guān)閉MMU, 關(guān)閉中斷, 關(guān)閉iCache, 關(guān)閉看門狗, 初始化DRAM,初始化時(shí)鐘, 初始化串口, 設(shè)置棧, 校驗(yàn)BL2并將其搬移到DRAM高位地址, 重定位到DRAM中執(zhí)行BL3
BL3:是指在代碼重定向后在內(nèi)存中執(zhí)行的uboot的完整代碼, 負(fù)責(zé)初始化外設(shè),更新向量表, 清BSS, 準(zhǔn)備內(nèi)核啟動(dòng)參數(shù), 加載并運(yùn)行OS內(nèi)核
可以借助下圖理解這個(gè)流程
我們常說(shuō)的uboot是一個(gè)兩階段bootloader,就是指上述的BL2和BL3. BL2主要做硬件直接相關(guān)的初始化,使用匯編編寫(xiě);BL3主要為操作系統(tǒng)的運(yùn)行準(zhǔn)備環(huán)境,主要用C編寫(xiě),這里以ARM平臺(tái)為例分析其啟動(dòng)流程。下面是啟動(dòng)過(guò)程中主要涉及的文件
arch/arm/cpu/armv7/start.S
board/samsung/myboard/lowlevel_init.S
arch/arm/lib/crt0.S
arch/arm/lib/board.c
arch/samsung/myboard/myboard.c
BL2
BL2的主要文件和任務(wù)流程如下
arch/arm/cpu/armv7/start.S
&nb