********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
时间:2011.7.20
类别:WINCE bootloader开发
********************************LoongEmbedded********************************
备注:此开发支持IROM启动方式,包括支持SD和NAND Flash这两种启动介质的启动,在学习中主要是针对NAND Flash的启动方式来展开学习的。
本文基于Real6410开发板来学习的,此开发板把我们通常的stepldr分成nbl1和nbl2这两部分,这里的nbl我的理解是nboot的boot bootloader,而1是stepldr的第一阶段,2表示第二阶段,下面就来学习如何编译生成nbl1和nbl2的内容,以及它们的bib和makefile.inc的学习。
1. nbl1
1.1 nbl1的bib文件
图1
下面就来学习这两部分的内容:
1) NBL1的RAMIMAGE这一项的内容
首先因为我们是采用IROM的启动方式,在SMDK6410的SMDK6410.bat中对此环境变量定义如下:
set BSP_IROMBOOT=1
从图1可知NBL1 0C000000 00002000 RAMIMAGE
我们知道RAMIMAGE指定这块内存用于加载NBL1的镜像,在系统上电后,NBL1的镜像会被IROM的boot code拷贝到这块区域上面运行。那为什这块区域的起始地址是0x0C000000?大小是0x00002000(8KB)呢?因为我们采用的是IROM启动方式,启动介质是NAND Flash,见下图:
图2
图2是在启动的时候设备操作模式的选择
图3
图3是设备的内存映射图,开发板是用Xm0CSn2作为NAND Flash的片选引号的,这种情况下,Stepping Stone映射到0x020000000~0x27FFFFFF这块区域,图3中的内部存储区的internal RAM部分,此区域的范围是0x0C000000~0x0BFFFFFF(64MB),但实际上可用的internal RAM部分只有8KB,这8KB的RAM也称为Stepping Stone。
由此可知0x0C000000是NBL1镜像被IROM的boot code加载到Stepping Stone中的地址,也就是Stepping Stone的起始地址。8KB的大小限制是S3C6410的Stepping Stone只有8KB。
2) 生成NBL1.nbx的配置
nb0文件就是可执行映像的原始Flash映像,它不包括头,一般情况下将镜像下载到设备的RAM中运行都采用nb0格式,nb0文件的尺寸比bin大,但是可以直接运行,要生产nb0文件,就需要在NBL1.bib中加入下面的内容
ROMSTART = 0C000000
ROMWIDTH = 32
ROMSIZE = 00001000
ROMSTART:表示NBL1的nbx文件在内存(这里是Stepping Stone)中的起始地址。
ROMWIDTH:指数据总线的宽度。
ROMSIZE:NBL1的nbx文件的大小,这里是0x00001000(4KB),在上面不是指定了NBL1.bin文件大小最大值可以是0x000020000(8KB)吗?这里为什么指定的是4KB呢?我们结合IROM启动方式的流程图来理解:
图4
根据图4可知,BL1(这里就是NBL1)这个bootloader的大小不能大于8KB,这是强制要求的,可见下图
图5
根据上面的描述我们可以理解了为什么ROMSIZE要求大小是4KB了。可因为实际生成的nbl1.bin(6KB)的大小大于4KB,这样就会生成nbl1.nb0、nbl1.nb1、nbl1.nb2和nbl1.nb3,不知道为什么会生成4个?见下图:
图6
我试着用比较工具比较了这4个nbx文件,虽然是乱码,但比较可知nbl1.nb0和nbl1.nb1内容一样,nbl1.nb2、nbl1.nb3内容依次减少,而且不一样。
\WINCE600\PUBLIC\COMMON\OAK\MISC
1.2 NBL1的makefile.inc文件
内容如下:
图7
1) Romimage工具打包生成nbl1.bin
Romimage.exe是WINCE用于创建.bin(binary image)文件,此工具只接受一个bib文件作为输入参数,Romimage会根据此bib中的内容来为要生成的bin文件来分配物理内存地址。
2) Copy命令的应用
/y:不使用确认是否要改写现有目标文件的提示。
/b:表示一个二进制文件。
上面的意思是把$(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)目录下的nbl1.nb1文件复制到此目录下,并且命名为nbl1.nb0,这也就是为什么用比较工具比较nbl1.nb1和nbl1.nb0内容是一样的原因。但不是很清楚为什么要这样做?
3) Copy指定的文件到指定的目录
复制$(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)下的nbl.*文件到$(_FLATRELEASEDIR)目录下,这时候要复制的文件见下图:
图8
这样我们就可以在release目录下看到这些文件了。
1.3
2. nbl2
结合图4,我们知道BL1(nbl1)会装载BL2(nbl2)到SDRAM中执行,而本设计中SDRAM空间对应于图3的范围为0x50000000~0x5FFFFFFF的地址空间,这也就是nbl2镜像文件在SDRAM的转载地址,这样我们就可以较好理解下面的内容了。
2.1 nbl2.bib文件
图9
2.2 nbl2的makefile.inc文件
2.3
3.