• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            milkyway的窩

            最初想法的誕生地

             

            i.MX21平臺(tái)上Startup.s代碼的分析

                  在嵌入式系統(tǒng)中,Boot Loader是系統(tǒng)運(yùn)行必不可少的前提。在特定的硬件平臺(tái)上運(yùn)行Windows CE最困難的工作之一就是讓Boot Loader正常啟動(dòng)這個(gè)硬件平臺(tái)。 Boot Loader從代碼層面上來說由OEM啟動(dòng)代碼(OEM startup code)和主代碼(main code)兩部分組成。 其中, OEM啟動(dòng)代碼是Boot Loader的入口點(diǎn),是目標(biāo)平臺(tái)上電后最先執(zhí)行的部分。一般是對(duì)處理器內(nèi)核進(jìn)行配置和初始化,為后面的引導(dǎo)程序作準(zhǔn)備。這類代碼直接面向處理器進(jìn)行編程,一般用匯編語言實(shí)現(xiàn)。通用的內(nèi)容包括:(1)設(shè)置中斷向量表;(2)初始化存儲(chǔ)器系統(tǒng);(3)初始化堆棧;(4)初始化調(diào)試端口和設(shè)備;(5)初始化C語言環(huán)境;(6)轉(zhuǎn)到主代碼main. c。

                  下面以i.MX21平臺(tái)上的啟動(dòng)代碼文件Startup.s為例進(jìn)行分析.

            (一)       %WINCE\PLATFORM\COMMON\SRC\ARM\Freescale\MX21\Startup\startup.s
            WinCE_MX21_BSP
            用戶手冊(cè)里提到的OAL層源代碼,用于在OEM板級(jí)初始化前先初始化MX21處理器的核心模塊。

             

            主要的函數(shù)代碼解讀如下:

            1. StartUp()---這部分代碼是EbootOAL共享的。

             

                mov     r0, #(SVCMode:OR:IRQDisable:OR:FIQDisable)

                msr     cpsr_c, r0

            //在板子上電后,第一步是將處理器設(shè)置為特權(quán)模式

             

            bl      MMUCacheDisable

            //跳轉(zhuǎn)到MMUCacheDisable( ),使TLBcache、寫緩沖無效,并關(guān)閉 MMUcache

             

            ldr     r1, =CSP_BASE_REG_PA_AIPI1

             ldr     r0, =0x00040304

                ……

            str     r0, [r1, #AIPI_PAR_OFFSET]

            //設(shè)置AIPI寄存器

             

                bl      OALSetUpSystemControl

                bl      OALSetUpFrequencies

            //跳轉(zhuǎn)到OALSetUpSystemControl OALSetUpFrequencies,初始化系統(tǒng)控制模式和時(shí)鐘頻率。

             

             mrc     p15, 0, r0, c1, c0, 0

             orr     r0, r0, #0x00001000           

             mcr     p15, 0, r0, c1, c0, 0

            //啟用I Cache

             

             bl      OALIsImageInRAM  

             bl      OALSetUpExtMemories

            //跳轉(zhuǎn)到OALIsImageInRAMOALSetUpExtMemories以初始化外部存儲(chǔ)設(shè)備。

             

            ldr     r1, =CSP_BASE_REG_PA_MAX

                ldr     r0, =0x77123045

                str     r0, [r1, #MAX_MPR0_OFFSET]

                ……

            str     r0, [r1, #AITC_NIPRIORITY0_OFFSET]

            //設(shè)置MAX寄存器、配置AITC中斷控制器、屏蔽和清中斷的一段代碼。

             

            bl      OALSetUpGpio

            bl      OALSetUpKeypad

            b       OALStartUp

            //先后跳轉(zhuǎn)到OALSetUpGpioOALSetUpKeypad,即初始化系統(tǒng)GPIO和鍵盤設(shè)備。最后程序轉(zhuǎn)到OALStartUp(),執(zhí)行代碼重定位和從RAM中啟動(dòng)Eboot功能。

             

            上面提到的OALSetUpSystemControl OALSetUpFrequenciesOALSetUpExtMemoriesOALSetUpGpioOALSetUpKeypad這幾個(gè)函數(shù)位于 %WINCE\PLATFORM \iMX21\ Imx21ads\Src\Kernel\Oal\oal_startup.c中;OALIsImageInRAM()和OALStartUp()則位于%WINCE\PLATFORM\Imx21ads\Src\Kernel\Oal\startup.s中。

             

            2MMUSetup()---這個(gè)函數(shù)將被%Eboot\startup.s調(diào)用,它根據(jù)OEMAddressTable設(shè)置MMU,并使能MMU、啟用cache

             

            (二)%WINCE\PLATFORM\Imx21ads\Src\Kernel\Oal\startup.s

            功能:OEM板級(jí)初始化

            這部分代碼首先定義了flashRAM的物理地址和虛擬地址:

            FlashPABase             EQU         CSP_BASE_MEM_PA_CS0

            FlashVABase             EQU         0x80000000

            RamPABase               EQU         CSP_BASE_MEM_PA_CSD0

            RamVABase               EQU         0x88000000

            RamMaxSize              EQU         0x04000000 ; 64M

            接下來的代碼可以分成四個(gè)函數(shù):

            OALStartUp()

                adr     r0, g_oalAddressTable

                b       KernelStart

            //加載OEMAddressTable地址,跳轉(zhuǎn)到KernelStart()

             

            OALIsImageInRAM()---檢查Image是否正跑在RAM

             

            BSPAmdBurstCfg44M()---iMX21標(biāo)準(zhǔn)板的flash設(shè)置為burst模式44M頻率

             

            BSPAmdBurstCfg66M()---iMX21標(biāo)準(zhǔn)板的flash設(shè)置為burst模式66M頻率

             

            (三)%WINCE\PLATFORM\Imx21ads\Src\Bootloader\Eboot\startup.s

            功能:調(diào)用了OALStartup.s(位于%WINCE\Platform\Common\Src\Arm\Freescale\MX21),將Eboot重定位至RAM中運(yùn)行,并初始化MMU,使能MMUcache,引導(dǎo)啟動(dòng)CE內(nèi)核等。

             

            基本流程:

            首先給出了一系列宏定義,比如Eboot的大小和地址信息:

            EbootRamOffset          EQU         0x00010000

            EbootImageSize          EQU         0x00040000

            EbootFlashPAStart       EQU         (FlashPABase)

            EbootFlashVAStart       EQU         (FlashVABase)

            EbootRamPAStart        EQU         (RamPABase + EbootRamOffset)

            EbootRamVAStart        EQU         (RamVABase + EbootRamOffset)

            //這里的信息是和eboot.bib相對(duì)應(yīng)的,要對(duì)照著改動(dòng)。

             

            MmuPageTableOffset      EQU         0x00001000

            MmuPageTableBase       EQU         (RamPABase + MmuPageTableOffset) 

            //MMU頁表在RAM中的物理地址和大小

             

            StackEndOffset          EQU        0x00070000

            StackEndVA            EQU        (RamVABase + StackEndOffset)

            //棧尾的偏移地址和虛擬地址

             

            接著進(jìn)入KernelStart()函數(shù),先跳轉(zhuǎn)到OALIsImageInRAM程序段判斷Image是否正跑在RAM里。

               bl      OALIsImageInRAM

                cmp     r0, #1

                beq     RamStart

            //如果已經(jīng)在RAM里,則跳轉(zhuǎn)到RamStart程序段

             

            如果不是,則在接下來的RelocateEBOOT程序段里進(jìn)行代碼重定位:

                ldr        r1, =FlashPABase

                ldr        r0, =EbootRamPAStart

                ldr        r2, =(EbootImageSize/16)

                ldmia   r1!, {r3-r6}

                stmia   r0!, {r3-r6}

                subs    r2, r2, #1

                bne     %b10

                adr     r2, RamStart

                ldr     r3, =(FlashPABase)

                sub     r3, r2, r3

                ldr     r4, =(EbootRamPAStart)

                add     r2, r4, r3

                bx      r2

             

            RamStart段代碼如下:

                adr     r2, MMUSetupDone

                ldr     r3, =(EbootRamPAStart)

                sub     r2, r2, r3

                ldr     r3, =(EbootRamVAStart)

                add     r2, r2, r3

                mov     lr, r2

            //設(shè)置連接寄存器LR

               

             

                adrl     r0, g_oalAddressTable

            //加載OEMAddressTable和頁表的地址

             

               

                ldr     r1, =(MmuPageTableBase)

            //加載頁表的地址

               

                b       MMUSetup

                nop

                nop

                nop

                nop

                nop

            //跳轉(zhuǎn)到OAL層核心源代碼的MMUSetup函數(shù),使能MMU、設(shè)置虛擬內(nèi)存模式,并通過g_oalAddressTable初始化MMU頁表

             

            MMUSetupDone

             ldr     sp, =(StackEndVA-4)

            //MMU配置完成,使棧指針處于虛擬內(nèi)存中

             

                b       BootloaderMain

            //跳轉(zhuǎn)到% blcommon.c中的BootloaderMain()

             

            最后的Launch()代碼段是由EBOOT啟動(dòng)函數(shù)OEMLaunch( )所調(diào)用的,用來關(guān)閉MMU,跳轉(zhuǎn)到CE內(nèi)核。

            mov     r1, #0

                  mcr              p15, 0, r1, c7, c7, 0          // 初始化I, D cache

                  mcr              p15, 0, r1, c7, c10, 4     // 初始化write buffer

                  mcr              p15, 0, r1, c8, c7, 0    // 設(shè)置TLB無效

                mov     r1, #0x0078            

                mcr     p15, 0, r1, c1, c0, 0  // Disable MMU, caches write buffer

                mov     pc, r0                  // 跳轉(zhuǎn)到 PhysicalStart

                nop                           

                nop

                nop

                nop

             

            一般認(rèn)為%WINCE\PLATFORM\COMMON\SRC\ARM\Freescale\MX21\Startup\startup.s里的Startup( )i.MX21標(biāo)準(zhǔn)板Eboot的第一個(gè)函數(shù),上電后首先完成系統(tǒng)CPU初始化。

            posted on 2008-08-06 10:23 milkyway 閱讀(2495) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Wince學(xué)習(xí)小結(jié)

            導(dǎo)航

            統(tǒng)計(jì)

            公告

            隨筆皆原創(chuàng),文章乃轉(zhuǎn)載. 歡迎留言!

            常用鏈接

            留言簿(37)

            隨筆分類(104)

            隨筆檔案(101)

            文章分類(51)

            文章檔案(53)

            wince牛人

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            香蕉久久影院| 国产一区二区精品久久岳| 久久亚洲国产最新网站| 欧美一区二区三区久久综| 久久久久中文字幕| 国产精品成人久久久| 乱亲女H秽乱长久久久| 国产免费福利体检区久久| 99久久国产宗和精品1上映| AA级片免费看视频久久| 人妻少妇久久中文字幕一区二区| 国产叼嘿久久精品久久| 久久精品国产亚洲av水果派| 香蕉99久久国产综合精品宅男自 | 久久久久亚洲爆乳少妇无| 香蕉久久夜色精品升级完成| 国产午夜福利精品久久| 日韩精品久久久肉伦网站| 久久精品综合网| 久久精品国产第一区二区| 国产国产成人久久精品| 国产精品欧美久久久天天影视| 国产免费久久精品99re丫y| segui久久国产精品| 中文字幕一区二区三区久久网站| 狠狠88综合久久久久综合网 | 国产99久久久国产精免费| 久久线看观看精品香蕉国产| 漂亮人妻被黑人久久精品| 蜜臀av性久久久久蜜臀aⅴ麻豆| 亚洲中文字幕无码一久久区| 久久久久久国产精品美女| 四虎国产精品成人免费久久| 久久人人爽人人精品视频| 人人狠狠综合久久亚洲高清| 久久中文字幕视频、最近更新| 久久AAAA片一区二区| 一本色道久久综合| 亚洲香蕉网久久综合影视| 久久婷婷五月综合97色| 国产精品久久久久天天影视|