注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

男儿当自强的博客

每天进步一点

 
 
 

日志

 
 
 
 

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习  

2011-07-27 12:59:32|  分类: wince的bootloade |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

********************************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文件

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习 - 男儿当自强 - 男儿当自强的博客

图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,见下图:

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习 - 男儿当自强 - 男儿当自强的博客

图2

图2是在启动的时候设备操作模式的选择

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习 - 男儿当自强 - 男儿当自强的博客

图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启动方式的流程图来理解:

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习 - 男儿当自强 - 男儿当自强的博客

图4

根据图4可知,BL1(这里就是NBL1)这个bootloader的大小不能大于8KB,这是强制要求的,可见下图

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习 - 男儿当自强 - 男儿当自强的博客

图5

根据上面的描述我们可以理解了为什么ROMSIZE要求大小是4KB了。可因为实际生成的nbl1.bin(6KB)的大小大于4KB,这样就会生成nbl1.nb0、nbl1.nb1、nbl1.nb2和nbl1.nb3,不知道为什么会生成4个?见下图:

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习 - 男儿当自强 - 男儿当自强的博客

图6

我试着用比较工具比较了这4个nbx文件,虽然是乱码,但比较可知nbl1.nb0和nbl1.nb1内容一样,nbl1.nb2、nbl1.nb3内容依次减少,而且不一样。

\WINCE600\PUBLIC\COMMON\OAK\MISC

 

1.2   NBL1的makefile.inc文件

内容如下:

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习 - 男儿当自强 - 男儿当自强的博客

图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)目录下,这时候要复制的文件见下图:

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习 - 男儿当自强 - 男儿当自强的博客

图8

这样我们就可以在release目录下看到这些文件了。

1.3    

 

2.      nbl2

结合图4,我们知道BL1(nbl1)会装载BL2(nbl2)到SDRAM中执行,而本设计中SDRAM空间对应于图3的范围为0x50000000~0x5FFFFFFF的地址空间,这也就是nbl2镜像文件在SDRAM的转载地址,这样我们就可以较好理解下面的内容了。

2.1   nbl2.bib文件

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习 - 男儿当自强 - 男儿当自强的博客

图9

2.2   nbl2的makefile.inc文件

S3C6410的Bootloader的两个阶段BL1和BL2编译相关学习 - 男儿当自强 - 男儿当自强的博客

2.3    

3.       

 

  评论这张
 
阅读(2239)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017