青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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、寫緩沖無效,并關閉 MMUcache

 

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

//跳轉到OALIsImageInRAMOALSetUpExtMemories以初始化外部存儲設備。

 

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 OALSetUpFrequenciesOALSetUpExtMemoriesOALSetUpGpioOALSetUpKeypad這幾個函數位于 %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板級初始化

這部分代碼首先定義了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

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

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 閱讀(2503) 評論(0)  編輯 收藏 引用 所屬分類: Wince學習小結

導航

統計

公告

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

常用鏈接

留言簿(37)

隨筆分類(104)

隨筆檔案(101)

文章分類(51)

文章檔案(53)

wince牛人

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            暖暖成人免费视频| 亚洲欧洲在线看| 亚洲私拍自拍| 久久久久亚洲综合| 亚洲永久免费| 欧美另类videos死尸| 欧美成人免费播放| 久久精品国产综合精品| 欧美在线观看一区二区| 亚洲视频在线观看| 99热免费精品| 欧美亚洲视频在线观看| 亚洲欧美视频一区二区三区| 一区二区三区精品视频| 亚洲精品国产精品久久清纯直播| 亚洲国产成人久久| 亚洲国产日韩精品| 亚洲精品在线免费| 久久精品国产亚洲aⅴ| 欧美成人免费视频| 欧美日韩国产在线看| 欧美午夜不卡| 欧美精品福利| 国产精品大片| 国产精品jizz在线观看美国 | 久久国产日韩欧美| 午夜欧美精品| 久久久av毛片精品| 欧美午夜片欧美片在线观看| 国产精品久久久久久影视 | 欧美黄色一区| 亚洲精品日韩一| 99国产精品久久久久老师| 亚洲青色在线| 亚洲男人av电影| 野花国产精品入口| 午夜伦理片一区| 久久综合伊人77777麻豆| 欧美激情中文不卡| 99精品欧美一区二区三区综合在线| 一区二区三区四区国产| 久久国产直播| 欧美日韩视频不卡| 国产一区二区三区观看| 最新国产乱人伦偷精品免费网站 | 欧美日韩视频在线| 国产伦精品一区二区三区高清版| 91久久精品www人人做人人爽| 校园激情久久| 亚洲理论在线| 欧美成人性生活| 伊人久久噜噜噜躁狠狠躁 | 亚洲高清三级视频| 午夜精品婷婷| 国产精品理论片| 亚洲亚洲精品在线观看| 亚洲第一色中文字幕| 久久久久久久久久久久久女国产乱 | 久久综合色一综合色88| 国产日韩欧美综合| 亚洲欧美国产精品桃花| 亚洲欧洲日本一区二区三区| 六月婷婷一区| 亚洲日本va午夜在线电影| 美女任你摸久久| 久久国产精品72免费观看| 国产女主播视频一区二区| 亚洲女同精品视频| 亚洲视频精选在线| 国产精品毛片va一区二区三区| 亚洲图中文字幕| 日韩小视频在线观看专区| 欧美精品一区二区高清在线观看| 亚洲伦伦在线| 99在线精品观看| 国产精品久久久久久久app| 午夜精品久久久久久久99水蜜桃| 这里只有精品丝袜| 国产精品视频免费在线观看| 欧美一区二区三区在线观看| 校园春色综合网| 国产综合久久久久久| 欧美aa国产视频| 欧美激情综合五月色丁香| 欧美偷拍一区二区| 欧美一区二区三区啪啪| 久久久精品日韩欧美| 亚洲黄一区二区三区| 亚洲精品中文字幕在线| 国产精品久久777777毛茸茸| 欧美中文字幕视频| 久久中文精品| 一区二区三区精品| 午夜免费在线观看精品视频| 亚洲成色最大综合在线| 亚洲理论在线观看| 国产亚洲激情| 亚洲人精品午夜| 国产一区免费视频| 亚洲日本欧美| 国产婷婷97碰碰久久人人蜜臀| 欧美mv日韩mv国产网站| 欧美日韩亚洲综合在线| 久久综合伊人| 国产精品观看| 欧美激情一区二区| 国产美女一区| 亚洲片区在线| 国产午夜精品视频免费不卡69堂| 亚洲大片精品永久免费| 国产精品实拍| 亚洲国产一区二区视频| 国产欧美短视频| 亚洲啪啪91| 韩国成人理伦片免费播放| 99视频精品免费观看| 亚洲国产美女| 久久精品国产v日韩v亚洲| 亚洲直播在线一区| 欧美高清免费| 裸体丰满少妇做受久久99精品| 国产精品高精视频免费| 亚洲精品视频一区| 亚洲高清不卡av| 欧美亚洲午夜视频在线观看| 亚洲一区二区日本| 欧美精品福利| 亚洲国产成人av| 亚洲二区视频| 久久免费观看视频| 久久久久久久久久久一区| 国产精品爽爽ⅴa在线观看| 亚洲伦理网站| 一二美女精品欧洲| 欧美日韩三区四区| 亚洲精品视频在线| 99精品国产热久久91蜜凸| 欧美成人免费va影院高清| 欧美黑人多人双交| 亚洲激情影院| 欧美激情精品| 亚洲精品久久视频| 亚洲国产欧美不卡在线观看| 久久亚洲春色中文字幕| 免费看的黄色欧美网站| 亚洲电影免费在线观看| 麻豆精品网站| 亚洲欧洲精品一区二区三区| 一区二区三区精品视频| 欧美日韩一区视频| 中文在线不卡| 亚洲第一网站免费视频| 久久亚洲精品伦理| 欧美国产91| 日韩一级视频免费观看在线| 欧美日韩日本国产亚洲在线| 伊人成人在线视频| 久久永久免费| 亚洲乱亚洲高清| 欧美一区二区三区免费观看视频 | 欧美人在线视频| 99国产精品视频免费观看一公开 | 欧美国产一区在线| 日韩午夜精品| 欧美在线观看一区| 韩国欧美一区| 欧美精品情趣视频| 亚洲一区久久| 免费欧美日韩| 中文一区在线| 国产在线欧美| 欧美国内亚洲| 亚洲视频在线观看| 久久综合中文字幕| 一区二区精品国产| 国产欧美另类| 欧美激情按摩| 午夜精品一区二区三区四区| 欧美激情a∨在线视频播放| 一区二区毛片| 精品不卡一区二区三区| 欧美日韩第一页| 午夜日本精品| 日韩视频在线播放| 久久青草欧美一区二区三区| 一本色道久久| 永久555www成人免费| 久久国产精品免费一区| 欧美专区在线播放| 亚洲麻豆av| 美日韩精品免费| 欧美在线欧美在线| 在线亚洲一区| 亚洲国产免费| 国内精品久久久久影院优| 国产精品久久国产精品99gif | 欧美14一18处毛片| 午夜综合激情| 亚洲视频大全| 99伊人成综合|