i.MX21平台之 剖析Windows CE 5.0 Eboot

來源:互聯網
上載者:User
通用的EBOOT概念可參考“Windows CE 5.0 Boot Loader的流程分析”,本文僅通過抽象i.MX21平台上Windows CE 5.0 Eboot代碼來說明從板子上電到WinCE跑起來的幕後故事以及各段代碼所發揮的作用。對照原始碼閱讀本文會有更好的效果。

 

相關代碼目錄如下:

%WINCE/Platform/iMX21ADS/Src/Bootloader/eboot

%WINCE/PLATFORM/COMMON/SRC/ARM/Freescale/MX21/Startup

%WINCE/PLATFORM/Imx21ads/Src/Kernel/Oal

%WINCE/PUBLIC/COMMON/OAK/DRIVERS/ETHDBG/BLCOMMON/blcommon.c

 

(一)%WINCE/PLATFORM/COMMON/SRC/ARM/Freescale/MX21/Startup/startup.s

功能:在OEM板級初始化前先初始化i.MX21處理器的核心模組

主要的函數功能及流程分析如下:

1.StartUp()---這部分代碼是Boot Loader和OAL共用的。

在板子上電後,第一步是將處理器設定為特權模式,跳轉到MMUCacheDisable( ),使TLB和cache、寫緩衝無效,並關閉 MMU、cache。接著設定AIPI寄存器,跳轉到OALSetUpSystemControl 和OALSetUpFrequencies,初始化系統控制模式和時鐘頻率。程式接下來的工作是啟用I Cache,並跳轉到OALIsImageInRAM、OALSetUpExtMemories以初始化外部存放裝置。隨後是設定MAX寄存器、配置AITC中斷控制器、屏蔽和清中斷的一段代碼。接下來程式先後跳轉到OALSetUpGpio、OALSetUpKeypad,即初始化系統GPIO和鍵盤裝置。最後程式跳轉到OALStartUp(),載入g_oalAddressTable地址,再跳轉到KernelStart(),完成代碼重定位和從RAM中啟動Eboot等功能。

上述KernelStart()函數,先跳轉到OALIsImageInRAM程式段判斷Image是否正跑在RAM裡。如果不是,則在接下來的RelocateEBOOT程式段裡進行代碼重定位;如果已經在RAM裡,則跳轉到RamStart程式段,設定串連寄存器LR、載入OEMAddressTable和頁表的地址,然後跳轉到MMUSetup函數,根據OEMAddressTable設定MMU,並使能MMU、啟用cache。在完成了MMU的設定後,程式跳轉到blcommon.c中的BootloaderMain(),這個Eboot主控函數將調用main.c中的一系列OEM函數實現CE系統在板子上的啟動。

上面提到的函數所在檔案如下: 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中。KernelStart則位於%WINCE/PLATFORM/Imx21ads/Src/Bootloader/Eboot/startup.s中。

 

2. MMUCacheDisable( ) --- 使TLB和cache、寫緩衝無效,並關閉 MMU、cache。

 

3. MMUSetup()---這個函數將被%Eboot/startup.s調用,它根據OEMAddressTable設定MMU,並使能MMU、啟用cache。

 

(二)   main.c

基本流程:

初始化調試連接埠---初始化平台基本裝置---列印使用者菜單---初始化網路參數---下載核心---啟動OS

 

主要函數及功能:

OEMReportError()----用於點亮LED,並列印出錯誤提示

 

OEMMultiBINNotify()---- 當系統具有多個BIN檔案時用來提示使用者下載的是哪一個BIN

 

OEMDebugInit( )------- 調用了OEMInitDebugSerial( ),初始化調試串口

 

OEMPlatformInit( )----- 初始化板上裝置

①     通過調試串口列印出Eboot的版本資訊

②     調用InitEthDevice(),初始化乙太網路控制器

③     設定MAC地址,初始化OAL與eboot共用參數,RTC

④     調用MainMenu( ),通過串口與使用者互動,設定啟動選項及參數

 

OEMPreDownload( )--- 判斷是否下載,調用OALKitlCreateName()設定裝置名稱,初始化IP參數,調用EbootInitEtherTransport()初始化TFTP參數

 

OEMReadData()----- 內部是通過OEMEthGetFrame( )來傳輸資料的

 

OEMLaunch( )----------- 根據PB裡的設定來更新OAL與eboot共用參數,並判斷是否需要將NK燒到Nand Flash中,最後調用Eboot/startup.s 裡的Launch( )啟動WinCE核心

 

在main.c中還有一個重要的函數,那就是ManiMenu( )。它提供了以下啟動選項菜單:

0)MAC地址設定

1)靜態IP設定

2)靜態掩碼設定

3)啟用DHCP

4)恢複到出廠設定

5)儲存目前Eboot的設定

D)下載

E)擦除Nor Flash

L)從Nor Flash啟動

R)從RAM中啟動

 

總的來說,在i.MX21平台上WinCE EBoot就是在以下幾個檔案間不斷跳轉的過程:

%Startup/startup.s --- oal_startup.c --- %Oal/startup.s --- %Eboot/startup.s--- blcommon.c---main.c

PS: 如果對i.MX21上電最初階段系統初始化的彙編代碼有興趣的,可以看看“i.MX21平台上Startup.s程式碼分析”。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.