前言:在嵌入式系統設備管理中,OTA(Over-The-Air)升級是實現設備遠程維護、功能迭代的核心能力。本文基于 Ubuntu 系統環境,詳細拆解 updateEngine 工具的 OTA 升級方案,從配置開啟、命令使用到實戰案例與問題排查,為開發者提供一套可直接落地的操作指南
一、recovery配置updateEngine 支持
因OTA升級過程中需要進入到recovery模式下進行升級,因此需要確保recovery文件系統中存在updateEngine指令。
要使用 updateEngine 進行 OTA 升級,需先通過編譯recovery配置開啟相關功能。針對 Ubuntu 系統,需在recovery配置文件中添加以下參數:
BR2_PACKAGE_RECOVERY=y ?# 開啟升級核心功能
BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y ?# 啟用新升級程序,不配置則默認使?原有升級流程
BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y ?# 編譯新升級程序文件
BR2_PACKAGE_RECOVERY_NO_UI=y ?# 關閉UI界面
上述配置的核心是通過USE_UPDATEENGINE指定使用新升級框架,確保后續命令可調用?updateEngine?工具完成升級操作。
Ubuntu 的updateEngine 工具請通過拉取源碼進行編譯生成。
二、updateEngine 命令詳解
updateEngine?支持網絡遠程升級與本地固件升級,命令參數靈活且可按需組合,核心用法如下:
?2.1??網絡升級:從遠程服務器拉取固件
updateEngine --image_url=http://192.168.0.190/recovery/update.img \
? ? ? ? ? ? ?--misc=update \
? ? ? ? ? ? ?--savepath=/userdata/update.img \
? ? ? ? ? ? ?--reboot &
--image_url:遠程固件地址(HTTP/HTTPS 協議均可);
--misc=update:指定進入升級模式;
--savepath:固件本地保存路徑(建議/userdata/update.img,與 recovery 模式默認掛載路徑一致,避免檢索失敗);
--reboot:升級后自動重啟進入 recovery 模式完成后續操作。
?2.2??本地升級:使用已下載的本地固件
本地升級無需網絡傳輸,直接讀取--image_url指定的本地固件路徑,其他參數與網絡升級一致。
?2.3??可缺省參數說明
--version_url:版本文件地址(遠程 / 本地均可),用于升級前與/etc/version中的RK_VERSION比對,缺省時不進行版本校驗;
--partition:指定升級分區(默認0x3FFC00),不?持升級parameter 和loader分區
--savepath:缺省時默認/tmp/update.img,但建議傳入/userdata/update.img,避免 recovery 模式下無法讀取固件;
--reboot:非必需,若無需自動重啟,可省略此參數(需手動進入 recovery 模式)。
?2.4??升級全流程
updateEngine 的升級流程可分為 6 個核心步驟,結合RK3568的日志輸出更易理解和定位流程節點:
1.版本校驗(可選):若指定--version_url,對比遠程版本文件與本地/etc/version,確認是否需要升級;
2.固件獲取:從--image_url下載(網絡升級)或讀取(本地升級)固件,保存至--savepath;
3.升級 recovery 分區:在 normal 模式下先更新 recovery 分區,為后續恢復模式操作做準備;
4.重啟觸發:通過--reboot參數自動重啟設備;
5.recovery 模式升級:進入 recovery 模式后,按--partition指定的分區列表執行升級;
6.完成重啟:升級成功后自動重啟,進入 normal 系統。
三、分區升級邏輯
updateEngine主要包含升級分區和寫Misc配置功能,?持命令參數如下:
***?update_engine: Version V1.1.0?***.
--misc=now ? ? ? ? ? ? Linux A/B mode: Setting the current partition to bootable.
--misc=other ? ? ? ? ? Linux A/B mode: Setting another partition to bootable.
--misc=update ? ? ? ? Recovery mode: Setting the partition to be upgraded.
--misc=wipe_userdata ? Format data partition.
--update ? ? ? ? ? ? ? Upgrade mode.
--partition=0x3FFC00 ? Set the partition to be upgraded.(NOTICE: OTA not support
upgrade loader?and?parameter)
? ? ? ? ? ? ? ? ? ? ??0x3FFC00:?0011?1111?1111?1100?0000?0000.
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? uboot trust boot recovery rootfs oem
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? uboot_a uboot_b boot_a boot_b system_a system_b.
? ? ? ? ? ? ? ? ? ? ??000000000000000000000000: reserved
? ? ? ? ? ? ? ? ? ? ??100000000000000000000000: Upgrade loader 0x800000
? ? ? ? ? ? ? ? ? ? ??010000000000000000000000: Upgrade?parameter? ? ? ? ?0x400000
? ? ? ? ? ? ? ? ? ? ??001000000000000000000000: Upgrade uboot 0x200000
? ? ? ? ? ? ? ? ? ? ??000100000000000000000000: Upgrade trust 0x100000
? ? ? ? ? ? ? ? ? ? ??000010000000000000000000: Upgrade boot 0x80000
? ? ? ? ? ? ? ? ? ? ??000001000000000000000000: Upgrade recovery 0x40000? ?0x0100
? ? ? ? ? ? ? ? ? ? ??000000100000000000000000: Upgrade rootfs 0x20000? ?0x0010
? ? ? ? ? ? ? ? ? ? ??000000010000000000000000: Upgrade oem 0x10000
? ? ? ? ? ? ? ? ? ? ??000000001000000000000000: Upgrade uboot_a 0x8000
? ? ? ? ? ? ? ? ? ? ??000000000100000000000000: Upgrade uboot_b 0x4000
? ? ? ? ? ? ? ? ? ? ??000000000010000000000000: Upgrade boot_a 0x2000
? ? ? ? ? ? ? ? ? ? ??000000000001000000000000: Upgrade boot_b 0x1000
? ? ? ? ? ? ? ? ? ? ??000000000000100000000000: Upgrade system_a 0x800
? ? ? ? ? ? ? ? ? ? ??000000000000010000000000: Upgrade system_b 0x400
? ? ? ? ? ? ? ? ? ? ??000000000000001000000000: Upgrade misc 0x200
? ? ? ? ? ? ? ? ? ? ??000000000000000100000000: Upgrade userdata 0x100
--reboot ? ? ? ? ? ? ?運?成功之后,機器重啟
--version_url=url ? ? 如果有傳?路徑,升級之前會與/etc/version ?件中的 RK_VERSION= 版本值進?
--image_url=url ? ? ? 設置升級固件的路徑,可為遠程或本地路徑。
--savepath=url ? ? ? ?設置保存固件的位置,如果沒有傳?且升級的固件路徑為遠程地址,則默認值為/tmp/update.img(無效 ?需設置否則下載會卡住)
--update ? sdboot: 走sdboot升級流程,即直接對flash操作,沒有分區概念。
updateEngine 通過--partition參數的十六進制值指定升級分區,每一位對應一個分區的 “升級開關”(1 = 升級,0 = 不升級)。
示例:默認值0x3FFC00對應 “uboot + trust + boot + recovery + rootfs + oem + uboot_a/b + boot_a/b + system_a/b” 的組合升級,覆蓋主流核心分區。
四、分區單獨升級操作實例
?4.1??單獨升級 kernel(boot 分區)
updateEngine --image_url=http://192.168.0.190/recovery/update.img \
? ? ? ? ? ? ?--misc=update \
? ? ? ? ? ? ?--savepath=/userdata/update.img \
? ? ? ? ? ? ?--partition=0x80000 \
? ? ? ? ? ? ?--reboot &
原理:0x80000對應 boot 分區,直接寫入固件,無需進入 recovery 模式燒錄;
日志特征:會顯示write boot to /dev/block/by-name/boot及 MD5 校驗成功信息。
?4.2??單獨升級 kernel(boot 分區)
updateEngine --image_url=http://192.168.0.190/recovery/update.img \
? ? ? ? ? ? ?--misc=update \
? ? ? ? ? ? ?--savepath=/userdata/update.img \
? ? ? ? ? ? ?--partition=0x200000 \
? ? ? ? ? ? ?--reboot &
?注意:u-boot 為引導核心分區,升級后需確保固件兼容性,避免設備無法啟動。
?4.3??單獨升級 rootfs(需同步升級 recovery)
updateEngine?--image_url=http://192.168.0.190/recovery/update.img \
? ? ? ? ? ? ?--misc=update \
? ? ? ? ? ? ?--savepath=/userdata/update.img \
? ? ? ? ? ? ?--partition=0x60000 \ ?# 0x20000(rootfs)+0x40000(recovery)的組合值
? ? ? ? ? ? ?--reboot &
?特殊說明:rootfs 為運行中的文件系統,直接寫入會導致異常,需同步升級 recovery 分區,通過 recovery 模式完成安全升級。
總結
updateEngine 為系統提供了靈活高效的 OTA 升級能力,通過合理配置、精準指定分區與規范操作流程,可實現從內核到文件系統的全場景升級。本文涵蓋從基礎配置到實戰示例的完整演示,開發者可根據實際需求調整參數,快速落地設備升級方案。
想了解更多相關技術知識或產品信息,請關注眺望電子并聯系我們,我們將竭誠為您服務!