Bootloader/u-boot的啟動(dòng)模式
u-boot的啟動(dòng)一般流程:
第一階段:依賴cpu初始化外圍硬件代碼,通常用匯編代碼實(shí)現(xiàn)
1、設(shè)置cpu的工作模式;
2、關(guān)中斷,以防止意外發(fā)生;
mrs r0,cpsr//讀取cpsr中的數(shù)據(jù)到r0中
bic r0,r0,#0x 1f//將寄存器r0的值和0x1f的反碼安位與之后將結(jié)果存儲(chǔ)在r0中相當(dāng)于清零
orr r0,r0,#0xd3//將寄存器r0的值和0xd3 安位或之后將結(jié)果保存在r0寄存器之中,關(guān)閉中斷
msr cpsr,r0//將cpsr中的數(shù)值寫到r0寄存器中
3、關(guān)閉看門狗,避免系統(tǒng)重啟;
#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
# if defined(CONFIG_S3C2400)
# define pWTCON 0x15300000
# define INTMSK 0x14400008
# define CLKDIVN 0x14800014
#else
# define pWTCON 0x53000000
# define INTMSK 0x4A000008
# define INTSUBMSK 0x4A00001C
# define CLKDIVN 0x4C000014
# endif
4、設(shè)置back初始化,設(shè)置cpu的工作頻率;
#if defined(CONFIG_S3C2440)
ldr r0, =CLKDIVN
mov r1,#5
str r1,[r0]
mrc p15,0,r1,c1,c0,0
orr r1, r1,#0xc0000000
mcr p15,0,r1,c1,c0,0
mov r1,#CLK_CTL_BASE
mov r2,#MDIV_405
add r2,r2,#PSDIV_405
str r2,[r1,#0x4]
#else
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
#endif
adr r0, _start //adr是讀取地址的偽指令,表示將_start標(biāo)示的運(yùn)行地址給r0
ldr r1, _TEXT_BASE // 表示將_TEXT_BASE 指向的地址中的數(shù)據(jù)拷貝到r1中
cmp r0, r1 //比較是否相同
beq stack_setup //相同跳轉(zhuǎn)出去
ldr r2, _armboot_start //start起始地址,包含RO代碼段+RW 數(shù)據(jù)段+ZI全局變量
ldr r3, _bss_start //全局變量的地址
sub r2, r3, r2 //相減之后得到的是代碼段+數(shù)據(jù)段的總大小
add r2, r0 r2, //r0是要燒錄的內(nèi)容,表示的是燒錄的代碼段+數(shù)據(jù)段的結(jié)束地址
copy_loop:
ldmia r0!, {r3-r10} //ldmia批量的拷貝,向后拷貝32位到r3-r10(將r0中的數(shù)據(jù)讀出到r3-r10的,r0自動(dòng)加一)
stmia r1!, {r3-r10} //stmia批量的存儲(chǔ)到r1上也就是目標(biāo)運(yùn)行的地址上(將r3-r10中的數(shù)據(jù)保存到r1指向的地址上,r1自動(dòng)加一)
cmp r0, r2 //r0 燒錄的起始地址,r2燒錄的結(jié)束地址,相等則說(shuō)明拷貝完成
ble copy_loop
#endif
6、設(shè)置建立堆棧;
7、執(zhí)行內(nèi)存地址上的程序,該工作可以使ldr pc來(lái)完成;
第一階段:依賴cpu初始化外圍硬件代碼,通常用匯編代碼實(shí)現(xiàn)
1、設(shè)置cpu的工作模式;
2、關(guān)中斷,以防止意外發(fā)生;
mrs
3、關(guān)閉看門狗,避免系統(tǒng)重啟;
#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)
# if defined(CONFIG_S3C2400)
#
#
#
#else
#
#
#
#
# endif
4、設(shè)置back初始化,設(shè)置cpu的工作頻率;
#if defined(CONFIG_S3C2440)
#else
#endif
copy_loop:
#endif
6、設(shè)置建立堆棧;
7、執(zhí)行內(nèi)存地址上的程序,該工作可以使ldr
start.s是u-boot啟動(dòng)所執(zhí)行的第一個(gè)文件,它說(shuō)做的是設(shè)置系統(tǒng)堆棧和cpu的工作方式,為進(jìn)入c程序奠定基礎(chǔ)。
第二階段:用c語(yǔ)言完成,以實(shí)現(xiàn)更復(fù)雜的命令
1、
2、
3、
4、
5、
6、
7、
評(píng)論