bootloader创建
原文地址:http://www.cedn.cn/?uid-13615-action-viewspace-itemid-1606
摘要:
本文主要为演示Boot Loader的整个开发过程,并不涉及具体硬件细节及高级设计技巧。本文系翻译整理自PB HELP,如有谬误,请不吝指正。
硬件及软件假定
为了论述方便,在此对硬件、软件做了以下假定:
硬件方面:
l ARMV4I CPU CORE
l 64MB RAM
l 32MB Intel Strataflash( 28F 128)
l 一个WinCE PB支持的内建以太网控制器,并假定为非PCI/PCMCIA设备,如NE2000或SMC9000 。
l FLASH物理地址空间:0000,0000 – 01FF,FFFF,长度32MB。
l RAM 物理地址空间:A000,0000 – A3FF,FFFF,长度64MB。
l 假定CPU的启动地址为0000,0000。
软件方面:
l Boot Loader是全新创建,并尽可能多地使用PB系统支持库。
l 读者比较熟悉WinCE PB5.0及其编译流程。PB包括所有支持Boot Loader开发的源文件及库。
l 读者拥有相关CPU、外设芯片等的数据手册和最新勘误表。
l 假设Boot Loader位于系统FLASH中,并且每次启动时都首先运行。
l 使用以太网接口下载。
l 每次启动都需要下载OS的运行时映像(NK.bin)到RAM。
l 不支持本地启动,不启用MMU和Caches(即实地址模式)。
建立步骤
一、创建Boot Loader的目录结构:
工程目录一般创建在系统默认目录%_WINCEROOT%/Platform目录下,在其他目录下创建本人还没实验,读者可自行试之。
创建目录:%_WINCEROOT%/Platform/MyPlatform/Src/Bootloader/Eboot
%_WINCEROOT%是PB的环境变量,代表PB的安装目录,如C:/WINCE500。
MyPlatform为本文演示用的工程名,读者可以全文替换这个工程名。
二、设置命令行工作环境:
将开始-》程序-》附件-》“命令提示符”发送快捷方式到桌面,改名为ToMyPlatform,右键点之选择属性,将“快捷方式”属性页下的“起始位置”项改为C:/WINCE500/Platform/MyPlatform,这样就可以方便的进入项目工作目录了。在命令行输入下面三条命令:
l set _WINCEROOT=C:/WINCE500
l cd %_WINCEROOT%/public/common/oak/misc
l wince.bat ARMV4I CEBASE MyPlatform
注意:“_WINCEROOT=C:/WINCE 500 ” 与set之间最好只有一个空格,内部及行末都不能出现空格,否则会设错,因为空格会被认有效字符。
为了方便操作,本人编了一个批处理文件MyBuild.bat,内容如下所示:
@REM
@REM Copyright (c) My Corporation. All rights reserved.
@REM
ECHO ON
if not "%_MYPLATFORM_EVN%" == "" goto now_build_1
ECHO *** Now setup the Build EVN Args ***
set _MYPLATFORM_EVN=1
set _WINCEROOT=C:/WINCE500
set BSP_NOPCIBUS=1
set BSP_NOUSBSER=1
CD %_WINCEROOT%/public/common/oak/misc
call wince.bat ARMV4I CEBASE MyPlatform
CD %_WINCEROOT%/Platform/MyPlatform
:now_build_1
ECHO *** Now start BUILD it ***
build –c
读者可以根据实际需要扩展此批处理,诚然,如果你喜欢一步步敲入命令也无不可。
三、生成Boot Loader要用到的静态库:
PB帮助上是使用在命令行下运行sysgen,但是我的环境会出现SYSGEN环境变量没设置的错误。
这一步我是用在PB的IDE环境下BUILD一个完整的X86 EMUL OS来代替的,在本演示中可以通过,以后再详加研究。
[sysgen批处理是否必须运行,我现也无法确认;读者也可不管它的运行结果,都运行一遍。]
四、为Boot Loader的StartUp函数创建一个文件:
在目录%_WINCEROOT%/Platform/MyPlatform/Src/Bootloader/Eboot下创建文件Startup.s,并写一个空函数作为开发起点。
内容如下:
OPT 2 ; Disable listing
INCLUDE kxarm.h ; This defines the WinCE/ARM Calling Sequence Specification
OPT 1 ; Reenable listing
OPT 128 ; Disable listing of macro expansions
STARTUPTEXT
LEAF_ENTRY StartUp
nop ; *** This routine will be filled in later ***
END
五、为Boot Loader中的Eboot创建一个sources文件和一个makefile文件:
PB帮助中的意思好象是在Bootloader目录下创建,本人的理解是在Eboot目录下创建。读者如有不同意见,可以提出以讨论。
在目录%_WINCEROOT%/Platform/MyPlatform/Src/Bootloader/Eboot下创建sources,内容如下:
TARGETNAME=EBOOT
TARGETTYPE=PROGRAM
RELEASETYPE=PLATFORM
EXEENTRY=StartUp
SOURCES=startup.s
在目录%_WINCEROOT%/Platform/MyPlatform/Src/Bootloader/Eboot下创建makefile,内容如下:
!INCLUDE $(_MAKEENVROOT)/makefile.def
帮助中的操作至此就进入第六步了,我试了以后,不成功。还需要做以下补充:
在目录%_WINCEROOT%/Platform/MyPlatform下创建sources.cmn,内容如下:
WINCEOEM=1
WINCECPU=1
NOMIPS16CODE=1
RELEASETYPE=PLATFORM
_PLATCOMMONLIB=$(_PLATFORMROOT)/common/lib
_COMMONPUBROOT=$(_PUBLICROOT)/common
__PROJROOT=$(_PROJECTROOT)
_OEMINCPATH=$(_WINCEROOT)/public/common/sdk/inc;
_OEMINCPATH=$(_OEMINCPATH);$(_WINCEROOT)/public/common/oak/inc;
_OEMINCPATH=$(_OEMINCPATH);$(_WINCEROOT)/public/common/ddk/inc;
_ISVINCPATH=$(_WINCEROOT)/public/common/sdk/inc;
INCLUDES=$(_PLATFORMROOT)/common/src/inc;
在目录%_WINCEROOT%/Platform/MyPlatform下创建dirs,内容如下:
DIRS=src
在目录%_WINCEROOT%/Platform/MyPlatform/Src下创建dirs,内容如下:
DIRS=bootloader
在目录%_WINCEROOT%/Platform/MyPlatform/Src/Bootloader下创建dirs,内容如下:
DIRS= /
eboot
至此,补充完毕,此时工程的目录树结构及包含的文件为:
C:/WINCE500/Platfomr/MyPlatform/
│ sources.cmn
│ dirs
└─Src/
│ dirs
└─Bootloader/
│ dirs
└─Eboot/
sources
makefile
Startup.s
六、BUILD最早的一个.exe版本:
在目录%_WINCEROOT%/Platform/MyPlatform下运行第二步所创建的BAT文件MyBuild,编译后的目录结构如下所示:
C:.
├─lib
│ └─ARMV4I
│ └─retail
├─Src
│ └─Bootloader
│ └─Eboot
│ └─obj
│ └─ARMV4I
│ └─retail
└─target
└─ARMV4I
└─retail
请检查文件%_WINCEROOT/Platform/MyPlatform/Target/ARMV4I/Retail/Eboot.exe是否生成,如果没有生成,请查阅文件:
%_WINCEROOT/Platform/MyPlatform/Build.log文件中记录。
(待续,lglliu)
补充:
1、wince.bat的作用:根据传入的参数设置CPU类型,工程类型和平台的类型,具体就是BSP所针对的CPU类型,WINCE设备的工程模板类型(比如CEBASE,mobile_handheld,在D:/WINCE500/PUBLIC/CEBASE下可以找到对应的BAT文件),平台类型就是你创建的BSP的名字。
2、sysgen的作用:生成编译将要用到的所有LIB文件。如果你选择了WINCE.BAT内传入参数ARMV4I,这个命令将会编译产生/WINCE500/PUBLIC/COMMON/OAK/LIB/ARMV4I/RETAIL下的所有LIB文件,编译中有时会缺少某个LIB文件而返回ERROR,从DEBUG目录下COPY过来即可(不知道算不算PB的BUG).
3、Startup.s的写法:每个命令行前面必须有一个空格或TAB,否则不能解析,编译不能成功(切记)
4、STARTUP.S中INCLUDE kxarm.h的作用:kxarm.h定义了ARM类型的CPU,如果前面选的别的类型,应该换别的头文件.
5、sources.cmn的作用:实际上只起到了一个作用,就是加入了kxarm.h的包含路径.取代的方法是在eboot下的sources文件里加入
INCLUDES= /
d:/WINCE500/PUBLIC/COMMON/SDK/INC
总结:大体的编译及生成流程:
1、 建立BSP的目录,包括EBOOT目录,在目录下创建DIRS文件,指定将要编译的源代码的目录.(DIRS文件中使用的是相对路径,只需指定下一级目录即可)
2、建立EBOOT的源代码文件STARTUP.S,写入代码,建立MAKEFILE文件,指定编译时使用的MAKE选项定义. _MAKEENVROOT宏应该是由wince.bat定义的.该定议文件就是D:/WINCE500/PUBLIC/COMMON/OAK/MISC/makefile.def.然后还有一个sources文件,里面指定将要编译的文件类型,程序入口函数,include目录,源文件的名字等.
3、使用wince.bat来设定各个环境变量,这个变量将会在后面的编译中使用.
4、使用sysgen生成bootload所需的LIB文件.
5、使用build –c命令编译startup.s文件生成eboot.exe.在生成过程中会先使用nmake先生成startup.obj文件,然后link成exe文件.至此,EBOOT.EXE生成完成.
6、添加makefile.inc,eboot.bib在eboot目录下,添加sources文件WINCETARGETFILES=BootImage,设定build命令生成eboot.bin文件,然后运行build命令,将会生成eboot.bin和nk.exe文件.
另一篇bootload生成的文章地址:
http://www.curoles.com/j/wincebspcmdl.html
关于starup.s文件错误的解决:
http://www.embed.com.cn/bbs/dispbbs.asp?boardID=17&ID=10444&page=1