• <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平臺上Startup.s代碼的分析

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

                  下面以i.MX21平臺上的啟動代碼文件Startup.s為例進行分析.

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

             

            主要的函數代碼解讀如下:

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

             

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

                msr     cpsr_c, r0

            //在板子上電后,第一步是將處理器設置為特權模式

             

            bl      MMUCacheDisable

            //跳轉到MMUCacheDisable( ),使TLBcache、寫緩沖無效,并關閉 MMU、cache

             

            ldr     r1, =CSP_BASE_REG_PA_AIPI1

             ldr     r0, =0x00040304

                ……

            str     r0, [r1, #AIPI_PAR_OFFSET]

            //設置AIPI寄存器

             

                bl      OALSetUpSystemControl

                bl      OALSetUpFrequencies

            //跳轉到OALSetUpSystemControl OALSetUpFrequencies,初始化系統控制模式和時鐘頻率。

             

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

             orr     r0, r0, #0x00001000           

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

            //啟用I Cache

             

             bl      OALIsImageInRAM  

             bl      OALSetUpExtMemories

            //跳轉到OALIsImageInRAM、OALSetUpExtMemories以初始化外部存儲設備。

             

            ldr     r1, =CSP_BASE_REG_PA_MAX

                ldr     r0, =0x77123045

                str     r0, [r1, #MAX_MPR0_OFFSET]

                ……

            str     r0, [r1, #AITC_NIPRIORITY0_OFFSET]

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

             

            bl      OALSetUpGpio

            bl      OALSetUpKeypad

            b       OALStartUp

            //先后跳轉到OALSetUpGpioOALSetUpKeypad,即初始化系統GPIO和鍵盤設備。最后程序轉到OALStartUp(),執行代碼重定位和從RAM中啟動Eboot功能。

             

            上面提到的OALSetUpSystemControl 、OALSetUpFrequencies、OALSetUpExtMemories、OALSetUpGpio、OALSetUpKeypad這幾個函數位于 %WINCE\PLATFORM \iMX21\ Imx21ads\Src\Kernel\Oal\oal_startup.c中;OALIsImageInRAM()和OALStartUp()則位于%WINCE\PLATFORM\Imx21ads\Src\Kernel\Oal\startup.s中。

             

            2MMUSetup()---這個函數將被%Eboot\startup.s調用,它根據OEMAddressTable設置MMU,并使能MMU、啟用cache。

             

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

            功能:OEM板級初始化

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

            FlashPABase             EQU         CSP_BASE_MEM_PA_CS0

            FlashVABase             EQU         0x80000000

            RamPABase               EQU         CSP_BASE_MEM_PA_CSD0

            RamVABase               EQU         0x88000000

            RamMaxSize              EQU         0x04000000 ; 64M

            接下來的代碼可以分成四個函數:

            OALStartUp()

                adr     r0, g_oalAddressTable

                b       KernelStart

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

             

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

             

            BSPAmdBurstCfg44M()---iMX21標準板的flash設置為burst模式44M頻率

             

            BSPAmdBurstCfg66M()---iMX21標準板的flash設置為burst模式66M頻率

             

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

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

             

            基本流程:

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

            EbootRamOffset          EQU         0x00010000

            EbootImageSize          EQU         0x00040000

            EbootFlashPAStart       EQU         (FlashPABase)

            EbootFlashVAStart       EQU         (FlashVABase)

            EbootRamPAStart        EQU         (RamPABase + EbootRamOffset)

            EbootRamVAStart        EQU         (RamVABase + EbootRamOffset)

            //這里的信息是和eboot.bib相對應的,要對照著改動。

             

            MmuPageTableOffset      EQU         0x00001000

            MmuPageTableBase       EQU         (RamPABase + MmuPageTableOffset) 

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

             

            StackEndOffset          EQU        0x00070000

            StackEndVA            EQU        (RamVABase + StackEndOffset)

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

             

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

               bl      OALIsImageInRAM

                cmp     r0, #1

                beq     RamStart

            //如果已經在RAM里,則跳轉到RamStart程序段

             

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

                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

            //設置連接寄存器LR

               

             

                adrl     r0, g_oalAddressTable

            //加載OEMAddressTable和頁表的地址

             

               

                ldr     r1, =(MmuPageTableBase)

            //加載頁表的地址

               

                b       MMUSetup

                nop

                nop

                nop

                nop

                nop

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

             

            MMUSetupDone

             ldr     sp, =(StackEndVA-4)

            //MMU配置完成,使棧指針處于虛擬內存中

             

                b       BootloaderMain

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

             

            最后的Launch()代碼段是由EBOOT啟動函數OEMLaunch( )所調用的,用來關閉MMU,跳轉到CE內核。

            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    // 設置TLB無效

                mov     r1, #0x0078            

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

                mov     pc, r0                  // 跳轉到 PhysicalStart

                nop                           

                nop

                nop

                nop

             

            一般認為%WINCE\PLATFORM\COMMON\SRC\ARM\Freescale\MX21\Startup\startup.s里的Startup( )i.MX21標準板Eboot的第一個函數,上電后首先完成系統CPU初始化。

            posted on 2008-08-06 10:23 milkyway 閱讀(2477) 評論(0)  編輯 收藏 引用 所屬分類: Wince學習小結

            導航

            統計

            公告

            隨筆皆原創,文章乃轉載. 歡迎留言!

            常用鏈接

            留言簿(37)

            隨筆分類(104)

            隨筆檔案(101)

            文章分類(51)

            文章檔案(53)

            wince牛人

            搜索

            積分與排名

            最新評論

            閱讀排行榜

            評論排行榜

            99久久国产综合精品成人影院| 久久国产免费直播| 亚洲日韩中文无码久久| 亚洲国产美女精品久久久久∴ | 久久国产影院| 国内精品伊人久久久久影院对白 | 婷婷久久综合| 欧洲精品久久久av无码电影| 亚洲欧美日韩精品久久| 中文国产成人精品久久亚洲精品AⅤ无码精品 | 欧美va久久久噜噜噜久久| 久久综合久久久| 国产精品成人久久久| 国产精品美女久久久网AV| 亚洲精品无码成人片久久| 久久狠狠一本精品综合网| 亚洲国产美女精品久久久久∴| 国产成人香蕉久久久久| 麻豆AV一区二区三区久久| 欧美午夜精品久久久久久浪潮| 亚洲中文字幕无码久久2020| 99热热久久这里只有精品68| 久久精品亚洲精品国产色婷| 亚洲国产精品无码久久久久久曰 | 色婷婷狠狠久久综合五月| 久久免费小视频| 久久99精品国产99久久6男男| 久久久久久久波多野结衣高潮| 久久亚洲国产成人影院网站| 91精品国产高清久久久久久91| 久久精品中文无码资源站| 99精品久久精品一区二区| 色播久久人人爽人人爽人人片AV| 久久国产视频99电影| 久久久久亚洲AV成人网人人网站| 91精品国产高清久久久久久91| 国产精品久久久久9999| 91亚洲国产成人久久精品| 国产69精品久久久久777| 国产精品99久久久久久人| 成人免费网站久久久|