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

男儿当自强的博客

每天进步一点

 
 
 

日志

 
 
 
 

Real6410的NBL1.LSB和NBL2编译下载不能启动的问题  

2012-03-24 11:31:57|  分类: wince的bootloade |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 

********************************LoongEmbedded********************************

作者:LoongEmbedded(kandi)

时间:2012.03.24

类别:WINCE系统开发

********************************LoongEmbedded********************************

 

Real6410开发板的NBL1.LSB和NBL2的这两部分生成的镜像合成为block0img.nb0,但利用SD卡更新的IROM_SD_EBOOT.nb0更新的第一阶段的bootloader为block0.nb0,所以为了统一,我修改NBL1.LSB和NBL2的这两部分生成为block0.nb0(72KB)。然后基于SD卡启动的方式来烧录这个block0.nb0,但是系统不能启动,但如果基于Real6410开发板厂家提供的block0.nb0(68KB)来烧录,确实可以正常启动的。为了进一步明确问题,我基于usb的更新方式来更新我自己编译生成的block0.nb0(72KB),确实可以正常启动,而如果更新厂家提供的block0.nb0(68KB)却不能正常启动。

 

为了搞清楚这个问题,仔细查看了NBL1.LSB、NBL2、EBOOT.WHIMORY和Eboot.SDFuser这几部分的代码,发现是Real6410修改了三星原厂的代码,下面我们来分析此问题,先看NBL1.LSB部分的main函数下面的部分:

Real6410的NBL1.LSB和NBL2编译下载不能启动的问题 - 男儿当自强 - 男儿当自强的博客

 

图1

可知nbl1部分是从第10个page开始读取nbl2部分的,而我对比了Real6410提供Eboot.SDFuser和三星原厂此文件夹nand.cpp文件烧录block0.的WriteRawImageToBootMedia函数相关部分,发现是Real6410做了下面的修改:

Real6410的NBL1.LSB和NBL2编译下载不能启动的问题 - 男儿当自强 - 男儿当自强的博客

 

图2

而Real6410采用的MLC NAND FLASH一个page的大小为2048,所以根据上面的内容可知Real6410把nbl2部分的镜像文件写到第6page开始的地址,而上面我们知道nbl1是从第10个page的地方去读取nbl2,这样肯定导致了nbl1只能拷贝nbl2的后大半部分,这样就无法正常启动了。所以还原回三星原厂的内容,经过测试,就不存在上面提到的问题了。

 

下面我们来看NBL1.LSB的bib文件

Real6410的NBL1.LSB和NBL2编译下载不能启动的问题 - 男儿当自强 - 男儿当自强的博客

 

图3

在来看NBL1.LSB的makefile文件包含的一个语句:

copy /y/b $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\nbl1.nb1 $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\nbl1.nb0

意思就是NBL1.nb0是由NBL1.nb1 Copy得到的,接下里看NBL2的makefile文件的相关部分:

copy /b $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\nbl1.nb1 + $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\nbl1.nb2 + $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\nbl2.nb0 $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\block0.nb0

意思是block0.nb0= nbl1.nb1+nbl1.nb2+?nbl2.nb0合成的,我觉得似乎没必要这样处理,既然S3C6410支持8KB的stepping stone,那么我尝试了把图3中的0x00001000(4KB)改为0x00002000(8KB),而且去掉NBL1.LSB的makefile上面的语句,同时把NBL2的makefile文件上面的部分改为:

copy /b $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\nbl1.nb0 + $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\nbl2.nb0 $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\block0.nb0

这样修改编译生成的nbl1.nb0大小为8KB,nbl2.nb0大小为68KB,blcok.nb0大小72KB,然后基于sd卡和usb卡的方式来更新block.nb0,均可以正常启动,这样岂不是更容易理解。

 

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

历史上的今天

评论

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

页脚

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