基本步骤来源与百度文库的一篇文章,后面网上一搜,一大把,一些部分应该是没有试验过的,也转了,哎,让我折腾了一天,也不知道原作者是谁,就不标注了,以下是自己亲自试验的结果,上传具体步骤和解决办法。
一,建立BSP文件。
1,在D:\WINCE500\PLATFORM下建立如下目录结构。
“.\S3C2416\SRC\BOOTLOADER\EBOOT”。
2,在D:\WINCE500\PLATFORM\Sun2410\SRC\BOOTLOADER目录下建立一个名为dirs的文件。
Dirs文件源代码:
DIRS= \
eboot
3,启动PB5.0。依次选择菜单Platform—〉BSP Wizard…
4,建立一个新的BSP文件。
.cec文件名:sun2410。保存路径:C:\wince500\platform\S3C2416。目录名:S3C2416。平台目录:S3C2416。Cpu类型:ARMV4I。
5,添加一个Bootloader到新的BSP中。
6,名称:Eboot。源代码路径:找到我们刚才建立好的dirs文件即可。
二,以新BSP为基础,建立操作系统。
1,PB5.0中菜单File—〉New Platform。
2,名称:sun。路径:保持默认。
3,选择新BSP建立操作系统。
4,选择S3C2416 ARMV4I X86 Debug编译系统。这时会报有两个错,不管他的。因为新的BSP还一个文件都没有,当然会错啦,不错就见鬼了。
三,建立命令行编译环境
1,PB5.0中菜单Build OS—〉Open Release Directory。这时已经进入到DOS状态下了。
2,改变目录到C:\WINCE500\public\common\oak\misc中。输入cd C:\WINCE500\public\common\oak\misc即可。
3,输入命令wince。
4,输入命令sysgen。
5,改变目录到C:\WINCE500\PLATFORM\Sun2410\SRC\BOOTLOADER中,同样的,输入CD C:\WINCE500\PLATFORM\Sun2410\SRC\BOOTLOADER 。
6,输入命令Build -c。如果无错,恭喜你。我们已经成功地完成了MSDN中最开始的三步。
WinCE5.0 BSP BOOTLOADER开发详解-生成bin和nb0
一,生成EBOOT.exe
1,在C:\WINCE500\PLATFORM\S3C2416\SRC\BOOTLOADER\EBOOT目录下,建立名为Startup.s的汇编文件。
源代码如下:
OPT 2
INCLUDE kxarm.h
OPT 1
OPT 128
STARTUPTEXT
LEAF_ENTRY StartUp
nop
END
2,在C:\WINCE500\PLATFORM\S3C2416\SRC\BOOTLOADER\EBOOT目录下,建立名为sources的文件。
源代码如下:
TARGETNAME=EBOOT
TARGETTYPE=PROGRAM
RELEASETYPE=PLATFORM
EXEENTRY=StartUp
SOURCES=startup.s
3,在C:\WINCE500\PLATFORM\S3C2416\SRC\BOOTLOADER\EBOOT目录下,建立名为makefile的文件。
源代码如下:
!INCLUDE $(_MAKEENVROOT)\makefile.def
4,DOS状态中进入C:\WINCE500\PLATFORM\S3C2416\
SRC\BOOTLOADER\EBOOT目录,输入Build-c编译这三个文件。
5,看过MSDN的朋友应该发现,以上的几步是严格的遵照MSDN的描述进行的。可是却又发生错误了。这是因为我们在汇编文件中include kxarm.h,但在我们所在的目录下并没有这个文件。建立一个Inc目录,在C:\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。这时我们就可在C:\WINCE500\PLATFORM\S3C2416\target
\ARMV4I\debug目录下看见EBOOT.exe文件了。
如果编译出现错误,检查一下自己的Starup.s是不是定格写了,不能顶格写的。
二,生成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映象。
注意WINCETARGETFILES=BootImage并不是自己的一个函数,而是一个编译路径的参数选项,之前写的时候
SOURCES= \
main.c\
startup.s\ ;这里加上换行符就出错了··不要当做SOURCES一样的文件处理·····停了
;一天··终于解决了·
WINCETARGETFILES=BootImage
继续····
Makefile.inc
BootImage:
romimage boot.bib
也不能定格写。
三,生成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两个链接库和与之以来的其他文件。
因为确实不了解环境变量,所以把C:\WINCE500\PUBLIC\COMMON\OAK\LIB\ARMV4I\DEBUG文件里的所有文件都拷过来了,大呀,
Inc里面拷了C:\WINCE500\PUBLIC\COMMON\SDK\INC里面的内容,C:\WINCE500\PUBLIC\COMMON\OAK\INC里面的所有内容,以后有时间了再把它修改为环境变量模式,继续往下。。
说明:这里我的做法也不同于MSDN的标准做法,因为我实在是看不明白那些环境变量。所以只能用原始的,最笨方法来引用这里头文件和库。如果您是牛人,请用MSDN的方法,并请顺便教教我。如果您跟我一样是新人,请耐心去找这些相互依赖的头文件,并把他们复制到我们得文件夹里。我一共傻傻的在INC文件夹里找了244个,Lib文件夹中5个。
6,再次Build -c。这时我们就可在C:\WINCE500\PLATFORM\S3C2416
\target\ARMV4I\debug目录下看见EBOOT.nb0文件了。
现在exe、bin、nb0三个文件都有了,说明我们已经搭好了基本的框架平台,后面只要来实现这里文件的内容就可以了。
至此,我们已经完成了MSDN中的前十二步。