9.2.3. SPINAND OTA参数配置

SPINAND OTA参数配置主要分为主系统配置, Recovery系统配置, 以d211_demo100_nand为例进行说明

系统名称

配置文件

主系统

d211_demo100_nand_defconfig

Recovery系统

d211_ota_defconfig

主系统配置涉及到的文件如下:

1. target/d211/demo100_nand/image_cfg.json //分区配置和烧录
2. target/d211/common/env.txt //U-Boot环境变量
3. target/d211/demo100_nand/rootfs_overlay/etc/fw_env.config
4. target/d211/demo100_nand/rootfs_overlay/etc/swupdate_main
5. target/d211/demo100_nand/swupdate/sw-description
6. target/d211/demo100_nand/swupdate/sw-images.cfg
7. target/configs/d211_demo100_nand_defconfig

Recovery系统配置涉及到的文件如下:

1. target/d211/ota/rootfs_overlay/etc/fw_env.config
2. target/d211/ota/rootfs_overlay/etc/init.d/S91swupdate_ota
3. target/target/configs/d211_ota_defconfig

9.2.3.1. Recovery系统配置

9.2.3.1.1. SWUpdate包配置

Recovery系统配置文件路径如下:

target/configs/d211_ota_defconfig

进入到Recovery系统 SDK 生产环境

lunch ota

在Luban根目录下执行命令

make m

进入Luban SDK 功能配置, 按如下选择:

Third-party packages  --->
    -*- libubootenv  --->
    -*- libconfig  --->
    -*- libcurl  --->
    [*] swupdate  --->

    [*] mtd, jffs2 and ubi/ubifs tools  --->        //SPINAND平台需要

9.2.3.1.2. 配置 RootFS 为initramfs

默认切换RootFS配置为initramfs, 执行命令

make m

配置如下:

Filesystem images  --->
RootFS images  --->
    -*- cpio the root filesystem (for use as an initial RAM filesystem)
        Compression method (gzip)  --->
[*] initial RAM filesystem linked into linux kernel

默认将initramfs编译进Kernel, 执行命令

make km

配置如下:

General setup  --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
[*]   Support initial ramdisk/ramfs compressed using gzip

9.2.3.2. 主系统配置

9.2.3.2.1. SWUpdate包配置

进入主系统 SDK 生产环境

lunch d211_demo100_nand

在Luban根目录下执行配置命令

make m

进入Luban SDK 功能配置, 按如下配置选择:

Third-party packages  --->
    -*- libubootenv  --->
    -*- libconfig  --->
    -*- libcurl  --->
    [*] swupdate  --->

    [*] mtd, jffs2 and ubi/ubifs tools  --->        //SPINAND平台需要

查看SWUpdate库相关配置如下:

[*]   use prebuilt binary instead of building from source
(package/third-party/swupdate/luban_swupdate.config) swupdate configuration file
[*]   swupdate webserver

查看SWUpdate相关配置, 需要先关闭SWUpdate预编译功能:

[ ]   use prebuilt binary instead of building from source

执行命令查看SWUpdate相关配置

make swupdate-menuconfig

SWUpdate包重要配置信息解析:

文件

说明

CONFIG_UBOOT=y

支持U-Boot

CONFIG_DOWNLOAD=y

使能通过libcurl的方式下载程序

CONFIG_DOWNLOAD_SSL=y

在使用libcurl时使能ssl校验

CONFIG_WEBSERVER=y

编译web服务器, 设备端作为服务器使用

CONFIG_HASH_VERIFY=y

解析升级包时使能sha256校验

CONFIG_BOOTLOADERHANDLER=y

在升级过程中允许修改U-Boot环境变量

CONFIG_CFI=y

允许给flash烧录程序

CONFIG_RAW=y

默认烧录方式, 给eMMC使用

CONFIG_SHELLSCRIPTHANDLER=y

支持shell脚本升级

CONFIG_UBIVOL=y

支持UBI分区升级

CONFIG_UBIBLACKLIST=”0 1”

执行ubiattach时跳过的分区号

注解

  1. 执行ubiattach时跳过的分区号, 与实际不匹配, 执行ubiattach时会报错信息, 不影响正常升级过程

  2. 如果需要重新配置SWUpdate参数, 必须关掉SWUpdate预编译功能, 修改的SWUpdate配置才能够生效

9.2.3.3. 增加recovery分区并烧录程序

增加 recovery分区, 烧录Recovery 系统镜像。在image_cfg.json修改如下:

"kernel":   { "size": "12m" },
+ "recovery": { "size": "10m" },          //在kernel分区后面增加recovery分区

"kernel": {
        "file": "kernel.itb",
        "attr": ["mtd", "required"],      //在kernel镜像烧录配置后面添加recovery镜像烧录配置
        "part": ["kernel"]
},
+ "recovery": {
+    "file": "recovery.itb",              //将recovery.itb镜像文件烧录到recovery分区里面
+    "attr": ["mtd", "required"],
+    "part": ["recovery"]
+ },

"kernel.itb": {
        "its": "kernel.its"               //在kernel镜像生成方法后面增加recovery镜像生成方法

},
+ "recovery.itb": {
+    "its": "recovery.its"                //配置recovery.itb文件通过recovery.its指导编译完成
+ },

注解

  1. 在image目录中检查recovery.itb 文件是否生成

  2. 通过升级信息判断recovery.itb是否烧录到recovery分区

9.2.3.4. U-Boot 环境变量配置

通过环境变量boot_partition决定从kernel分区还是recovery分区引导启动

在d211/common/env.txt修改如下:

+ set_commonargs_recovery=setenv bootargs earlycon=${earlycon} earlyprintk console=${console} rdinit=/linuxrc
+ //从Recovery系统启动, 引导initramfs启动

+ set_nand_bootargs_recovery=run set_nand_mtdargs; \      //设置环境变量set_nand_bootargs_recovery
+    run set_commonargs_recovery; \
+    setenv bootargs ${bootargs} mtdparts=${MTD}

+ ubi_rootfs_mtd=10       //适配环境变量ubi_rootfs_mtd, 保证主系统能够正常启动
+ boot_partition=kernel   //初始化环境变量boot_partition从kernel分区启动

+ run set_nand_bootargs_recovery; \
+ loadknl mtd recovery ${knl_addr}; \
+ bootm ${knl_addr};      //nand_boot环境变量增加从recovery分区引导启动

注解

手动配置环境变量boot_partition并保存, 重启测试U-Boot是否能够引导Recovery系统启动, 判断配置文件是否生效

9.2.3.4.1. 分区表配置增加env备份分区

添加env备份分区, 保障env数据掉电安全, 在image_cfg.json配置修改如下:

"env":      { "size": "256k" },
+ "env_r":    { "size": "256k" },         //在env分区后面增加env_r分区

"env": {
    "file": "env.bin",
    "attr": ["mtd", "required"],
-    "part": ["env"]
+    "part": ["env","env_r"]             //将env.bin文件同时烧录到env、env_r分区
},

注解

通过升级串口打印信息可以判断env.bin文件是否烧录到env_r分区, 判断配置是否生效

9.2.3.4.2. U-Boot 使能 env redundant 配置

执行make um 使能env redundant机制:

Environment  --->
    [*] Enable redundant environment support
    (0x220000) Redundant environment offset

注解

  1. 当升级过程中掉电时, 其中一份环境变量如果被破坏, 另外一份环境变量还能够继续引导启动

  2. 客户可以手动擦除其中一份环境变量, 测试系统能否正常启动, 写入保存环境变量后, 被擦除的环境变量是否能够恢复

  3. CONFIG_ENV_OFFSET_REDUND为env_r分区的偏移值, 需要与分区表匹配

当使能了redundant机制, 编译后烧录程序, 可能会出现以下错误信息:

Loading Environment from RAM... *** Warning - bad CRC, using default environment

主要原因是,U-Boot解析的方法发生了改变, 解析数据格式增加了一个字节, 判断那一份env数据最新, 具体可以通过redundant宏查看对应的程序。 解决问题办法, 在image_cfg.json修改如下:

        "uboot_env": {
                "env.bin": {
                        "file": "env.txt",
                        "size": "0x4000",
+                       "redundant": "enable",
                },
        },

注解

不使能 env 备份区域,”redundant” 设置为 “disable” 或者不设置

9.2.3.4.3. fw_env.config配置

OTA升级过程中, 主系统和Recovery系统都使用到SWUpdate命令, SWUpdate依赖U-Boot环境变量, 需要在 Linux 中配置 U-Boot 环境变量索引路径。

fw_printenv/fw_setenv命令默认索引路径为:

/etc/fw_env.config

因为使用到了 env_r 备份分区, fw_env.config 需要包含 env, env_r 分区信息, SPINAND 的默认的配置信息如下:

/dev/mtd4               0x0000          0x4000          0x20000
/dev/mtd5               0x0000          0x4000          0x20000

注解

  1. /dev/mtd4表示env分区的设备号, /dev/mtd5表示env_r分区的设备号

  2. 第二列表示 Device offset

  3. 第三列表示 Env. size

  4. 第四列表示块擦除大小

Recovery系统 SDK 生产环境默认存在fw_env.config文件, 具体路径如下:

target/d211/ota/rootfs_overlay/etc/fw_env.config

主系统 SDK 生产环境默认存在fw_env.config文件, 具体路径如下:

fw_env.config在主系统的路径如下:

target/d211/<board>/rootfs_overlay/etc/fw_env.config

注解

  1. 客户env、env_r分区信息如果修改, 以上两个fw_env.config文件需要同时更新

  2. 在 Linux 环境下执行fw_printenv/fw_setenv命令, 测试能够正常打印U-Boot环境变量信息

9.2.3.4.4. 配置 ota 分区烧录OTA升级包

在target/d211/demo100_nand/image_cfg.json文件修改

"ubisystem": {
    "size": "-",
    "ubi": { // Volume in UBI device
    +    "ota":   { "size": "48m" },                //ubisystem分区上增加ota分区
        "user":   { "size": "-" },
    },
},

"rootfs": {
        "file": "rootfs*.ubifs",
        "attr": ["ubi", "required"],
        "part": ["ubiroot:rootfs"]                  //在根文件系统烧录之后增加ota分区烧录
},
+ "ota":   { "size": "48m" },
    +               "ota": {
    +                       "file": "ota*.ubifs",
    +                       "attr": ["ubi", "optional"],
    +                       "part": ["ubisystem:ota"]               //将ota*.ubifs文件烧录到ota分区里面
    +               },

9.2.3.4.5. 主系统配置生成 ota*.ubifs 目标文件

将OTA升级包下载到ota分区里面, 方便测试OTA本地升级功能

ota 分区如下所示:

../../../_images/part1.png

进入主系统 SDK 生产环境

lunch d211_demo100_nand

在Luban根目录下执行配置命令

make m

配置如下:

[*] UserFS 1  --->
     (ota) Name
     FS Type (UBIFS)  --->
     (1x3000000) ubifs size(Should be aligned to MB)
     (target/$(LUBAN_CHIP_NAME)/$(LUBAN_BOARD_NAME)/ota) Overlay directory

将target/$(LUBAN_CHIP_NAME)/$(LUBAN_BOARD_NAME)/ota目录里的内容生成ota_page_2k_block_128k.ubifs镜像文件, 之后整个文件烧录到ota分区里面。

9.2.3.4.6. 启动脚本配置

主系统和Recovery系统默认启动脚本S90swupdate, 路径如下:

package/third-party/swupdate/S90swupdate

S90swupdate后台执行swupdate-progress命令, 可以接受SWUpdate传递的升级信息, 并打印到调试串口, 客户也可以重定向到显示屏上。

主系统自动挂载ota分区脚本路径如下:

target/d211/<board>/rootfs_overlay/init.d/S91swupdate_main

主要内容如下:

ubiattach dev/ubi_ctrl -m $mtd_num          //识别ota分区
mount -t ubifs /dev/$ubi_param /mnt/ota     //挂载ota分区到mnt/ota目录下

Recovery系统启动脚本路径如下:

target/d211/<board>/rootfs_overlay/init.d/S91swupdate_ota

主要内容如下:

ubiattach dev/ubi_ctrl -m $mtd_num          //识别ota分区
mount -t ubifs /dev/$ubi_param /mnt/ota     //挂载ota分区到mnt/ota目录下
./usr/lib/swupdate/swupdate_cmd.sh          //执行OTA升级程序

该脚本的主要功能是挂载好对应的升级分区, 并执行Recovery系统OTA升级程序

注解

主系统和Recovery系统挂载设备节点不同