OTA开发指南

1、Swupdate升级软件简介

我们的系统使用SWUpdate来进行软件升级,SWUpdate是一个可扩展的软件升级框架,支持任意的原子更新Linux系统中的软件镜像.它基于cpio定义了一个标准的升级包格式,包括头部,和任意多的子镜像。 "Swupdate官方文档":https://sbabic.github.io/swupdate/swupdate.html "Swupdate源码":https://github.com/sbabic/swupdate "Swupdate FAQ":https://boundarydevices.com/using-swupdate-upgrade-system

2、OTA升级流程

  1. SWUpdate下载服务端的升级固件到本地数据分区
  2. SWUpdate修改uboot环境变量(设置升级标记):"upgrade_status=available"
  3. SWUpdate向服务端报告升级状态
  4. 重启,uboot根据升级标记切换到OTA系统
  5. OTA系统中运行SWUpdate将升级固件写入相应的MTD分区,设置升级标记:"upgrade_status=success",重启,uboot根据升级标记切换回升级后的应用程序系统
  6. 应用程序需修改uboot环境变量(删除可升级标记):"upgrade_status"

3、制作升级固件

在代码目录运行以下命令生成升级固件:

openwrt/bin/leo-[板级]-glibc/gen_swupdate_img.sh [升级固件名]

gen_swupdate_img.sh根据同级目录下sw-description文件来生成升级文件,可以针对系统不同的分区来执行升级文件,例如以下的gen_swupdate_img.sh和sw-description文件可以用于制作升级rootfs的固件: gen_swupdate_img.sh:

#!/bin/bash

dd if=/dev/zero of=./env.bin bs=1k count=256
cp uboot-leo-[板级]/* ./

FILES="sw-description \
    openwrt-leo-[板级]-ubifs.img"

for i in $FILES;do
        echo $i;done | cpio -ov -H crc > $1.swu

sw-description:

software =
{
    version = "1.0.0";

    hardware-compatibility: ["1.0.0"];

    images: (
        {
            filename = "openwrt-leo-[板级]-ubifs.img";
            volume = "rootfs";
            ubipartition = "rootfs";
            installed-directly = true;
        }
    );
}

4、HTTP网络升级方法和步骤

  1. 使用Python搭建简单的下载服务器,在放置升级固件的目录下,用Python 3.x执行命令:
    python –m http.server
    
    或者用Python 2.x执行命令:
    python –m SimpleHTTPServer
    
  2. 使用SWUpdate下载固件 将开发板接入下载服务器所在的局域网(参考:WIFI使用指南),确保开发板能ping通下载服务器,然后执行以下命令下载固件:
    swupdate -s /data/upgrade/ota.swu -d '-u <服务器IP>:8000/<升级固件名>'
    
    注:8000是服务器端口号 下载完成后执行命令:
    fw_printenv upgrade_status
    
    可以查看uboot环境变量upgrade_status的值已变为available
  3. 重命名升级固件,执行命令:

    mv /data/upgrade/ota.swu /data/upgrade/`md5sum /data/upgrade/ota.swu | awk '{print $1}'`.img
    

    注:固件必须放在/data/upgrade目录下,并且要以<文件mdsum.img>命名,否则OTA系统将不能识别升级固件

  4. 执行reboot命令重启系统,随后进入OTA系统进行固件写入,写入成功后将可以看到以下log输出: 随后系统将再一次重启进入升级固件后的系统运行。 注:这里的升级步骤没有对升级状态和固件版本等进行管理,这部分功能需要用户自行开发。

5、HawkBit升级

HawkBit是专门针对SWUpdate的服务器升级软件,包含了对设备ID、应用推送和版本号等的管理功能,其官网为:http://www.eclipse.org/hawkbit/,我司搭建的服务器为:http://47.97.109.141:8081/,相关概念说明请参考:http://ai.nationalchip.com/docs/ota/

senseflow代码的swupdate升级程序(senseflow/modules/sw_update)使用的就是这种方式,其程序运行流程如下:  设置环境变量upgrade_status为unavailable  ping 47.97.109.141:8081  下载升级文件:swupdate -u '-t gx -u 47.97.109.141:8081 -i _1.0 -g gatewaytoken' &  等待环境变量upgrade_status变为available  向服务器报告升级成功状态:swupdate -u '-t gx -c 2 -u 47.97.109.141:8081 -i _1.0'  重命名升级文件为.img  reboot进入OTA小系统烧写升级文件

6、本地升级方法

也可以将升级固件通过U盘、SD卡或ADB放入系统进行升级,可以运用以下脚本:

#!/bin/ash
upgrade_dir=/data/upgrade

if [ $# -ne 1 ]; then
    printf "usage:\n\trun_update.sh <swu filename>\n"
    exit 1
fi
swupdate -c -i $1
if [ $? -ne 0 ];then
    echo "run_update failed, $1 is not a valid swupdate file!!!"
    exit 2
fi
cp $1 ${upgrade_dir}/ota.swu
sync
mv ${upgrade_dir}/ota.swu ${upgrade_dir}/`md5sum ${upgrade_dir}/ota.swu | awk '{print $1}'`.img #rename as <md5sum>.img
fw_setenv upgrade_status available
reboot

results matching ""

    No results matching ""