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

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>
            欧美日韩免费在线| 中文网丁香综合网| 久久米奇亚洲| 亚洲视频免费在线| 一区二区三区四区五区精品视频| 欧美国产日韩一区二区三区| 久久久蜜臀国产一区二区| 亚洲欧美日韩综合| 午夜一区二区三区在线观看| 欧美一区二区三区喷汁尤物| 欧美一区二区三区精品电影| 久久精品国产亚洲精品| 久久男人av资源网站| 免费视频一区| 亚洲精品国产拍免费91在线| 欧美国产日韩精品免费观看| 亚洲国产第一页| 99国产精品99久久久久久| 亚洲视频一区| 久久精品国产v日韩v亚洲| 久久欧美中文字幕| 欧美女同视频| 国产精品人人爽人人做我的可爱| 国产午夜精品麻豆| 欧美三级电影精品| 欧美专区日韩视频| 欧美电影在线观看完整版| 欧美日韩一区在线| 国产在线精品一区二区夜色| 亚洲国产精选| 亚洲欧美在线播放| 欧美va亚洲va国产综合| 日韩亚洲一区二区| 久久精品一区四区| 欧美日韩亚洲综合| 一区精品在线播放| 亚洲一区二区三区四区中文| 免费成人性网站| 亚洲视频网在线直播| 女生裸体视频一区二区三区| 国产精品视频免费一区| 亚洲精品一区二区网址| 午夜精品一区二区在线观看 | 亚洲无线观看| 久久精品99国产精品酒店日本| 欧美va亚洲va日韩∨a综合色| 亚洲一级在线| 欧美二区在线| 韩国美女久久| 午夜精品国产更新| 亚洲三级影片| 另类激情亚洲| 韩日欧美一区| 久久精品2019中文字幕| 99成人在线| 欧美黑人在线观看| 亚洲电影免费观看高清完整版在线 | 亚洲人屁股眼子交8| 久久se精品一区精品二区| 欧美日韩综合另类| 日韩图片一区| 亚洲高清在线播放| 久久日韩精品| 一区二区三区亚洲| 久久久人成影片一区二区三区| 中文在线一区| 欧美天堂亚洲电影院在线播放 | 久久久福利视频| 亚洲欧美日韩爽爽影院| 欧美日韩一视频区二区| 夜久久久久久| 这里只有精品视频| 国产精品久久久久久av下载红粉| 中文日韩欧美| 韩国v欧美v日本v亚洲v| 一本色道久久精品| 欧美成人在线免费视频| 久久精品人人做人人综合| 国产欧美91| 久久成人羞羞网站| 欧美亚洲网站| 韩国一区电影| 免费在线观看精品| 男女精品网站| 日韩午夜电影| 999亚洲国产精| 国产精品久久久久久久久久尿 | 永久久久久久| 亚洲国产欧美在线| 欧美精品九九| 亚洲综合电影| 欧美亚洲免费高清在线观看| 好看的av在线不卡观看| 久久综合网hezyo| 欧美国产另类| 午夜在线精品偷拍| 久久久久久久久伊人| 亚洲国产精品一区二区久| 亚洲精品在线观看免费| 国产麻豆综合| 亚洲第一级黄色片| 国产精品久久毛片a| 久久全国免费视频| 欧美久久久久久久| 久久精品1区| 欧美护士18xxxxhd| 久久成人免费| 欧美激情一二三区| 亚洲精选在线观看| 久热这里只精品99re8久| 亚洲精品国产精品国自产观看浪潮| 亚洲精品综合| 黄色一区二区三区四区| av成人毛片| 亚洲欧洲另类国产综合| 性欧美办公室18xxxxhd| 一本色道久久88精品综合| 久久精品一区二区国产| 亚洲欧美一区二区三区在线| 欧美激情视频一区二区三区在线播放 | 午夜精品久久久久久久99水蜜桃 | 亚洲一区二区在线看| 国语对白精品一区二区| 一本色道久久加勒比88综合| 亚洲高清久久网| 136国产福利精品导航网址应用| 日韩亚洲欧美成人| 国产精品欧美一区喷水 | 亚洲黄色免费电影| 欧美成人激情在线| 9国产精品视频| 美日韩在线观看| 最新精品在线| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产精品乱码| 久久免费99精品久久久久久| 欧美专区在线观看| 一区二区视频在线观看| 欧美成人中文字幕| 欧美精品日本| 亚洲免费精彩视频| 国产精品亚洲成人| 欧美成人免费一级人片100| 欧美激情久久久久| 国产一区999| 久久久99国产精品免费| 9i看片成人免费高清| 亚洲欧美日韩另类| 黄色成人小视频| 亚洲人久久久| 亚洲欧美国产毛片在线| 欧美一二三区在线观看| 亚洲精品一区在线| 欧美在线3区| 一本久久a久久精品亚洲| 国产精品激情| 亚洲黑丝在线| 国内精品久久久久久影视8| 亚洲精品久久久久| 欧美aⅴ99久久黑人专区| 亚洲激情精品| 国语自产精品视频在线看| 91久久精品美女高潮| 国产一区二区三区日韩| 亚洲另类在线视频| 久久精品一区二区三区不卡| 欧美日韩国产探花| 欧美电影在线免费观看网站| 国产精品视频区| 欧美在线视频免费播放| 激情综合色综合久久| 夜夜精品视频| 一二美女精品欧洲| 久久午夜激情| 国产欧美日韩专区发布| 欧美 日韩 国产 一区| 欧美综合国产| 国产精品一卡二| 亚洲另类在线一区| 国产日韩欧美一区二区三区在线观看| 亚洲精品黄色| 亚洲欧洲日产国产网站| 欧美在线视频全部完| 亚洲福利电影| 亚洲视频axxx| 国产欧美一区二区色老头| 日韩视频一区二区在线观看| 亚洲狠狠丁香婷婷综合久久久| 午夜精品一区二区三区四区| 国产精品毛片va一区二区三区 | 久久福利精品| 亚洲字幕一区二区| 欧美高清在线一区| 欧美激情久久久久| 亚洲福利视频二区| 久久久久久欧美| 欧美不卡视频一区发布| 好看不卡的中文字幕| 国产日韩一区欧美| 久久av二区|