OTA介紹
OTA(Over-The-Air,空中升級(jí))是一種通過無線通信技術(shù)實(shí)現(xiàn)遠(yuǎn)程更新設(shè)備固件或軟件的方法。設(shè)備批量投入使用后,由于部署范圍太廣、設(shè)備數(shù)量太多、部署的位置特殊、沒有預(yù)留硬件有線升級(jí)接口等原因,用戶往往無法人為的通過有線方式更新設(shè)備固件,這時(shí)候就可以通過 OTA 進(jìn)行網(wǎng)絡(luò)升級(jí)。
UpdateEngine介紹
Firefly 在 Linux 平臺(tái)上提供了 UpdateEngine 開源 OTA 升級(jí)工具,工具支持遠(yuǎn)程下載固件、固件校驗(yàn)、固件解包、完整固件/分區(qū)升級(jí)。

UpdateEngine工作原理
UpdateEngine 會(huì)解析 Rockchip 格式的固件,并且計(jì)算到每個(gè)分區(qū)鏡像在固件中的偏移。提取每個(gè)分區(qū)鏡像的末尾 crc 校驗(yàn)信息,對(duì)固件和分區(qū)鏡像進(jìn)行校驗(yàn),確保完整性。
UpdateEngine 會(huì)把固件存放的路徑(如:/userdata/update.img)和需要升級(jí)的分區(qū)信息寫入 misc 分區(qū),并且打上 ”update“標(biāo)志,讓設(shè)備在重啟后自動(dòng)進(jìn)入 recovery 模式。
在 recovery 模式中 userdata 分區(qū)會(huì)自動(dòng)掛載到 /userdata 下,系統(tǒng)如果檢查到 “update”標(biāo)志,recovery 就會(huì)調(diào)用 rkupdate 對(duì)固件進(jìn)行解析并且升級(jí)到存儲(chǔ)設(shè)備中。
設(shè)備在 recovery 模式時(shí),根文件系統(tǒng)會(huì)運(yùn)行在 ramdisk 內(nèi)存上,而不是原系統(tǒng)存儲(chǔ)上(如:emmc)。所以程序可以正常的向存儲(chǔ)設(shè)備分區(qū)進(jìn)行寫操作。
OTA升級(jí)流程圖

OTA固件制作
“OTA 升級(jí)固件“”實(shí)際上就是 SDK 打包出來的 Rockchip 格式的固件。如果用戶只需要對(duì)某些分區(qū)進(jìn)行升級(jí)而不是完整固件升級(jí),可以通過修改 package-file 來裁剪固件大小。
位置在 Firefly_SDK/tools/linux/Linux_Pack_Firmware/rockdev/package-file

“RESERVED”代表預(yù)留不打包的意思。例如:用戶如果只需要更新 kernel 、uboot、bootloader,可以把 rootfs 分區(qū)設(shè)置成“RESERVED”,這樣可以大大的減少固件大小。
OTA固件升級(jí)步驟
本文實(shí)例的實(shí)際操作軟硬件環(huán)境:
設(shè)備:AIO-3588Q
固件:AIO-3588Q-RTLINUX_Ubuntu20.04-Gnome-r240_v1.1.1d_231018
1. 安裝 UpdateEngine
在 Firefly官方的 ubuntu20.04 和 ubuntu22.04 apt源中已經(jīng)添加了 updateEngine 包,可以直接使用 apt 安裝。
apt updateapt install updateengine
如果是其他 Linux 發(fā)行版,也可以直接編譯運(yùn)行。
apt install libdrm-dev libssl-dev libbz2-dev libcurl4-openssl-dev gitgit clone https://gitlab.com/firefly-linux/external/recovery.gitcd recoverymake -j8
2.升級(jí)遠(yuǎn)程固件
updateEngine --misc=update --image_url=http://172.16.0.123:8000/update.img --savepath=/userdata/update.img --partition=0xFFFC00 --reboot
--misc=update:misc 中寫入“update”標(biāo)志,通知 recovery 需要進(jìn)行 OTA 升級(jí)
--image_url:指定固件路徑
--savepath:指定固件存放路徑
--partition:指定需要升級(jí)的分區(qū),不指定則默認(rèn)是 0X3FFC00
--reboot:執(zhí)行完成后是否自動(dòng) reboot

簡單的搭建存放固件的 http 服務(wù)器。
python3 -m http.server 80
3. 升級(jí)本地固件
updateEngine --misc=update --image_url=/userdata/update.img --partition=0xFFFC00 --reboot
參數(shù)同上
4. 升級(jí)完成
執(zhí)行命令后會(huì)自動(dòng)重啟進(jìn)入 recovery 升級(jí),user LED 燈閃爍,升級(jí)完成后設(shè)備會(huì)自動(dòng)重啟進(jìn)入正常的操作系統(tǒng)。
升級(jí)前:

升級(jí)后:

注意事項(xiàng)
1. 分區(qū)要求
如果你的設(shè)備只是單個(gè)系統(tǒng)啟動(dòng),不是 A/B 啟動(dòng),那么你的分區(qū)表中必須包含 misc 分區(qū)和 recovery 分區(qū)。另外如果固件存放在系統(tǒng)硬盤上的 userdata 分區(qū),那么不能修改分區(qū)表中的 Userdata 起始位置。
2. 固件存放
無論遠(yuǎn)程更新或本地更新,固件最終的存放路徑必須要放在 /userdata 下,有其他的存儲(chǔ)介質(zhì)除外,但也需要在 recovery 上可以做到自動(dòng)掛載。
3.Userdata 用戶數(shù)據(jù)
Recovery 在 updateEning OTA 升級(jí)時(shí)會(huì)保留 userdata 數(shù)據(jù),所以 misc 不會(huì)升級(jí),也不會(huì)擦除 userdata 分區(qū)數(shù)據(jù)。如有需要可以自定義 recovery 的代碼,F(xiàn)irefly_SDK/external/rkupdate/RKAndroidDevice.cpp => DownloadImage,去掉 MISC 的判斷條件,重新編譯 recovery 打包 OTA 升級(jí)固件。

更加安全的 OTA 升級(jí)應(yīng)該配合A/B 系統(tǒng)來完成,后續(xù)我們還會(huì)單獨(dú)介紹 A/B 系統(tǒng)的 OTA 升級(jí)。
-
無線通信
+關(guān)注
關(guān)注
58文章
4987瀏覽量
146882 -
數(shù)據(jù)線
+關(guān)注
關(guān)注
8文章
315瀏覽量
54188 -
OTA
+關(guān)注
關(guān)注
7文章
628瀏覽量
38286
發(fā)布評(píng)論請(qǐng)先 登錄
一文吃透RK平臺(tái)OTA升級(jí)開發(fā):從邏輯到調(diào)試的完整指南
磁吸數(shù)據(jù)線廠商創(chuàng)新升級(jí),昆旺精密打造性能與顏值兼?zhèn)涞男聵?biāo)桿
一般想要實(shí)現(xiàn)OTA的話使用藍(lán)牙升級(jí)好還是4G這種方式實(shí)現(xiàn)升級(jí)?
Bootloader固件升級(jí)的步驟
使用RTT的維護(hù)云進(jìn)行遠(yuǎn)程固件升級(jí)(OTA),怎么沒有網(wǎng)絡(luò)升級(jí)的方式?
ota升級(jí)完成后,bootloader沒有將download區(qū)的新代碼搬運(yùn)到app區(qū)?
技術(shù)筆記 | Ubuntu 系統(tǒng) OTA 升級(jí)全流程詳解
藍(lán)牙空中升級(jí)(OTA)原理
詳解藍(lán)牙空中升級(jí)(OTA)原理與步驟
使用STM32H755ZIQ-NUCLEO時(shí),由于數(shù)據(jù)線的原因?qū)е?b class='flag-5'>固件升級(jí)失敗怎么解決?
使用STM32H755ZIQ-NUCLEO時(shí),由于數(shù)據(jù)線的原因?qū)е?b class='flag-5'>固件升級(jí)失敗,怎么解決?
瑞薩電子MCU無感OTA升級(jí)功能介紹
一文解鎖OTA遠(yuǎn)程升級(jí)方案!基于RK3562全國產(chǎn)平臺(tái)
【OTA升級(jí)】無需數(shù)據(jù)線,一條命令即可完成固件升級(jí)!
評(píng)論