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时跳过的分区号 |
注解
执行ubiattach时跳过的分区号, 与实际不匹配, 执行ubiattach时会报错信息, 不影响正常升级过程
如果需要重新配置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指导编译完成
+ },
注解
在image目录中检查recovery.itb 文件是否生成
通过升级信息判断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
注解
当升级过程中掉电时, 其中一份环境变量如果被破坏, 另外一份环境变量还能够继续引导启动
客户可以手动擦除其中一份环境变量, 测试系统能否正常启动, 写入保存环境变量后, 被擦除的环境变量是否能够恢复
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
注解
/dev/mtd4表示env分区的设备号, /dev/mtd5表示env_r分区的设备号
第二列表示 Device offset
第三列表示 Env. size
第四列表示块擦除大小
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
注解
客户env、env_r分区信息如果修改, 以上两个fw_env.config文件需要同时更新
在 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 分区如下所示:

进入主系统 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系统挂载设备节点不同