WinCE5.0 BSP BOOTLOADER開發詳解-生成bin和nb0

一,生成EBOOT.exe

1,在D:/WINCE500/PLATFORM/Sun2410/SRC/BOOTLOADER/EBOOT目錄下,建立名爲Startup.s 的彙編文件。

源代碼如下:

OPT 2

INCLUDE kxarm.h

OPT 1

OPT 128

STARTUPTEXT

LEAF_ENTRY StartUp

nop

END

2,在D:/WINCE500/PLATFORM/Sun2410/SRC/BOOTLOADER/EBOOT目錄下,建立名爲sources的文 件。

源代碼如下:

TARGETNAME=EBOOT

TARGETTYPE=PROGRAM

RELEASETYPE=PLATFORM

EXEENTRY=StartUp

SOURCES=startup.s

3,在D:/WINCE500/PLATFORM/Sun2410/SRC/BOOTLOADER/EBOOT目錄下,建立名爲makefile的 文件。

源代碼如下:

!INCLUDE $(_MAKEENVROOT)/makefile.def

4,DOS狀態中進入D:/WINCE500/PLATFORM/Sun2410/SRC/BOOTLOADER/EBOOT目錄,輸入 Build-c編譯這三個文件。

5,看過MSDN的朋友應該發現,以上的幾步是嚴格的遵照MSDN的描述進行的。可是卻又發生錯誤了。這是因爲我們在彙編文件中include kxarm.h,但在我們所在的目錄下並沒有這個文件。建立一個Inc目錄,在D:/WINCE500/PUBLIC/COMMON/SDK/INC目錄 下拷貝kxarm.h文件到這個目錄。修改sources文件。

修改後的sources文件源代碼如下:

TARGETNAME=EBOOT

TARGETTYPE=PROGRAM

RELEASETYPE=PLATFORM

EXEENTRY=StartUp

INCLUDES=./Inc

SOURCES=startup.s

6,再次Build -c。這時我們就可在D:/WINCE500/PLATFORM/Sun2410/target/ARMV4I/debug目錄下看見EBOOT.exe 文件了。

二,生成EBOOT.bin

1,由MSDN可知Bootloader是由OEM Startup Code和Main Code組成的。所以在本部分,我們將構成一個Main Code的基本框架

2,新建兩個空文件main.c,flash.c。修改Startup.s文件。使其可以跳轉到Main.c文件中。

Startup.s源代碼如下:

OPT 2

INCLUDE kxarm.h

OPT 1

OPT 128

TEXTAREA

IMPORT main

STARTUPTEXT

LEAF_ENTRY StartUp

b main

ENTRY_END

END

Main.c源代碼如下:

void main(void)

{

}

3,建立一個boot.bib文件。

源代碼如下:

MEMORY

FILLER A0000000 00030000 RESERVED

EBOOT A0030000 00020000 RAMIMAGE

RAM A0050000 00010000 RAM

CONFIG

COMPRESSION=OFF

PROFILE=OFF

KERNELFIXUPS=ON

ROMSTART=A0030000

ROMWIDTH=32

ROMSIZE=20000

MODULES

nk.exe $(_TARGETPLATROOT)/target/$(_TGTCPU)/$(WINCEDEBUG)/EBOOT.exe EBOOT

4,建立一個makefile.inc文件。

源代碼如下:

BootImage:

romimage boot.bib

5,在sources文件的最後面添加一句話。WINCETARGETFILES=BootImage

6,再次Build -c。這時我們就可在D:/WINCE500/PLATFORM/Sun2410/target/ARMV4I/debug目錄下看見EBOOT.bin 文件了。

注意:這裏我的開發流程和MSDN的標準做法是不一樣的。主要是因爲我在摸索的過程中,想盡量的減少代碼和代碼間的依賴關係,所以主要的 Startup.s、Main.c、Flash.c文件基本上都是給的空文件。但這裏可以成功的生成EBOOT.bin文件,至少說明的我們在前三步的摸 索是成功的。其次,個人覺得這裏只生成了EBOOT.bin文件,似乎可能說明的bin文件和nb0文件的不同。MSDN上的說法是:nb0文件用於第一 次用JTAG工具將EBOOT.nb0寫入到Flash中,bin文件用於更新Flash中的bootloader映象。

三,生成EBOOT.nb0

1,逐步完成main.c文件。這裏我的做法是每添加一段話就build一次,個人覺得這樣做可以加深對程序調用過程的理解。當然您也可以一次完 成。

源代碼如下:

#include <windows.h>

#include <blcommon.h>

BOOL OEMDebugInit(void)

{

return(TRUE);

}

BOOL OEMPlatformInit(void)

{

return(TRUE);

}

DWORD OEMPreDownload(void)

{

return(0);

}

void OEMLaunch(DWORD dwImageStart, DWORD dwImageLength, DWORD dwLaunchAddr, const ROMHDR *pRomHdr)

{

}

BOOL OEMReadData(DWORD cbData, LPBYTE pbData)

{

return(TRUE);

}

void OEMShowProgress(DWORD dwPacketNum)

{

}

void OEMWriteDebugByte(unsigned char c)

{

}

static void SpinForever(void)

{

while(1);

}

void main(void)

{

BootloaderMain();

SpinForever();

}

2,逐步完成flash.c文件。

源代碼如下:

#include <windows.h>

#include <blcommon.h>

BOOL OEMStartEraseFlash (DWORD dwStartAddr, DWORD dwLength)

{

return(FALSE);

}

void OEMContinueEraseFlash (void)

{

}

BOOL OEMFinishEraseFlash (void)

{

return(FALSE);

}

BOOL OEMIsFlashAddr (DWORD dwAddr)

{

return(FALSE);

}

BOOL OEMWriteFlash(DWORD dwStartAddr, DWORD dwLength)

{

return(FALSE);

}

LPBYTE OEMMapMemAddr (DWORD dwImageStart, DWORD dwAddr)

{

return((LPBYTE)dwAddr);

}

3,修改sources文件。

源代碼如下:

TARGETNAME=EBOOT

TARGETTYPE=PROGRAM

RELEASETYPE=PLATFORM

EXEENTRY=StartUp

INCLUDES=./Inc

TARGETLIBS=./Lib/blcommon.lib /

./Lib/fulllibc.lib

SOURCES=startup.s /

main.c /

flash.c

WINCETARGETFILES=BootImage

4,往Inc文件夾中添加必要的頭文件。

5,建立Lib文件夾,添加blcommon.lib ,fulllibc.lib兩個鏈接庫和與之以來的其他文件。

說明:這裏我的做法也不同於MSDN的標準做法,因爲我實在是看不明白那些環境變量。所以只能用原始的,最笨方法來引用這裏頭文件和庫。如果您是牛 人,請用MSDN的方法,並請順便教教我。如果您跟我一樣是新人,請耐心去找這些相互依賴的頭文件,並把他們複製到我們得文件夾裏。我一共傻傻的在INC 文件夾裏找了244個,Lib文件夾中5個。

6,再次Build -c。這時我們就可在D:/WINCE500/PLATFORM/Sun2410/target/ARMV4I/debug目錄下看見EBOOT.nb0 文件了。

現在exe、bin、nb0三個文件都有了,說明我們已經搭好了基本的框架平臺,後面只要來實現這裏文件的內容就可以了。

至此,我們已經完成了MSDN中的前十二步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章