一.为什么需要NBoot
WinCE操作系统从文件的组成来看一般分为两部分:BOOTLOADER和NK.bin。在WinCE中,BOOTLOADER一般为EBOOT。它的主要功能是初始化硬件设备,主要包括CPU内部的相关控制器、内存、网络、串口甚至USB口和LCD。在初始化完成后,它将通过网络或USB从外部下载NK.bin,或从本地Flash中加载NK.bin并执行,从而启动WinCE操作系统。可以看到Eboot虽然是启动代码,但它得完成相当多的工作,最终的映像文件也将超过4K。所以,我们不能直接将Eboot存放在NAND Flash的第一个4K字节中。我们需要一个更小的启动代码,这就是通常所说的NBOOT(NAND BOOT)。
是否需要Nboot取决于硬件设计,当系统采用NORFlash+S3C2410架构时,上电时,NORFlash被映射到0x0000_0000-0x0800_0000地址,可以直接执行烧录在NORFlash的eboot,启动系统。但NORFlash比较昂贵,因此很多时候采用NandFlash+S3C2410。
nboot是从NAND flash读eboot到内存SDRAM中并执行,eboot是从以太网(用tftp)下载image(nk.bin)到内存并执行。将nboot.nb0烧到第0块,将eboot.nb0烧到第2块。启动时nboot从flash读出eboot并执行之,如何就可以通过pb把nk.bin下载到目标板上执行了。
二.NBoot的工作内容
1. 初始化CPU内部相关控制器,如设置GPIO,关闭Watch Dog,关闭中断,设置系统时钟。
2. 初始化内存。
3. 初始化串口,主要用来输出调试信息。
4. 初始化NAND Flash,因为在MCU启动时默认是Auto Boot模式,为了从NAND Flash中读取EBOOT,需要将其配置成 NAND Flash Mode。
5. 读取NAND Flash中的EBOOT映像文件,并放在内存指定的位置,这个地址是跟EBOOT有关,介绍EBOOT时再详细说明。
6. 完成读取之后,跳转到EBOOT的起始位置,执行EBOOT代码。
一般来说,前面两个功能在startup.s中实现,汇编语言编写;后面四个功能可在main.c中实现。NBOOT的编译环境一般有两种,ADS1.2(或RVDS)、Platform Builder。
三.如何创建NBoot
s3c2410/…/SRC/Bootloader下创建NBOOT目录,并创建makefile、makefile.inc、sources、nboot.bib、 main.c文件,也可从EBOOT的目录下拷贝对应文件过来进行修改。
修改BSP的目录2410/…/SRC/Bootloader"的dir文件,添加NBOOT,dir文件的内容:
DIRS= /
Nboot /
eboot /
dir文件指定了哪些目录源码须被编译,加上Nboot,这样打开PB的FileView才能出现Nboot。
每个dir文件中指定的目录下,会有个sources文件,sources文件通过宏定义指定编译和链接涉及到的文件
TARGETNAME=nboot ;生成的文件名
TARGETTYPE=PROGRAM ;编译产生的文件类型PROGRAM=EXE,LIBRARY=LIB,KYNLINK=DLL
RELEASETYPE=PLATFORM ;
EXEENTRY=StartUp ;程序的入口函数
NOMIPS16CODE=1
LDEFINES=-subsystem:native /DEBUG /DEBUGTYPE:CV /FIXED:NO
TARGETLIBS=$(_COMMONOAKROOT)/lib/$(_CPUINDPATH)/fulllibc.lib
SOURCES=/ ;需要编译的源文件
startup.s /
main.c /
nand.s
WINCETARGETFILES=BootImage ;编译之前先编译的镜像文件,BootImage出现在makefile.inc
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jonathandj/archive/2009/12/31/5113038.aspx
Makefile.inc文件的内容:
BootImage:!IF "$(NOLINK)" == ""
romimage $(ROMIMAGE_FLAGS) nboot.bib ;当前目录下bib文件
!IF "$(WINCEREL)"=="1"
copy $(_PLATFORMROOT)"$(_TGTPLAT)"target"$(_TGTCPU)"$(WINCEDEBUG)"nboot.* $(_FLATRELEASEDIR)
!ENDIF
!ENDIF
bib(Binary Image Builder)文件,指示如何构建系统二进制去镜像文件,说明哪些文件被打包到运行时镜像中。
nboot.bib文件的内容:
Code
MEMORY
; Name Start Size Type
; ------- -------- -------- ----
NBOOT 00000000 00003000 RAMIMAGE ;RAMIMAGE运行时镜像会放到此段内存上
STACK 31400000 00001000 RESERVED ;RESERVED 系统保留
RAM 31500000 00010000 RAM
CONFIG
COMPRESSION=ON ;是否压缩
PROFILE=OFF
KERNELFIXUPS=ON
ROMSTART=00001000 ;启始地址
ROMWIDTH=32
ROMSIZE=00001000 ;表明生成文件的大小为4K
MODULES
; Name Path Memory Type
; ---------- -------------------------------------------------------------- -----------
nk.exe $(_TARGETPLATROOT)"target"$(_TGTCPU)"$(WINCEDEBUG)" nboot.exe
由于WinCE习编译出的nbx前4K是空的,所以需要将ROMSTART的地址在Nboot的Start地址上后移4K
接下来就是main函数,需要添加全局变量如下:
ROMHDR * volatile const pTOC = (ROMHDR *)-1;根据main函数的功能其中应该包括3个函数
InitDebugSerial();初始化串口
NF_Init();初始化NandFlash
NF_ReadSector();读Eboot.bin