WINCE bootloader创建

 

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设备,如NE2000SMC9000

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         不支持本地启动,不启用MMUCaches(即实地址模式)

 

建立步骤

一、创建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环境变量没设置的错误。

这一步我是用在PBIDE环境下BUILD一个完整的X86 EMUL OS来代替的,在本演示中可以通过,以后再详加研究。

[sysgen批处理是否必须运行,我现也无法确认;读者也可不管它的运行结果,都运行一遍。]

四、为Boot LoaderStartUp函数创建一个文件:

在目录%_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设备的工程模板类型(比如CEBASEmobile_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过来即可(不知道算不算PBBUG).

3、Startup.s的写法:每个命令行前面必须有一个空格或TAB,否则不能解析,编译不能成功(切记)

4、STARTUP.SINCLUDE 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文件,然后linkexe文件.至此,EBOOT.EXE生成完成.

6、添加makefile.inc,eboot.bibeboot目录下,添加sources文件WINCETARGETFILES=BootImage,设定build命令生成eboot.bin文件,然后运行build命令,将会生成eboot.binnk.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

你可能感兴趣的:(c,Flash,Build,include,makefile,WinCE)