Apollo 升级系统――需求分析+概要设计

1、需求分析
  系统升级目标是提供安全、可靠和便捷的软件升级功能。目前要求支持U盘和网络升级两种形式。
2、概要设计
  下面就软件中分区映像在升级系统中所要完成的功能展开��,下图为概况:

    U-Loader
    U-Boot [Env]  --- 提供可设置的启动标志($bootchoice),并据其启动相应的映像
    升级映像       --- 读取U盘或网络升级分区中的文件,更新软件映像
    App 映像       --- 菜单中提供软件升级选项,执行升级检测;如是网络中的升级包,则安全下载至网络升级分区;并设置$bootchoice,重启
    网络升级分区    --- 存放升级包

  2.1升级系统——Uboot部份
     U-boot提供可设置的启动标志,并据其进行启动。
     访标志适合存储在U-boot Env区(环境变量区),这里命名为bootchoile。
     具体实现可参考Stb225上的实现,主要是对Env变量的组识和管理。
     这里需要��的另外一件事情是,Env区设计为U-boot访问,我们希望让应用方便地访问,包括如更改bootchoile,甚至于将来升级中也许更改 的mtdparts等。——所以实现中应包括一个小工具的实现,类下:  #uboot_env   read|set [envname] [value] -i envimage -o outimage

注:通过该工具可以生成uboot env image

  2.2升级系统——App映像部份
     先定义软件版本字串:apollo-sw* *可以是任意字符串,比如版本号或日期等,
     同时规定更大的字符串代表更新的版本,新版本可以更新旧版本,比如:
        apollo-sw-01  <
        apollo-sw-02  <
        apollo-sw-02.patch.2010-09-01  <
        apollo-sw-02.patch.2010-10-11
     再规定特殊版本字串:apollo-sw,它是最小版本,可被任意版本升级,也是最大版本,可升级任意版本。

     我们需要在U-boot Env 中增加本地版本字串$sw_package_version_str,若不存在,默认为“apollo-sw”.
 
   现在谈检测:
     应用程序读取本地版本字串,在U盘根目录下查找更高版本字串的文件,如果有则重启交给升级映像处理,升级后则置该字串为本地版本字串。
     若U盘下未找到,则到网络中查找(更合理的做法是把本地版本字串,硬件ID等信息提交给服务器,由服务器决定合适版本),找到则下载至网络升级分区,同时 把软件包版本字串写入u-boot Env中,记录   为$net_package_str,重启交给升级映像,升级映像完成更新,应把$net_package_str置空。

   略谈安全可靠问题:
     A,升级包里有一个autorun.sh文件,该文件经过私钥加密,本地软件拥有公钥可以解密,即未经正确签名的autorun.sh文件,本地软件是不会通过认证加以使用的,以确保安全。
     B,autorun.sh文件记录每个升级映像的CRC项,本地软件检验映像正确后利用,以确保数据可靠。

  2.3升级系统—升级包结构
     升级包采用Squashfs格式,因其只读和良好的压缩性能。
     升级包里主要内容是映像文件,而升级过程由autorun.sh描述。
     比如:
     $/bin/sh     
     image_update -d /dev/mtd3 -m VmlinuX.bin -l 3896002 -c 0x32567081
     image_update -d /dev/mtd4 -m rootfs.jffs2 -l 49999000 -c 0x32324496
     emmc_update    -m emmc.img   -l 90098  -c 0x36aacdb5
     image_update -d /dev/mtd2 uboot_env.bin  -l 3343 -c  0x65432109
     注:因为应用程序分区可能发生改变,所以升级映像应靠前放在U-boot之后。

      另注:uboot_env.bin可以通过上面的$uboot_env生成。所以uboot_env的升级可以直接通过$uboot_env设置命令;或者通过uboot_env生成env image,然后希写入。
  2.4升级系统-升级映像。
     升级系统从网络升级分区和U盘中判断最大版本串,mount进行升级。
     升级系统执行升级包中的autorun.sh。
     另外一方向,升级系统要求越‘小’越‘紧凑’越好,所以打算采用initramfs,在一个image中实现。
     再有,即便升级系统,也要求良好的用户界面支持。

3、模块划分与计划。
   根据上述概要设计,划分出各独立子模块。
    *UBoot Env变量的组织和管理以便良好支持启动选择等   (1 day)
    *#uboot_env:使应用程序访问UBoot Env分区   (2 day)
    *升级包生成工具, (1  day)
    *升级映像: a.显示问题, (2 day)
              b.Nand读写 (1 day)
              c.image-update/emmc_update/env_update等工具实现 (3 day)
              4.initramf应用。 (3 day)

你可能感兴趣的:(职场,update,休闲,apollo)