0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

u-boot對(duì)系統(tǒng)寄存器進(jìn)行初始化代碼

麥辣雞腿堡 ? 來源:CSDN博客 ? 作者:內(nèi)核新視界 ? 2023-12-07 11:34 ? 次閱讀

在完成地址無關(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來決定是否重置系統(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通過switch_el來選擇自己能夠控制的系統(tǒng)寄存器。
  • ? (2)定義設(shè)置異常向量表的宏,將異常向量表的地址寫入/reg設(shè)置的系統(tǒng)寄存器即可完成異常向量表的設(shè)置,這里u-boot是需要設(shè)置異常向量表的,而spl默認(rèn)是不需要設(shè)置異常向量表的,畢竟spl只是一個(gè)加載器只會(huì)運(yùn)行一次,不過當(dāng)定義了CONFIG_ARMV8_SPL_EXCEPTION_VECTORS時(shí)可以為spl也設(shè)置一個(gè)異常向量表。
  • ? (3)同樣的使用switch_el來跳轉(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í)別下訪問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í),說明需要在此處配置系統(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ù)位,所以這里必須通過dsb和isb確保數(shù)據(jù)和指令全部執(zhí)行和寫入,這里進(jìn)行了mmu和cache關(guān)閉操作,那么如果有緩存的tlb在這個(gè)時(shí)候這些緩存的tlb數(shù)據(jù)就是無效的,這里對(duì)可能緩存的tlb進(jìn)行全部無效化,確保后續(xù)任何可能的mmu開啟操作不會(huì)使用到這些無用的tlb條目而導(dǎo)致系統(tǒng)異常。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ARM
    ARM
    +關(guān)注

    關(guān)注

    134

    文章

    8967

    瀏覽量

    365045
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5253

    瀏覽量

    119206
  • Uboot
    +關(guān)注

    關(guān)注

    4

    文章

    124

    瀏覽量

    28055
  • 系統(tǒng)
    +關(guān)注

    關(guān)注

    1

    文章

    1002

    瀏覽量

    21219
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    U-Boot介紹

    在移植 Linux之前我們需要先移植一個(gè) bootloader 代碼,這個(gè) bootloader 代碼用于啟動(dòng) Linux 內(nèi)核, bootloader有很多,常用的就是 U-Boot。
    的頭像 發(fā)表于 10-08 10:50 ?3647次閱讀

    U-boot的基本介紹

    從本文開始,將陸續(xù)推送“手把手教你移植U-boot”系列文章,目標(biāo)是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認(rèn)硬件開發(fā)平臺(tái)為ARM,操作
    發(fā)表于 07-14 16:52 ?2503次閱讀
    <b class='flag-5'>U-boot</b>的基本介紹

    基于開發(fā)板的U-Boot移植

    bootloader,也就是通用的bootloader。它存在于nandflash或者SD卡中,它是在開機(jī)上點(diǎn)之后,操作系統(tǒng)起來之前用來引導(dǎo)的一個(gè)程序。U-boot 的主要作用是進(jìn)行內(nèi)存的
    發(fā)表于 01-14 14:31

    U-boot環(huán)境變量初始化有哪些方式?

    此處介紹 U-boot 環(huán)境變量初始化的兩種方式 ,方式 1 與 方式 2 。
    發(fā)表于 09-16 10:36

    如何對(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

    移位寄存器初始化

    Labview之移位寄存器初始化,很好的Labview資料,快來下載學(xué)習(xí)吧。
    發(fā)表于 04-19 10:56 ?0次下載

    u-boot簡介

    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 ?3487次閱讀

    NAND閃存中啟動(dòng)U-BOOT的設(shè)計(jì)解析

    U-BOOT 支持ARM、 PowerPC等多種架構(gòu)的處理,也支持Linux、NetBSD和VxWorks等多種操作系統(tǒng),主要用來開發(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)用它。
    的頭像 發(fā)表于 11-27 06:36 ?4080次閱讀

    U-Boot啟動(dòng)內(nèi)核的工作過程詳細(xì)說明

    U-Boot 啟動(dòng)內(nèi)核的過程可以分為兩個(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)核的工作過程詳細(xì)說明

    tiny4412編譯與移植U-Boot

    U-Boot 是一個(gè)主要用于嵌入式系統(tǒng)的引導(dǎo)加載程序, U-Boot本質(zhì)是一個(gè)裸機(jī)程序,是一種普遍用于嵌入式系統(tǒng)中的開源的Bootloader,作用是用來引導(dǎo)操作
    的頭像 發(fā)表于 08-31 08:59 ?1676次閱讀
    tiny4412編譯與移植<b class='flag-5'>U-Boot</b>

    初始化相關(guān)的重要寄存器介紹

    在上例中,介紹了配置OV5640所需的SCCB時(shí)序,以及具體的實(shí)現(xiàn)。本例將介紹與初始化相關(guān)的重要寄存器,以及上電時(shí)序。
    的頭像 發(fā)表于 10-18 09:18 ?1554次閱讀

    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í)行
    的頭像 發(fā)表于 12-07 11:22 ?415次閱讀