在完成地址無(wú)關(guān)fixup后,u-boot開始對(duì)一些系統(tǒng)寄存器進(jìn)行初始化。
第一段代碼如下:
pie_fixup_done:
#endif
#ifdef CONFIG_SYS_RESET_SCTRL
bl reset_sctrl --------------------------------------------------------------------- (1)
#endif
#if defined(CONFIG_ARMV8_SPL_EXCEPTION_VECTORS) || !defined(CONFIG_SPL_BUILD) ---------- (2)
.macro set_vbar, regname, reg
msr regname, reg
.endm
adr x0, vectors
#else
.macro set_vbar, regname, reg
.endm
#endif
/*
* Could be EL3/EL2/EL1, Initial State:
* Little Endian, MMU Disabled, i/dCache Disabled
*/
switch_el x1, 3f, 2f, 1f ---------------------------------------------------------- (3)
3: set_vbar vbar_el3, x0
mrs x0, scr_el3
orr x0, x0, #0xf /* SCR_EL3.NS|IRQ|FIQ|EA */
msr scr_el3, x0
msr cptr_el3, xzr /* Enable FP/SIMD */
b 0f
2: mrs x1, hcr_el2
tbnz x1, #34, 1f /* HCR_EL2.E2H */
set_vbar vbar_el2, x0
mov x0, #0x33ff
msr cptr_el2, x0 /* Enable FP/SIMD */
b 0f
1: set_vbar vbar_el1, x0
mov x0, #3 < < 20
msr cpacr_el1, x0 /* Enable FP/SIMD */
0:
#ifdef COUNTER_FREQUENCY -------------------------------------------------------------- (4)
branch_if_not_highest_el x0, 4f
ldr x0, =COUNTER_FREQUENCY
msr cntfrq_el0, x0 /* Initialize CNTFRQ */
#endif
4: isb ------------------------------------------------------------------------------- (5)
...
...
#ifdef CONFIG_SYS_RESET_SCTRL
reset_sctrl:
switch_el x1, 3f, 2f, 1f
3:
mrs x0, sctlr_el3
b 0f
2:
mrs x0, sctlr_el2
b 0f
1:
mrs x0, sctlr_el1
0:
ldr x1, =0xfdfffffa
and x0, x0, x1
switch_el x1, 6f, 5f, 4f
6:
msr sctlr_el3, x0
b 7f
5:
msr sctlr_el2, x0
b 7f
4:
msr sctlr_el1, x0
7:
dsb sy
isb
b __asm_invalidate_tlb_all ----------------------------------------------------- (6)
ret
#endif
- ? (1)一般情況下此功能不需要使用,但是一些由其他固件引導(dǎo)啟動(dòng)的u-boot,board希望系統(tǒng)行為能按照自己預(yù)期行為執(zhí)行而不受上一級(jí)加載器的影響,所以使用CONFIG_SYS_RESET_SCTRL來(lái)決定是否重置系統(tǒng)控制寄存器,包括保證處理器處于小端,關(guān)閉data cache,關(guān)閉mmu。 其中switch_el是一個(gè)宏,用于讀取當(dāng)前所處的異常級(jí)別,根據(jù)所處異常級(jí)別調(diào)用對(duì)應(yīng)的系統(tǒng)控制寄存器。某些時(shí)候u-boot的加載并不是一定在el3級(jí)別,當(dāng)存在atf等時(shí),el3由atf控制,atf會(huì)將u-boot的運(yùn)行級(jí)別切換到el2,以便保證自己的控制級(jí)別,所以u(píng)-boot通過(guò)switch_el來(lái)選擇自己能夠控制的系統(tǒng)寄存器。
- ? (2)定義設(shè)置異常向量表的宏,將異常向量表的地址寫入/reg設(shè)置的系統(tǒng)寄存器即可完成異常向量表的設(shè)置,這里u-boot是需要設(shè)置異常向量表的,而spl默認(rèn)是不需要設(shè)置異常向量表的,畢竟spl只是一個(gè)加載器只會(huì)運(yùn)行一次,不過(guò)當(dāng)定義了CONFIG_ARMV8_SPL_EXCEPTION_VECTORS時(shí)可以為spl也設(shè)置一個(gè)異常向量表。
- ? (3)同樣的使用switch_el來(lái)跳轉(zhuǎn)到對(duì)應(yīng)級(jí)別的路徑上去執(zhí)行,在進(jìn)行系統(tǒng)寄存器設(shè)置時(shí),因?yàn)樵谶@之前已經(jīng)由SYS_RESET_SCTRL或者board自己保證處理器處于小端,mmu關(guān),i-cache和d-cache處于關(guān)閉狀態(tài)了,所以這里直接進(jìn)行對(duì)應(yīng)級(jí)別系統(tǒng)寄存器設(shè)置,首先是跳轉(zhuǎn)到對(duì)應(yīng)表設(shè)置對(duì)應(yīng)級(jí)別的異常向量表。接著會(huì)有如下三種情況: 當(dāng)處于EL3時(shí),會(huì)設(shè)置安全配置系統(tǒng)寄存器(scr_el3),會(huì)將低四位bit設(shè)置為0xf,表示設(shè)置處理器處于非安全模式,任何級(jí)別的物理irq中斷,物理fiq,異常abort中斷,異常SError中斷都將被路由到el3級(jí)別。后續(xù)這些設(shè)置將在啟動(dòng)Linux時(shí)被修改,這些設(shè)置僅用于在u-boot階段。接著將cptr_el3清零,使用xzr是可以快速操作寄存器為零。這里保證任何級(jí)別下訪問(wèn)SIMD和floating-point指令不會(huì)導(dǎo)致觸發(fā)異常陷入el3。 當(dāng)處于EL2時(shí),首先根據(jù)HCR_EL2.E2H判斷系統(tǒng)是一個(gè)虛擬機(jī)管理器還是主機(jī)系統(tǒng),當(dāng)E2H = 0時(shí),表示系統(tǒng)處于主機(jī)系統(tǒng)只需要做el3一樣的操作配置SIMD和FP指令不會(huì)陷入el2即可。 當(dāng)系統(tǒng)處于EL1時(shí),則什么也不需要操作只需要配置SIMD和FP指令不會(huì)陷入el1。
- ? (4)u-boot在啟動(dòng)時(shí)系統(tǒng)的時(shí)鐘頻率不一定配置了,所以當(dāng)在include/configs/xxxxxx.h中定義了COUNTER_FREQUENCY的頻率值時(shí),說(shuō)明需要在此處配置系統(tǒng)時(shí)鐘,所以根據(jù)宏 branch_if_not_highest_el判斷當(dāng)系統(tǒng)不處于EL3時(shí)則需要設(shè)置系統(tǒng)的時(shí)鐘工作頻率cntfrq_el0,后續(xù)Linux或者u-boot根據(jù)讀出的這個(gè)值計(jì)算出系統(tǒng)每納秒的滴答數(shù)從而供軟件獲取時(shí)間流逝值。
- ? (5)isb指令用于確保上述操作指令被正確真正的執(zhí)行了,屬于同步指令的一種。
- ? (6)在進(jìn)行系統(tǒng)控制器復(fù)位時(shí),dsb sy,isb,__asm_invalidate_tlb_all三個(gè)操作在這里的意義是,因?yàn)閷?duì)處理器的小端,mmu,d-cache進(jìn)行了復(fù)位,所以這里必須通過(guò)dsb和isb確保數(shù)據(jù)和指令全部執(zhí)行和寫入,這里進(jìn)行了mmu和cache關(guān)閉操作,那么如果有緩存的tlb在這個(gè)時(shí)候這些緩存的tlb數(shù)據(jù)就是無(wú)效的,這里對(duì)可能緩存的tlb進(jìn)行全部無(wú)效化,確保后續(xù)任何可能的mmu開啟操作不會(huì)使用到這些無(wú)用的tlb條目而導(dǎo)致系統(tǒng)異常。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
ARM
+關(guān)注
關(guān)注
134文章
9180瀏覽量
369511 -
寄存器
+關(guān)注
關(guān)注
31文章
5372瀏覽量
121320 -
Uboot
+關(guān)注
關(guān)注
4文章
125瀏覽量
28366 -
系統(tǒng)
+關(guān)注
關(guān)注
1文章
1020瀏覽量
21442
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
U-Boot介紹
在移植 Linux之前我們需要先移植一個(gè) bootloader 代碼,這個(gè) bootloader 代碼用于啟動(dòng) Linux 內(nèi)核, bootloader有很多,常用的就是 U-Boot。
U-boot的基本介紹
從本文開始,將陸續(xù)推送“手把手教你移植U-boot”系列文章,目標(biāo)是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認(rèn)硬件開發(fā)平臺(tái)為ARM,操作
發(fā)表于 07-14 16:52
?3170次閱讀
![<b class='flag-5'>U-boot</b>的基本介紹](https://file1.elecfans.com/web2/M00/8C/C4/wKgaomSxDC-AIi1QAACKegMzhAU876.png)
基于開發(fā)板的U-Boot移植
bootloader,也就是通用的bootloader。它存在于nandflash或者SD卡中,它是在開機(jī)上點(diǎn)之后,操作系統(tǒng)起來(lái)之前用來(lái)引導(dǎo)的一個(gè)程序。U-boot 的主要作用是進(jìn)行內(nèi)存的初
發(fā)表于 01-14 14:31
如何對(duì)PWM寄存器進(jìn)行初始化配置
PWM的輸出原理是什么?PWM寄存器的配置步驟有哪些?如何對(duì)PWM寄存器進(jìn)行初始化配置?
發(fā)表于 08-02 10:02
U-BOOT的啟動(dòng)流程分享
Bootloader移植(下)U-BOOT 啟動(dòng)流程u-boot啟動(dòng)三個(gè)2啟動(dòng)步驟(重點(diǎn))U-boot 啟動(dòng)源碼分析U-BOOT 啟動(dòng)流程u-boo
發(fā)表于 01-18 10:17
u-boot簡(jiǎn)介
。 U-Boot是BootLoader的一種,是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行??梢?b class='flag-5'>初始化硬件設(shè)備、建立內(nèi)存空間映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)
發(fā)表于 10-14 11:17
?3606次閱讀
NAND閃存中啟動(dòng)U-BOOT的設(shè)計(jì)解析
U-BOOT 支持ARM、 PowerPC等多種架構(gòu)的處理器,也支持Linux、NetBSD和VxWorks等多種操作系統(tǒng),主要用來(lái)開發(fā)嵌入式系統(tǒng)初
發(fā)表于 10-29 11:29
?2次下載
如何使用Xilinx SDK調(diào)試u-boot代碼
了解如何使用Xilinx SDK調(diào)試u-boot代碼。
概述了技術(shù)以獲得重定位偏移量,以便可以在SDK中應(yīng)用它。
U-Boot啟動(dòng)內(nèi)核的工作過(guò)程詳細(xì)說(shuō)明
U-Boot 啟動(dòng)內(nèi)核的過(guò)程可以分為兩個(gè)階段,兩個(gè)階段的功能如下:(1)第一階段的功能
硬件設(shè)備初始化
加載 U-Boot 第二階段代碼到 RAM 空間
設(shè)置好棧
跳轉(zhuǎn)到第二階段
發(fā)表于 12-28 08:00
?3次下載
![<b class='flag-5'>U-Boot</b>啟動(dòng)內(nèi)核的工作過(guò)程詳細(xì)說(shuō)明](https://file.elecfans.com/web1/M00/D7/D6/pIYBAF_pSouAJY_qAAIzvKxxtKQ910.png)
tiny4412編譯與移植U-Boot
U-Boot 是一個(gè)主要用于嵌入式系統(tǒng)的引導(dǎo)加載程序, U-Boot本質(zhì)是一個(gè)裸機(jī)程序,是一種普遍用于嵌入式系統(tǒng)中的開源的Bootloader,作用是用來(lái)引導(dǎo)操作
![tiny4412編譯與移植<b class='flag-5'>U-Boot</b>](https://file.elecfans.com//web2/M00/66/AB/pYYBAGMOIoqAWweoAAFTzdNj8LY073.png)
與初始化相關(guān)的重要寄存器介紹
在上例中,介紹了配置OV5640所需的SCCB時(shí)序,以及具體的實(shí)現(xiàn)。本例將介紹與初始化相關(guān)的重要寄存器,以及上電時(shí)序。
MSP430F5529硬件IIC驅(qū)動(dòng)OLED(初始化使用的寄存器)
MSP430F5529硬件IIC驅(qū)動(dòng)OLED(初始化使用的寄存器)
發(fā)表于 11-24 16:36
?1次下載
u-boot在匯編啟動(dòng)階段的相關(guān)操作介紹
u-boot在匯編啟動(dòng)階段對(duì)系統(tǒng)的一些初始化 當(dāng)cpu交由u-boot接管進(jìn)入u-boot后, 首先會(huì)到_start符號(hào)處開始執(zhí)行
評(píng)論