问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

【OTA升级】无需数据线,一条命令即可完成固件升级!

创作时间:
2025-01-22 00:10:58
作者:
@小白创作中心

【OTA升级】无需数据线,一条命令即可完成固件升级!

OTA(Over-The-Air,空中升级)是一种通过无线通信技术实现远程更新设备固件或软件的方法。Firefly开源团队开发的UpdateEngine工具,支持远程下载固件、固件校验、固件解包、完整固件/分区升级等功能,为设备的固件升级提供了便捷的解决方案。

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 update
apt install updateengine

如果是其他 Linux 发行版,也可以直接编译运行。

apt install libdrm-dev libssl-dev libbz2-dev libcurl4-openssl-dev git
git clone https://gitlab.com/firefly-linux/external/recovery.git
cd recovery
make -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 升级,userLED灯闪烁,升级完成后设备会自动重启进入正常的操作系统。

升级前:

升级后:

注意事项

  1. 分区要求

如果你的设备只是单个系统启动,不是 A/B 启动,那么你的分区表中必须包含 misc 分区和 recovery 分区。另外如果固件存放在系统硬盘上的 userdata 分区,那么不能修改分区表中的 Userdata 起始位置。

  1. 固件存放

无论远程更新或本地更新,固件最终的存放路径必须要放在 /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 升级。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。举报投诉

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号