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

描述

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 升级。

 

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分