u boot第一階段分析(四)

2021-08-02 21:58:18 字數 2724 閱讀 6426

上一章說了lowlevel_init.s,現在重新回到start.s中。

1.再次設定棧

ldr	sp, _text_phy_base	

sub sp, sp, #12

mov fp, #0

(1)之前在呼叫lowlevel_init程式前設定過1次棧(start.s 284-287行),那時候因為ddr尚未初始化,因此程式執行都是在sram中,所以在sram中分配了一部分記憶體作為棧。本次因為ddr已經被初始化了,為了防止sram中棧不夠用,因此要把棧挪移到ddr中,所以要重新設定棧,這是第二次(start.s 297-299行);

(2)這裡實際設定的棧的位址是33e00000,分析**可以得出:

_text_phy_base的字面意思是**段實體地址基位址的意思,用si我們可以檢視到:

_text_phy_base:

.word cfg_phy_uboot_base

通過si可以繼續查到:#define cfg_phy_uboot_base memory_base_address + 0x3e00000

其中memory_base_address值為30000000;

2.再次判斷當前位址以決定是否重定位

ldr	r0, =0xff000fff

bic r1, pc, r0

ldr r2, _text_base

bic r2, r2, r0

cmp r1, r2

beq after_copy

(1)再次使用與lowlevel.init.s中相同的**來判斷當前位址是在sram中還是ddr中,不過和上一次目的不一樣。

上一次判斷是為了決定是否要執行初始化時鐘和ddr的**;這一次判斷是為了決定是否進行uboot的重定位;

(2)冷啟動時當前情況是uboot的前一部分(16kb或者8kb)開機自動從sd卡載入到sram中正在執行,uboot的第二部分(其實第二部分是整個uboot)還躺在sd卡的某個扇區開頭的n個扇區中。此時uboot的第一階段已經即將結束了(第一階段該做的事基本做完了),結束之前要把第二部分載入到ddr中鏈結位址處(33e00000),這個載入過程就叫重定位。

3.重定位

#if defined(config_evt1)

/* if bl1 was copied from sd/mmc ch2 */

ldr r0, =0xd0037488

ldr r1, [r0]

ldr r2, =0xeb200000

cmp r1, r2

beq mmcsd_boot

#endif

ldr r0, =inf_reg_base

ldr r1, [r0, #inf_reg3_offset]

cmp r1, #boot_nand /* 0x0 => boot device is nand */

beq nand_boot

cmp r1, #boot_onenand /* 0x1 => boot device is onenand */

beq onenand_boot

cmp r1, #boot_mmcsd

beq mmcsd_boot

cmp r1, #boot_nor

beq nor_boot

cmp r1, #boot_sec_dev

beq mmcsd_boot

(1)首先這裡的d0037488這個記憶體位址在sram中,這個位址中的值是被硬體自動設定的,代表的是哪個sd**道。硬體根據我們實際電路中sd卡在哪個通道中,會將這個位址中的值設定為相應的數字。譬如我們從sd0通道啟動時,這個值為eb000000;從sd2通道啟動時,這個值為eb200000。

(2)**中將d0037488中的值與eb200000想比較,如果相等則跳轉到mmcsd_boot,否則繼續執行下面的**。

(3)我們在start.s的260行確定了從mmcsd啟動,

/* sd/mmc boot */

cmp r2, #0xc

moveq r3, #boot_mmcsd

然後又在278行將#boot_mmcsd寫入了inf_reg3暫存器中儲存著,

ldr	r0, =inf_reg_base

str r3, [r0, #inf_reg3_offset]

然後又在322行讀出來,再和#boot_mmcsd去比較,確定是從mmcsd啟動,最終跳轉到mmcsd_boot函式中去執行重定位動作。

ldr	r1, [r0, #inf_reg3_offset]

cmp r1, #boot_mmcsd

beq mmcsd_boot

所以不管怎樣,最終都會跳轉到mmcsd_boot處執行。

mmcsd_boot:

bl movi_bl2_copy

b after_copy

真正的重定位是通過呼叫movi_bl2_copy函式完成的,在uboot/cpu/s5pc11x/movi.c中,是乙個c語言的函式。

UBOOT第一階段分析

感覺不錯的乙個圖就轉過來了!u boot第一階段的啟動流程。這個階段主要是初始化硬體裝置,為載入u boot的第二階段 準備ram空間最後跳轉到lib arm board.c中start armboot函式,這是第二階段的入口點。u boot第一階段的儲存器布局。上圖中u boot安裝在nand f...

u boot第一階段

u boot 第一階段 位置 cpu arm920t start.s 流程分析 1.儲存一些全域性變數,用於啟動程式將 從flash拷貝到ram或其他使用。有一些變數的值是通過鏈結指令碼得到的,如 text base 位於board 2440 config.mk 中 bss start end 位於...

uboot移植(四) uboot啟動第一階段

1 bl0 bl1 bl2分別是什麼 1 bl0 s5pv210的irom中固化的 作用 初始化系統時鐘,設定看門狗,初始化棧,載入bl1 2 bl1 從外部啟動介質 nand sd卡 中載入的uboot.bin的前16k 作用 初始化ram,關閉cache,初始化ddr,設定棧,載入bl2 3 b...