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
簡(jiǎn)單的搭建存放固件的 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文章
4587瀏覽量
143678 -
數(shù)據(jù)線
+關(guān)注
關(guān)注
8文章
283瀏覽量
37773 -
OTA
+關(guān)注
關(guān)注
7文章
583瀏覽量
35296
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論