当前位置: 代码迷 >> WinCE >> WINCE eboot从TF卡读取镜像文件stepldr.nb0,怎么判断是新的还是老的文件
  详细解决方案

WINCE eboot从TF卡读取镜像文件stepldr.nb0,怎么判断是新的还是老的文件

热度:92   发布时间:2016-04-28 12:00:39.0
WINCE eboot从TF卡读取镜像文件stepldr.nb0,如何判断是新的还是老的文件
平台:WINCE6.0+S3C2451
平台升级方式:TF卡升级

由于我们之前发布了一些版本的系统,后面也会周期性的发布新的系统,那么客户很有可能由新的系统升级为旧的系统,但由于我们新的flash升级为旧系统后无法起来,为了避免这样的情况,我的想法是:
在eboot从TF卡读取stepldr.nb0的时候,能够从stepldr.nb0的内容能够区分出这时候要升级的是老系统还是新系统,如果是老系统我们就阻止升级,这是我的大的思路,但还不知道怎么实现,在此麻烦大家分享下是实现的细节,先谢谢了。

------解决方案--------------------
NB0文件一般数据不会满,最后一般会有一段0,你可以在这段里边加版本号,SD卡读的时候判断一下最后那段的版本号

------解决方案--------------------
自己再单独写一个PC上的EXE程序,控制台程序就行,然后在makefile.inc里边去call它,顺便把文件路径,版本号之类的通过参数传给它
------解决方案--------------------
我们是将NB0转成一个新的文件,文件头带版本号和长度的,当然内容也加密了
------解决方案--------------------
你们烧的是nb0?那么确实可以如Veabol说的那样去做,后面基本都是0.
你还可以存下当前的版本号,然后于升级的nb0比较,看到版本比较新才升级。
------解决方案--------------------
引用:
此功能需求已实现,详细见:http://blog.csdn.net/loongembedded/article/details/29869641
但发现一个bug,先来看eboot\stepldr\makefile.inc的内容:
stepldr_romimage:
!IF "$(NOLINK)" == ""
    romimage $(ROMIMAGE_FLAGS) stepldr.bib
#    debug $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\stepldr.nb0 < trimnb0.scr
    copy /y/b $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\Stepldr.nb1 + $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\Stepldr.nb2 $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\Stepldr.nb0
  
!IF "$(WINCEREL)"=="1"
    copy $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\Stepldr.* $(_FLATRELEASEDIR)
    call $(_PLATFORMROOT)\$(_TGTPLAT)\Files\AddVersion.exe $(_FLATRELEASEDIR)\Stepldr.nb0 $(BSP_NBOOT_VERSION)
!ENDIF
!ENDIF

最后一行是我增加用来在编译的时候根据环境变量BSP_NBOOT_VERSION的值来写入系统工程release目录下的stepldr.nb0中,但是我选择Rebuild current BSP and Subprojects来重新编译整个BSP时,stepldr.nb0虽然更新了,但版本信息并没有写入stepldr.nb0中,单独编译stepldr文件夹就可以,很奇怪,知道的朋友麻烦指导下。


具体原因不清楚,有可能是你的BSP某个地方又更新了stepldr.nb0,比如是不是copy files to release directory,解决办法是在工程属性里边加入post makeimage的命令调用一个批处理文件,在批处理文件里边再去执行这个call命令
  相关解决方案