Buildroot swupdateOTA 升级

本系列调试说明记录了Linux在全志T113-S3/S4平台上的移植过程,说明过程中可能会技术瑕疵,希望大家提供宝贵意见。
本文移植的硬件平台来自于盈鹏飞嵌入式的SBC-T113S(处理器是T113-S3)主板。

SBC-T113S产品特性:

  • 采用Allwinner公司Cortex-A7双核T113-S3/S4处理器,运行最高速度为1.2GHZ;
  • 内置64-bit XuanTie C906 RISC-V协处理器(仅T113-S4支持);
  • 支持JPEG/MJPEG视频编码,最大分辨率1080p@60fps;支持多格式1080P@60fps视频解码 (H.265,H.264, MPEG-1/2/4);
  • 支持RGB666/LVDS/MIPI-DSI,分辨率最高1920x1080;
  • 支持128-256M Bytes DDR3 SDRAM,其中T113-S3内置128MB;T113-S4内置256MB;
  • 支持SPI NAND存储和启动(默认:256MB;最大1GB)或者EMMC启动(默认:4GB,最大32GB);
  • 支持一路USB2.0 OTG(设计为TYPE-A接口);支持二路USB2.0 HOST;
  • 支持七路RS232通信或者6路RS232和1路RS485(隔离);
  • 支持一路CAN BUS通信(隔离);
  • 支持一路10/100M以太网;
  • 稳定的操作系统的支持,可预装LINUX 5.4或者OpenWRT;
  • 经典尺寸主板,尺寸为120*100MM; 

产品功能评估图:

产品尺寸:

 

以下为Buildroot swupdateOTA 升级说明: 

swupdate

SWUpdate提供了一种可靠的方式来更新 嵌入式系统上的软件。 源代码托管在https://github.com/sbabic/swupdate

T113 源码

t113_linux/buildroot/buildroot-201902/package/swupdate$ tree

.

├── 0001-Makefile-fix-static-build.patch

├── 0002-Support-ext4-write.patch

├── 0003-Add-ota-burnboot-lib.patch

├── Config.in

├── swupdate_cmd.sh

├── swupdate.config

├── swupdate.hash

└── swupdate.mk

t113_linux/buildroot/buildroot-201902/dl/swupdate$ tree -L 2

├── swupdate-2018.11

│   ├── bindings

│   ├── bootloader

│   ├── configs

│   ├── COPYING

│   ├── core

│   ├── corelib

│   ├── debian

│   ├── doc

│   ├── examples

│   ├── handlers

│   ├── include

│   ├── ipc

│   ├── Kconfig

│   ├── Licenses

│   ├── Makefile

│   ├── Makefile.deps

│   ├── Makefile.flags

│   ├── Makefile.help

│   ├── mongoose

│   ├── parser

│   ├── README.md

│   ├── scripts

│   ├── suricatta

│   ├── SWUpdate.svg

│   ├── tools

│   ├── web-app

│   └── www

└── swupdate-2018.11.tar.gz

recovery OTA 升级方案

recovery 系统方案,是在主系统之外,增加一个recovery 系统。升级时,主系统负责升级recovery系统,recovery 系统负责升级主系统。 这样如果升级中途发生掉电,也不会影响当前正在使用的这个系统。重启后仍可正常进入系统,继续完成升级。 一般recovery 系统会使用intiramfs 功能,并大量裁剪不必要的应用,只保留OTA 必需的功能,把size 尽量减小。

recovery 系统方案优点:recovery 系统可以做得比较小,省flash 空间。

recovery 系统方案缺点:

  1. recovery 系统一般不包含主应用,所以OTA 期间,处于recovery 系统中时,无法为用户正常提供服务。
  2. 需要重启两次。
  3. 需要维护两份系统配置,即主系统和recovery 系统。

AB OTA 升级方案

AB 系统方案,是将原有的系统,增加一份。即flash 上总共有AB 两套系统。两套系统互相升级。OTA 时,若当前运行的是A 系统,则升级B 系统,升级完成后, 设置标志,重启切换到B系统。OTA 时,若当前运行的是B 系统,则升级A 系统,升级完成后,设置标志,重启切换到A 系统。

AB 系统方案优点:

  1. 更新过程是在完整系统中进行的,更新期间可正常提供服务,用户无感知。最终做一次重启即可。
  2. 逻辑简单,只重启一次。
  3. 只维护一套系统配置。

AB 系统方案缺点:flash 占用较大。

OTA 升级步骤

OTA升级流程可分为以下四步:

  1. 配置OTA 策略描述文件
  2. 配置OTA包配置文件
  3. 生成OTA包
  4. 执行升级命令

配置OTA 策略描述文件

OTA策略描述文件是 sw-description 文件,位于device/config/chips/t113_i/configs/evb1_auto/longan。 以t113-i linux5.4升级rootfs为例,升级uboot的配置类似。 配置文件可参考T113 SDK自带的sw-description-ab文件,具体语法可参考 swup-date官方文档,链接:http://sbabic.github.io/swupdate。

本次OTA升级的策略描述文件内容如下所示

./device/config/chips/t113/configs/evb1_auto/longan/sw-description-ab

software =

{

    version = "0.1.0";

    description = "Firmware update for T113 Project";

    stable = {

        /* now in systemA, we need to upgrade systemB(bootB, rootfsB, dspxB) */

        now_A_next_B = {

            images: (

                {

                    filename = "kernel";

                    device = "/dev/mmcblk0p5";

                    installed-directly = true;

                },

                {

                    filename = "rootfs";

                    device = "/dev/mmcblk0p7";

                    installed-directly = true;

                }/*,

                {

                    filename = "uboot";

                    type = "awuboot";

                },

                {

                    filename = "boot0";

                    type = "awboot0";

                }*/

            );

            bootenv: (

                {

                    name = "swu_mode";

                    value = "";

                },

                {

                    name = "boot_partition";

                    value = "bootB";

                },

                {

                    name = "root_partition";

                    value = "rootfsB";

                },

                {

                    name = "swu_next";

                    value = "reboot";

                }

            );

        };

        /* now in systemB, we need to upgrade systemA(bootA, rootfsA, dspxA) */

        now_B_next_A = {

            images: (

                {

                    filename = "kernel";

                    device = "/dev/mmcblk0p4";

                    installed-directly = true;

                },

                {

                    filename = "rootfs";

                    device = "/dev/mmcblk0p6";

                    installed-directly = true;

                }/*,

                {

                    filename = "uboot";

                    type = "awuboot";

                },

                {

                    filename = "boot0";

                    type = "awboot0";

                }*/

            );

            bootenv: (

                {

                    name = "swu_mode";

                    value = "";

                },

                {

                    name = "boot_partition";

                    value = "bootA";

                },

                {

                    name = "root_partition";

                    value = "rootfsA";

                },

                {

                    name = "swu_next";

                    value = "reboot";

                }

            );

        };

    };

    /* when not call with -e xxx,xxx    just clean */

    bootenv: (

        {

            name = "swu_param";

            value = "";

        },

        {

            name = "swu_software";

            value = "";

        },

        {

            name = "swu_mode";

            value = "";

        },

        {

            name = "swu_version";

            value = "";

        }

    );

}

其中,/dev/mmcblk05是rootfs所在的分区,可通过cat proc/cmdline查看。

sh-4.4# cat proc/cmdline

earlycon=uart8250,mmio32,0x05000000 clk_ignore_unused initcall_debug=0 console=ttyS0,115200 loglevel=8 root=/dev/mmcblk0p5 init=/init partitions=boot-resource@mmcblk0p1:env@mmcblk0p2:env-redund@mmcblk0p3:boot@mmcblk0p4:rootfs@mmcblk0p5:dsp0@mmcblk0p6:private@mmcblk0p7:UDISK@mmcblk0p8 cma=16M snum= mac_addr= wifi_mac= bt_mac= specialstr= gpt=1 androidboot.hardware=sun8iw20p1 boot_type=2 androidboot.boot_type=2 gpt=1 uboot_message=2018.05(11/30/2023-03:08:02) disp_reserve=4096000,0x448ec000 androidboot.dramsize=128

配置OTA包配置文件

OTA包配置文件sw-subimg.cfg也位于device/config/chips/t113_i/configs/evb1_auto/longan。同样地,这里只配置rootfs,用户可根据实际情况配置uboot、dsp0等。sw-subimg.cfg配置内容如下所示。

device/config/chips/t113/configs/evb1_auto/longan$ cat sw-subimgs-ab.cfg

swota_file_list=(

${LICHEE_BOARD_CONFIG_DIR}/${LICHEE_LINUX_DEV}/sw-description-ab:sw-description

#out/${TARGET_BOARD}/boot_initramfs_recovery.img:recovery

#${LICHEE_PACK_OUT_DIR}/u-boot.fex:uboot

#${LICHEE_PACK_OUT_DIR}/boot0_sdcard.fex:boot0

${LICHEE_PLAT_OUT}/boot.img:kernel

${LICHEE_PLAT_OUT}/rootfs.ext4:rootfs

#out/${TARGET_BOARD}/image/dsp0.fex:dsp0

#out/${TARGET_BOARD}/image/dsp1.fex:dsp1

#out/${TARGET_BOARD}/usr.img:usr

)

编译生成OTA包

lxg@lxg:~/code/t113_linux$ swupdate_pack_swu

####/home/lxg/code/t113_linux/device/config/chips/t113/configs/evb1_auto/longan/sw-subimgs.cfg####

/home/lxg/code/t113_linux/device/config/chips/t113/configs/evb1_auto/longan/sw-description-ab:sw-description

/home/lxg/code/t113_linux/out/t113/evb1_auto/longan/boot.img:kernel

/home/lxg/code/t113_linux/out/t113/evb1_auto/longan/rootfs.ext4:rootfs

-------------------- config --------------------

subimgs config by: /home/lxg/code/t113_linux/device/config/chips/t113/configs/evb1_auto/longan/sw-subimgs.cfg

out dir: /home/lxg/code/t113_linux/out/t113/evb1_auto/longan/swupdate

-------------------- do copy --------------------

-------------------- do sha256 --------------------

-------------------- do md5sum --------------------

5495ce254152ccfcf933384e02a41de6  sw-description

c41149215c6dc3f222c22c4b0a54c5d1  kernel

f4a74a502df11f95b4604223f863f383  rootfs

-------------------- do cpio --------------------

sw-description

kernel

rootfs

cpio_item_md5

767537

-------------------- out file in --------------------

/home/lxg/code/t113_linux/out/t113/evb1_auto/longan/swupdate/t113_evb1_auto.swu

375M    /home/lxg/code/t113_linux/out/t113/evb1_auto/longan/swupdate/t113_evb1_auto.swu

执行升级命令

将OTA包t113_evb1_auto.swu拷贝开发板/mnt目录,执行命令swupdate,完成升级。

# swupdate -v -i /mnt/t113_evb1_auto.swu -e stable,now_A_next_B

Swupdate v2018.11.0

……

Software updated successfully

Please reboot the device to start the new software

[INFO ] : SWUPDATE successful

U盘升级

swupdate -v -i /mnt/usb/sda1/t113_evb1_auto.swu -e stable,now_A_next_B

sh-4.4# swupdate -v -i /mnt/usb/sda1/t113_evb1_auto.swu -e stable,now_A_next_B

Swupdate v2018.11.0

Licensed under GPLv2. See source distribution for detailed copyright notices.

Registered handlers:

    dummy

    awuboot

    awboot0

    uboot

    bootloader

    raw

    rawfile

    ubivol

    ubipartition

software set: stable mode: now_A_next_B

[TRACE] : SWUPDATE running :  [network_initializer] : Main loop Daemon

[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/swupdateprog

[TRACE] : SWUPDATE running :  [listener_create] : creating socket at /tmp/sockinstctrl

[TRACE] : SWUPDATE running :  [extract_sw_description] : Found file:

    filename sw-description

    size 2966

    checksum 0x27a1e VERIFIED

[TRACE] : SWUPDATE running :  [get_common_fields] : Version 0.1.0

[TRACE] : SWUPDATE running :  [get_common_fields] : Description Firmware update for T113 Project

[TRACE] : SWUPDATE running :  [parse_images] : Found Image: rootfs in device : /dev/mmcblk0p7 for handler raw (installed from stream)

[TRACE] : SWUPDATE running :  [parse_images] : Found Image: kernel in device : /dev/mmcblk0p5 for handler raw (installed from stream)

[TRACE] : SWUPDATE running :  [parse_bootloader] : Bootloader var: swu_next = reboot

[TRACE] : SWUPDATE running :  [parse_bootloader] : Bootloader var: root_partition = rootfsB

[TRACE] : SWUPDATE running :  [parse_bootloader] : Bootloader var: boot_partition = bootB

[WARN ] : SWUPDATE running :  [check_field_string] : Configuration Key is empty!

[TRACE] : SWUPDATE running :  [parse_bootloader] : Bootloader var: swu_mode =

[TRACE] : SWUPDATE running :  [cpio_scan] : Found file:

    filename kernel

    size 18855936

    REQUIRED

[TRACE] : SWUPDATE running :  [cpio_scan] : Found file:

    filename rootfs

    size 374076168

    REQUIRED

[TRACE] : SWUPDATE running :  [cpio_scan] : Found file:

    filename cpio_item_md5

    size 131

    not required

[TRACE] : SWUPDATE running :  [install_single_image] : Found installer for stream kernel raw

[TRACE] : SWUPDATE running :  [install_single_image] : Found installer for stream rootfs raw

[TRACE] : SWUPDATE running :  [install_raw_image] : six -- find [rootfs] to use

Software updated successfully

Please reboot the device to start the new software

[INFO ] : SWUPDATE successful 

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值