OTA介绍
OTA(Over-The-Air,空中升级)是一种通过无线通信技术实现远程更新设备固件或软件的方法。设备批量投入使用后,由于部署范围太广、设备数量太多、部署的位置特殊、没有预留硬件有线升级接口等原因,用户往往无法人为的通过有线方式更新设备固件,这时候就可以通过 OTA 进行网络升级。
UpdateEngine介绍
Firefly 在 Linux 平台上提供了 UpdateEngine 开源 OTA 升级工具,工具支持远程下载固件、固件校验、固件解包、完整固件/分区升级。
UpdateEngine工作原理
UpdateEngine 会解析 Rockchip 格式的固件,并且计算到每个分区镜像在固件中的偏移。提取每个分区镜像的末尾 crc 校验信息,对固件和分区镜像进行校验,确保完整性。
UpdateEngine 会把固件存放的路径(如:/userdata/update.img)和需要升级的分区信息写入 misc 分区,并且打上 ”update“标志,让设备在重启后自动进入 recovery 模式。
在 recovery 模式中 userdata 分区会自动挂载到 /userdata 下,系统如果检查到 “update”标志,recovery 就会调用 rkupdate 对固件进行解析并且升级到存储设备中。
设备在 recovery 模式时,根文件系统会运行在 ramdisk 内存上,而不是原系统存储上(如:emmc)。所以程序可以正常的向存储设备分区进行写操作。
OTA升级流程图
OTA固件制作
“OTA 升级固件“”实际上就是 SDK 打包出来的 Rockchip 格式的固件。如果用户只需要对某些分区进行升级而不是完整固件升级,可以通过修改 package-file 来裁剪固件大小。
位置在 Firefly_SDK/tools/linux/Linux_Pack_Firmware/rockdev/package-file
“RESERVED”代表预留不打包的意思。例如:用户如果只需要更新 kernel 、uboot、bootloader,可以把 rootfs 分区设置成“RESERVED”,这样可以大大的减少固件大小。
OTA固件升级步骤
本文实例的实际操作软硬件环境:
设备:AIO-3588Q
固件:AIO-3588Q-RTLINUX_Ubuntu20.04-Gnome-r240_v1.1.1d_231018
1. 安装 UpdateEngine
在 Firefly官方的 ubuntu20.04 和 ubuntu22.04 apt源中已经添加了 updateEngine 包,可以直接使用 apt 安装。
apt updateapt install updateengine
如果是其他 Linux 发行版,也可以直接编译运行。
apt install libdrm-dev libssl-dev libbz2-dev libcurl4-openssl-dev gitgit clone https://gitlab.com/firefly-linux/external/recovery.gitcd recoverymake -j8
2. 升级远程固件
updateEngine --misc=update --image_url=http://172.16.0.123:8000/update.img --savepath=/userdata/update.img --partition=0xFFFC00 --reboot
--misc=update:misc 中写入“update”标志,通知 recovery 需要进行 OTA 升级
--image_url:指定固件路径
--savepath:指定固件存放路径
--partition:指定需要升级的分区,不指定则默认是 0X3FFC00
--reboot:执行完成后是否自动 reboot
简单的搭建存放固件的 http 服务器。
python3 -m http.server 80
3. 升级本地固件
updateEngine --misc=update --image_url=/userdata/update.img --partition=0xFFFC00 --reboot
参数同上
4. 升级完成
执行命令后会自动重启进入 recovery 升级,user LED 灯闪烁,升级完成后设备会自动重启进入正常的操作系统。
升级前:
升级后:
注意事项
1. 分区要求
如果你的设备只是单个系统启动,不是 A/B 启动,那么你的分区表中必须包含 misc 分区和 recovery 分区。另外如果固件存放在系统硬盘上的 userdata 分区,那么不能修改分区表中的 Userdata 起始位置。
2. 固件存放
无论远程更新或本地更新,固件最终的存放路径必须要放在 /userdata 下,有其他的存储介质除外,但也需要在 recovery 上可以做到自动挂载。
3. Userdata 用户数据
Recovery 在 updateEning OTA 升级时会保留 userdata 数据,所以 misc 不会升级,也不会擦除 userdata 分区数据。如有需要可以自定义 recovery 的代码,Firefly_SDK/external/rkupdate/RKAndroidDevice.cpp => DownloadImage,去掉 MISC 的判断条件,重新编译 recovery 打包 OTA 升级固件。
更加安全的 OTA 升级应该配合 A/B 系统来完成,后续我们还会单独介绍 A/B 系统的 OTA 升级。
全部0条评论
快来发表一下你的评论吧 !