eMMC OTA 参数配置
eMMC OTA 参数配置主要分为主系统配置, Recovery 系统配置, 以 mmc 为例进行说明
系统名称 | 配置文件 |
---|---|
主系统 | d211_per1_mmc_defconfig |
Recovery 系统 | d211_ota_emmc_defconfig |
1. target/d211/per1/image_cfg.json //分区配置和烧录 2. target/d211/common/env.txt //U-Boot 环境变量 3. target/d211/per1/rootfs_overlay/etc/fw_env.config 4. target/d211/per1/rootfs_overlay/etc/swupdate_main 5. target/d211/per1/swupdate/sw-description 6. target/d211/per1/swupdate/sw-images.cfg 7. target/configs/d211_per1_mmc_defconfig
1. target/d211/ota_emmc/rootfs_overlay/etc/fw_env.config 2. target/d211/ota_emmc/rootfs_overlay/etc/init.d/S91swupdate_ota 3. target/configs/d211_ota_emmc_defconfig
Recovery 系统配置
- SWUpdate 包配置
Recovery 系统配置文件路径为 target/configs/d211_ota_emmc_defconfig。
-
进入到 Recovery 系统 SDK 生产环境
lunch ota_emmc
-
在 Luban 根目录下执行命令
make m
-
进入 SDK 功能配置, 按如下选择:
Third-party packages ---> -*- libubootenv ---> -*- libconfig ---> -*- libcurl ---> [*] swupdate --->
-
- 配置 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
-
主系统配置
- 进入主系统 SDK 生产环境
lunch d211_per1_mmc
-
在 Luban 根目录下执行配置命令
make m
-
进入 SDK 功能配置, 按如下配置选择:
Third-party packages ---> -*- libubootenv ---> -*- libconfig ---> -*- libcurl ---> [*] swupdate --->
-
查看 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 在升级过程中允许修改 Boot 环境变量 CONFIG_CFI=y 允许给 flash 烧录程序 CONFIG_RAW=y 默认烧录方式, 给 eMMC 使用 CONFIG_SHELLSCRIPTHANDLER=y 支持 shell 脚本升级
如果需要重新配置 SWUpdate 参数, 必须关掉 SWUpdate 预编译功能, 修改的 SWUpdate 配置才能够生效
增加 recovery 分区并烧录程序
"kernel": { "size": "12m" }, + "recovery": { "size": "10m" }, //在 kernel 分区后面增加 recovery 分区 "kernel": { "file": "kernel.itb", "attr": ["mtd", "required"], //在 kernel 镜像烧录配置后面添加 recovery 镜像烧录配置 "part": ["kernel"] }, + "recovery": { + "file": "recovery.itb", //将 itb 镜像文件烧录到 recovery 分区里面 + "attr": ["mtd", "required"], + "part": ["recovery"] + }, "kernel.itb": { "its": "kernel.its" //在 kernel 镜像生成方法后面增加 recovery 镜像生成方法 }, + "recovery.itb": { + "its": "recovery.its" //配置 itb 文件通过 recovery.its 指导编译完成 + },
-
在 image 目录中检查 recovery.itb 文件是否生成
-
通过升级信息判断 itb 是否烧录到 recovery 分区
U-Boot 环境变量配置
- 通过环境变量 partition 决定从 kernel 分区还是 recovery 分区引导启动在 d211/common/env.txt 修改如下:
+ set_commonargs_recovery=setenv bootargs earlycon=${earlycon} earlyprintk console=${console} rdinit=/linuxrc + //从 Recovery 系统启动, 引导 initramfs 启动 + set_mmc_bootargs_recovery=run set_commonargs_recovery; \ //设置环境变量 set_mmc_bootargs_recovery run set_mmc_root; \ setenv bootargs "${bootargs}"; + boot_partition=kernel //初始化环境变量 partition 从 kernel 分区启动 + run set_mmc_bootargs_recovery; \ + loadknl mmc ${boot_devnum} recovery ${knl_addr}; \ + bootm ${knl_addr}; //nand_boot 环境变量增加从 recovery 分区引导启动
注:手动配置环境变量 partition 并保存, 重启测试 Boot 是否能够引导 Recovery 系统启动, 判断配置文件是否生效
- fw_env.config 配置
OTA 升级过程中, 主系统和 Recovery 系统都使用到 SWUpdate 命令, SWUpdate 依赖 Boot 环境变量, 需要在 Linux 中配置 U-Boot 环境变量索引路径。
fw_printenv/fw_setenv 命令默认索引路径为/etc/fw_env.config
因为使用到了 env_r 备份分区, fw_env.config 需要包含 env, env_r 分区信息, eMMC 的默认的配置信息如下://device name Device offset Env. size /dev/mmcblk0 0x180000 0x4000
-
/dev/mmcblk0 表示 emmc 分区的设备号
-
Device offset 为 env 分区的偏移值
-
Env. size 表示实际 env 的大小
Recovery 系统 SDK 生产环境默认存在 config 文件, 具体路径为target/d211/ota_emmc/rootfs_overlay/etc/fw_env.config
主系统 SDK 生产环境默认存在 config 文件, 具体路径如下:
fw_env.config 在主系统的路径如下:
target/d211/<board>/rootfs_overlay/etc/fw_env.config-
客户 env、env_r 分区信息如果修改, 以上两个 config 文件需要同时更新
-
在 Linux 环境下执行 fw_printenv/fw_setenv 命令, 测试能够正常打印 Boot 环境变量信息
-
-
OTA 手动升级环境搭建完成后,需继续搭建 OTA 自动升级环境, 首先配置一个 ota 分区, 用来保存 OTA 升级 swu 包数据
在target/d211/per1/image_cfg.json文件修改"partitions": { // Partition table apply to device "rootfs": { "size": "72m" }, + "ota": { "size": "96m" }, }, "rootfs": { "file": "rootfs.ext4", "attr": ["block", "required"], "part": ["rootfs"] }, + "ota": { + "file": "ota.ext4", + "attr": ["block", "required"], + "part": ["ota"] + },
- 主系统配置生成 ota.ext4 目标文件
- 将 OTA 升级包下载到 ota 分区里面, 方便测试 OTA 本地升级功能
ota 分区如下所示:
-
进入主系统 SDK 生产环境
lunch d211_per1_mmc
-
在 Luban 根目录下执行配置命令
make m
-
配置如下:
Filesystem images ---> [*] UserFS 1 ---> (ota) Name │ │ FS Type (Ext4) ---> (96M) Size (target/$(LUBAN_CHIP_NAME)/$(LUBAN_BOARD_NAME)/ota) Overlay directory
注:编译生成的 swu 包文件 swu 需要拷贝到目录 target/$(LUBAN_CHIP_NAME)/$(LUBAN_BOARD_NAME)/ota 下, 将 target/$(LUBAN_CHIP_NAME)/$(LUBAN_BOARD_NAME)/ota 目录里的内容生成 ext4 镜像文件, 之后整个文件烧录到 ota 分区里面。
- 将 OTA 升级包下载到 ota 分区里面, 方便测试 OTA 本地升级功能
启动脚本配置
主系统自动挂载 ota 分区到/mnt/ota 目录下, 之后直接执行命令就可以启动 OTA 升级了
脚本路径如下:
target/d211/per1/rootfs_overlay/etc/swupdate_main
主要内容如下:
mkdir -p /mnt/ota mount /dev/mmcblk0p12 /mnt/ota //挂载 ota 分区到 mnt/ota 目录下
客户如果自定义分区, 对应的设备节点有变更,需要修改对应的挂载方式
Recovery 系统执行后, 也需要自动挂载 ota 分区到/mnt/ota 目录下, 并根据 U-Boot 环境变量自动触发 OTA 升级功能。
Recovery 系统启动脚本路径如下:
target/d211/<board>/rootfs_overlay/init.d/S91swupdate_ota
主要内容如下:
mkdir -p /mnt/ota mount /dev/mmcblk0p12 /mnt/ota //挂载 ota 分区到 mnt/ota 目录下 ./usr/lib/swupdate/swupdate_cmd.sh //执行 OTA 升级程序
客户如果自定义分区, 对应的设备节点有变更,需要修改对应的挂载方式