高通OTA升級非常規分區方法
- 1. 高通LE OTA背景
- 2. 高通LE OTA升級方案
- 2.1 SDX12 OTA方案
- 2.2 OTA升級TZ/RPM/Aboot
OTA是一個通用述語,常見的解釋為over the air。通過這一解釋,OTA最開始的概念,是空中升級。后來,又衍生出了FOTA,FOAT的概念。
FOTA可以理解為Firmware Over The Air,即在線升級,是指通過模塊的數據通道完成升級包的下載和安裝。此外,FOAT,是模塊項目實踐運用中,發展出來的另一種升級方式,可描述為通過本地升級工具對模塊進行軟件更新的過程。FOAT與FOTA的不同是,升級包的導入方式上的不同。FOAT是通過串口傳輸導入,沒有無線部分的介入。所以兩者只是升級包導入的方式上的不同。在升級包導入到設備后,升級包的安裝更新,都歸為模塊自身的基本升級功能,由Recovery系統來完成。
綜上,在模塊項目中OTA調試,可分為三大塊,即:
1. 高通LE OTA背景
高通MDM、MSM平臺提供了基本的升級功能,大概都以開源的Android升級設計實現作為基礎,對其代碼進行移植,適配到自身平臺上。從差分包制作工具,升級過程,都有一套完整的方案,并且所涉及到的工具和代碼均完全開放,因此該方案的可塑性也更大。其中包括統一的用于安裝升級包的Recovery系統,編譯OTA底包專屬框架,和處理底包制作升級包的腳本和工具等。
由于該方案中各個文件的PATCH 基于文件系統而來,因此很難在bootloader 階段實現(無法掛載文件系統),所以在分區設計上,除了預留存放差分包,備份文件的空間外,還需要添加專門的分區(kernel, bootloader,filesystem)以供FOTA 使用,而該分區必須獨立于正常運行時的分區。這也就導致了該方案在硬件(FLASH,DDR)要求比較高。
在LE 的FOTA 方案中,升級程序作為一個應用程序運行,升級包則是一個標準的zip 文件(命名為ota 文件),升級過程則是解析升級包中指定的腳本文件,并根據解析到的內容引用對應的功能模塊,從而完成整個升級過程。
2. 高通LE OTA升級方案
下面主要介紹基于高通LE OTA方案,SDX12做的一些改進,以及如何在SDX12上完成 tz、rpm、appsboot等非常規鏡像或分區的OTA升級。
2.1 SDX12 OTA方案
X12 OTA升級使用的是高通平臺通用的FOTA方案,基本可以總結以下幾個步驟:
- 本地制作差分包,并上傳到遠端OTA服務器
- x12啟動OTA client線程去在固定間隔時間訪問OTA服務器
- 當OTA服務器上有可用OTA 包,則校驗包是否完整、版本號是否符合預期
- 若(3)中校驗OK,則下載OTA包到本地
- 下載完成后重啟進入recovery模式
- recovery模式啟動后會先檢測是否存在OTA包,存在則解壓包并使用包中的工具打patch
- 升級完成后設置成功標記并重啟進入boot模式
- 升級完成
流程圖如下:
高通LE平臺是多個子系統構成,其中boot、system這兩個子系統屬于HLOS鏡像,其他如tz、rpm、appsboot、modem等均為non-HLOS鏡像。
雖然NAND設備 (例如SDX12) 支持non-hlos鏡像的OTA升級,但電源中斷安全升級機制僅適用于system、boot和modem鏡像。啟動關鍵映像 (如tz、rpm、appsboot等) 可以升級,但如果在升級的很短時間內發生電源中斷 (通常為毫秒),設備將處于磚砌狀態。
因此默認OTA方案通常僅建議升級boot、system和modem鏡像,其中boot鏡像是以全包的方式、system鏡像以文件patch方式、modem以壓縮拆分后的patch方式:
但由于boot鏡像占用較大的空間,對于硬件(FLASH,DDR)要求比較高。很多時候無法滿足,因此我們在高通LE OTA升級方案上做出如下優化:將boot鏡像也以patch的方式進行升級,這樣就可以減少對于硬件(FLASH,DDR)要求,滿足低存儲空間的場景。
2.2 OTA升級TZ/RPM/Aboot
但是還存在客戶想OTA升級啟動關鍵映像 (如tz、rpm、appsboot等),如客戶有屏幕的場景,想更新開機動畫,而開機動畫在sbl階段就已經開始,因此就需要去升級appsboot鏡像。雖然啟動關鍵映像 (如tz、rpm、appsboot等) 可以升級,但如果在升級的很短時間內發生電源中斷 (通常為毫秒),設備將處于磚砌狀態。但高通針對這種情況,也是提供了對應的升級方案,但不建議使用,下面我們將簡單介紹如何去OTA升級這些非常規的分區。
根據高通文檔80-16206-49 AA,我們可以看到如我們想升級non-hlos鏡像,只需將這些鏡像打包在OTA目標版本底包的RADIO目錄下即可。
按照上述方法,我們手動將appsboot鏡像打包到RADIO目錄下:
然后使用OTA差分制作工具制作差分包,就可以在OTA差分包firmware目錄下看到appsboot鏡像,當升級時就會按照patch腳本去打patch升級appsboot鏡像:
在差分包的patch腳本META-INF\com\google\android\updater-script中也確實可以看到appsboot鏡像將以raw鏡像的方式升級:
但上面這種方式需要手動打包tz、rpm、appsboot等鏡像到OTA目標版本底包中,這樣是非常不便利的,因此修改ota底包制作流程,將tz、rpm、appsboot等鏡像按需打包進OTA底包中:
但如果我們在目標和當前版本OTA底包中都放上tz、rpm、appsboot等鏡像,又會導致他們會以patch的方式升級,而tz、rpm、appsboot等鏡像本身就只有不到1M的空間,因此完全無需patch方式,因此修改差分包制作工具,判斷當文件為tz、rpm、appsboot等鏡像時,無需制作patch,直接拷貝目標鏡像即可。
通過上述這些修改,就可以完成OTA升級tz、rpm、appsboot等非常規分區。