uboot第一階段

前提:系統啓動步驟(uboot 200K)
1、iROM中,先判斷Soc是從Nand中啓動還是在SD卡啓動
2、將BL1、2讀進SRAM(96K)中,這是uboot的第一階段,這階段uboot第一部分在SRAM中運行,彙編階段,將uboot
3、將BL3讀進SRAM中,這是uboot的第二階段,C階段,初始化好DRAM,此時的階段uboot第二部分已經在DRAM運行了,準備將整個uboot和OS讀進SDRAM中
*************************************************uboot第一階段**********************************************************
第一階段: 彙編階段
在SRAM中
注重Soc內部
****************************************************************************************************************************
注:uboot第一階段
****************************************************************************************************************************
第一階段開始正式分析:
.word 0x2000\.word 0x0\.word 0x0\.word 0x0 //開頭需要16個字節做校驗頭,先用16字節填充SD卡或者Nand鏡像
b reset //先復位
{ //構建異常向量表
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
}
.balignl 16,0xdeadbeef //讓當前地址對齊
_TEXT_BASE: //Makefile中會產生這個uboot的鏈接地址c3e00000
.word TEXT_BAS
CFG_PHY_UBOOT_BASE // uboot在DDR中的物理地址33e00000
msr cpsr_c //設置CPU爲SVC模式
bl disable_l2cache //禁止L2 cache,具體意思可以先不理會
bl set_l2cache_auxctrl //L2 cache相關初始化
bl enable_l2cache //使能L2 cache
moveq   r3, #BOOT_MMCSD //保存SOC是從什麼地方啓動的
ldr sp, =0xd0036000 //設置棧,二層調用的話,防止LR丟失,先將LR入棧,跳轉後就壓棧
sub sp, sp, #12
mov fp, #0
lowlevel_init //跳轉到lowlevel_init
str r1, [r0, #WSPR] //關看門狗
str r1, [r0, #WSPR]

ldr r0, =OMAP2420_SDRC_BASE 電鎖存
ldr r1, =0x00000010
str r1, [r0, #0x10]

bic r1, pc, r0 //用來獲取當前運行的地址
ldr r2, _TEXT_BASE //加載鏈接地址到r2,最後比較r1和r2是否相等,用於判斷是冷啓動還是熱啓動









































 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章