為一個新的硬體裝置定製WinCE6、0作業系統的主要步驟如下:
1、針對特定的硬體裝置建立板級支援包(Board Support Package縮寫為BSP),BSP必須包括BOOTLOADER、OEM適配層(OEM
Adaptation Layer縮寫為OAL)和一些必要的驅動。
2、利用建立的BSP,定製一個系統設計(OS Design)。即通過VS2005建立一個Platform
Builder的工程。該工程可編譯產生最終的運行時映像檔案(Rum-time Image)。
3、針對板上的外圍裝置建立相關驅動,並添加到BSP中。
4、通過建立子工程和Catalog Items的方式,修改OS Design。
5、編譯OS Design,下載編譯得到的運行時映像檔案到目標裝置。此時,可通過遠端偵錯工具進行調試。
6、在完成所有的調試工作之後,匯出該運行時映像對應的SDK(Software Development Kit),應用程式的開發人員可基於此SDK編寫該裝置的應用程式。
可以看出,在整個WinCE作業系統的移植過程中,BSP的移植是最基礎也是最關鍵的一步。而建立BSP的過程主要包括以下幾個內容:
1、建立BOOTLOADER。BOOTLOADER在開發的過程中用於下載作業系統映像檔案。
2、建立OAL。OAL最終被連結到核心映像檔案,它主要完成硬體的初始化和管理。
3、建立裝置驅動。裝置驅動是板上外圍裝置的軟體支援。
4、修改運行時映像的設定檔。設定檔主要包括BIB、REG等檔案。
BOOTLOADER的主要作用是將作業系統運行時映像載入到記憶體,並跳轉到OS的啟動程式處。它的這一作用跟前一篇介紹的NBOOT的作用完全一致。BOOTLOADER擷取運行時映像(一般對應的檔案名稱為NK)一般有兩種方法。它可以通過有線串連的方式象網路(Ethernet)、USB或串口從外部下載NK。它也可以從本地的儲存空間(Flash、Hard
Disk)中載入NK。通常,BOOTLOADER通過Ethernet下載作業系統映像故將其稱為EBOOT。在開發的過程中使用EBOOT,可以提高開發效率。通過使用EBOOT,你可以很快速的下載NK到目標裝置中。而利用Flash編程工具或者是通過JTAG下載則很慢。在一些產品最終發布時,EBOOT是可以去掉的,但也有一些則必須包括BOOTLOADER,像X86的平台就是如此。
基於不同的硬體設計,Bootloader會有不同的引導方式:
NORFlash Boot:
一般ARM處理器的片選0都會接有NORFlash,這樣在ARM上電以後,會從0地址開始執行程式,也就是從NORFlash的0地址開始執行。所以把EBOOT燒到NORFlash的0地址開始的地方,這樣在上電以後,EBOOT開始執行,可以在NORFlash裡面執行,也可以自拷貝到SDRAM中執行。最後載入WinCE
image並運行。
NANDFlash Boot with EBOOT:
由於NORFlash容量小,價格貴,現在很多ARM處理器支援NandFlash引導。不同廠家的處理器對Nandflash的引導略有區別,具體要看datasheet。但是本質就是先從Nandflash中讀出一個小的Loader來運行,這個Loader再從Nandflash中載入EBOOT到SDRAM中運行,最後EBOOT載入WinCE
image,就是NK.bin。
NANDFlash Boot without EBOOT:
如果在NandFlash引導的時候不需要EBOOT,也可以不用EBOOT。這樣就是系統啟動後從Nandflash中載入一個小的Loader,小的Loader對硬體系統作基本的初始化,然後直接載入WinCE
image,一般應該是NK.nb0,然後運行。
至此,我們已經瞭解了EBOOT的主要功能,為了實現這些功能,EBOOT必須完成以下工作:
1、初始化MCU。包括初始化MCU的相關寄存器、中斷、看門狗、系統時鐘、記憶體和MMU。前面幾項跟NBOOT基本一致,但這裡增加了對MMU的初始化。
2、在完成所有的初始化工作之後,調用BootloaderMain()。這個函數的定義在WinCE6、0中對應的檔案是C:"WINCE600"PLATFORM"COMMON"SRC"COMMON"BOOT"BLCOMMON"blcommon、c
3、 BootloaderMain()主要依次調用以下幾個函數,OEMDebugInit()、OEMPlatformInit()、OEMPreDownload()、OEMLaunch(),而這些函數必須由EBOOT的代碼來實現。
4、最終跳轉到OAL、exe的StartUp處,進而啟動WinCE作業系統。
整個流程如所示:
EBOOT的代碼可參考C:"WINCE600"PLATFORM"DEVICEEMULATOR"SRC"BOOTLOADER"EBOOT目錄。這裡針對S3C2410的EBOOT做幾點說明。前一篇介紹NBOOT載入EBOOT的方法時提到,NBOOT必須將EBOOT放在記憶體中指定的位置,這個位置是由EBOOT的來決定的。具體的,在EBOOT中的體現是boot、bib裡的記憶體配置,如所示。
NBOOT載入EBOOT到記憶體的地址必須與此地址對應。由於在NBOOT中沒有使用MMU,所以NBOOT使用的實際地址應該為0x30021000,否則系統將不能正常啟動。第二點,如果沒有採用NBOOT載入EBOOT的方法,而是將EBOOT直接儲存在NOR Flash中,此時必須在EBOOT的代碼中實現自載入的過程,即將NOR Flash中的EBOOT全部載入到RAM中,並執行,實現代碼如下:
;------------------------------------------------------------------------------
; Copy boot loader to memory
ands r9, pc, #0xFF000000 ; see if we are in flash or in ram
bne %f20 ; go ahead if we are already in ram
; This is the loop that perform copying、
ldr r0, = 0x21000 ; offset into the RAM
add r0, r0, #PHYBASE ; add physical base
mov r1, r0 ; (r1) copy destination
ldr r2, =0x0 ; (r2) flash started at physical address 0
ldr r3, =0x10000 ; counter (0x40000/4)
10 ldr r4, [r2], #4
str r4, [r1], #4
subs r3, r3, #1
bne %b10
; Restart from the RAM position after copying、
mov pc, r0
nop
nop
nop
; Shouldn't get here、
b 、
EBOOT在實現必備功能的前提下,我們還可以擴充其功能,譬如說初始化LCD,並顯示特定的啟動畫面,顯示載入映像的進度等。
本文粗略的介紹了WinCE6、0下EBOOT的內容,但沒有涉及具體的代碼實現,相關代碼可以參考目錄C:"WINCE600"PLATFORM"DEVICEEMULATOR"SRC"BOOTLOADER"EBOOT。總的來說,EBOOT的核心功能就是引導作業系統映像。