一、方案概述
1.1背景與目標(biāo)
在嵌入式設(shè)備中,單一存儲介質(zhì)可能存在容量限制或可靠性風(fēng)險。RK3588平臺的雙存儲OTA升級方案支持SPI(如SPI NAND/NOR)與PCIE存儲(如PCIE SSD)混合部署場景,通過統(tǒng)一升級引擎實(shí)現(xiàn)跨存儲設(shè)備的固件管理,解決多存儲介質(zhì)下的升級兼容性問題,同時保障升級過程的安全性與可靠性。
1.2核心特性
?混合存儲支持:同時適配SPI(MTD設(shè)備)與PCIE(塊設(shè)備)存儲,支持不同類型分區(qū)獨(dú)立升級。
?固件格式擴(kuò)展:新增多存儲固件格式,兼容原有單存儲固件。
?精細(xì)化存儲識別:每個分區(qū)獨(dú)立標(biāo)記存儲類型(MTD /非MTD),替代全局判斷。
?安全校驗(yàn)增強(qiáng):針對不同存儲類型優(yōu)化校驗(yàn)邏輯,確保數(shù)據(jù)完整性。
二、環(huán)境配置與編譯準(zhǔn)備
2.1 Buildroot配置(rk3588.config)
開啟升級功能并指定新升級引擎,確保編譯時包含必要組件:
|
#開啟升級相關(guān)功能
BR2_PACKAGE_RECOVERY=y
#使用新升級程序(替代原有流程)
BR2_PACKAGE_RECOVERY_USE_UPDATEENGINE=y
#編譯recovery二進(jìn)制文件
BR2_PACKAGE_RECOVERY_RECOVERYBIN=y
#編譯新升級引擎二進(jìn)制文件
BR2_PACKAGE_RECOVERY_UPDATEENGINEBIN=y
#關(guān)閉UI(適用于無顯示場景)
BR2_PACKAGE_RECOVERY_NO_UI=y
|
2.2依賴調(diào)整(glibc.mk)
為兼容雙存儲升級引擎,將glibc版本從2.38降級至2.31:
|
#原版本
# GLIBC_VERSION = 2.38-27-g750a45a783906a19591fb8ff6b7841470f1f5701
#調(diào)整后版本
GLIBC_VERSION = 2.31-54-g6fdf971c9dbf7dac9bea552113fe4694015bbc4d
|
注:版本調(diào)整需根據(jù)實(shí)際兼容性測試結(jié)果確認(rèn)。
三、核心技術(shù)實(shí)現(xiàn)
3.1存儲類型定義與標(biāo)識
3.1.1存儲類型枚舉(rkimage.h)
定義支持的存儲類型,包含SPI與PCIE:
|
typedef enum {
STORAGE_FLASH_CODE = 1<<0,? //閃存
STORAGE_EMMC_CODE = 1<<1,? // eMMC
STORAGE_SD0_CODE = 1<<2,? // SD卡0
STORAGE_SD1_CODE = 1<<3,? // SD卡1
STORAGE_SPINOR_CODE = 1<<9,? // SPI NOR(MTD設(shè)備)
STORAGE_SPINAND_CODE = 1<<8,? // SPI NAND(MTD設(shè)備)
STORAGE_USB_CODE = 1<<7,? // USB存儲
STORAGE_PCIE_CODE = 1<<11? // PCIE存儲(塊設(shè)備)
//其他存儲類型...
} STORAGE_CODE;
|
3.1.2固件標(biāo)簽標(biāo)識(defineHeader.h)
通過標(biāo)簽區(qū)分固件類型:
|
//多存儲固件標(biāo)簽(SPI+PCIE等混合存儲)
#define SSFW_TAG 0x57465353
//普通單存儲固件標(biāo)簽
#define RKFW_TAG 0x57464B52
|
3.2多存儲固件格式設(shè)計(jì)
雙存儲固件采用分層打包結(jié)構(gòu),外層為容器,內(nèi)層包含各存儲設(shè)備的獨(dú)立固件:
|
update_ssfw.img(外層容器)
├── STORAGE_FW_HDR(頭部,4KB)
│├── tag: SSFW_TAG(標(biāo)識多存儲固件)
│├── head_size:頭部大小
│├── entry_count:存儲設(shè)備數(shù)量(如2個:SPI和PCIE)
│└── entry_size:每個存儲條目的大小
├── STORAGE_ENTRY(條目表,可變長)
│├── [SPI存儲條目]
││├── storage: STORAGE_SPINAND_CODE(存儲類型)
││├── offset: SPI固件在內(nèi)層的偏移量
││└── size: SPI固件大小
│└── [PCIE存儲條目]
│ ├── storage: STORAGE_PCIE_CODE
│ ├── offset: PCIE固件在內(nèi)層的偏移量
│ └── size: PCIE固件大小
├── SPI固件(內(nèi)層,RKFW格式)
└── PCIE固件(內(nèi)層,RKFW格式)
|
3.3固件解析流程
3.3.1解析入口(rkimage.c)
analyticImage函數(shù)根據(jù)固件標(biāo)簽判斷類型,分支處理:
|
int analyticImage(const char *filepath, PRKIMAGE_HDR phdr, PRKIMAGE_STORAGE image_storage, int num) {
//讀取固件頭部標(biāo)簽
if (rkimage_tag == SSFW_TAG) {
//解析多存儲固件(SPI+PCIE)
return analyticDualStorageImage(filepath, phdr, image_storage, num);
} else if (rkimage_tag == RKFW_TAG) {
//解析普通單存儲固件
return analyticRKFWImage(filepath, phdr, 0, fileSize);
}
}
|
3.3.2多存儲固件解析(analyticDualStorageImage)
1.讀取外層容器頭部,驗(yàn)證SSFW_TAG;
2.解析條目表,獲取SPI和PCIE固件的偏移量與大小;
3.分別解析內(nèi)層SPI固件和PCIE固件(調(diào)用analyticRKFWImage);
4.整合所有分區(qū)信息,并標(biāo)記每個分區(qū)的存儲類型(is_mtd):
?SPI存儲的分區(qū)(如SPI NAND)標(biāo)記為is_mtd = true;
?PCIE存儲的分區(qū)標(biāo)記為is_mtd = false。
3.4升級執(zhí)行適配
3.4.1存儲類型感知的燒寫邏輯(flash_image.c)
將全局存儲類型判斷改為分區(qū)級判斷,適配SPI(MTD)與PCIE(塊設(shè)備):
|
//原邏輯:全局判斷是否為MTD設(shè)備
// if (is_sdboot || is_usbboot || !isMtdDevice()) {
//新邏輯:使用當(dāng)前分區(qū)的is_mtd屬性
if (is_sdboot || is_usbboot || !pcmd->is_mtd) {
//塊設(shè)備操作(如PCIE存儲):直接寫入/dev/block路徑
} else {
// MTD設(shè)備操作(如SPI存儲):通過mtd-utils工具操作
}
|
3.4.2校驗(yàn)邏輯適配(md5sum.c)
為comparefile函數(shù)增加is_mtd參數(shù),根據(jù)存儲類型選擇校驗(yàn)方式:
|
//新增is_mtd參數(shù)
bool comparefile(..., bool is_mtd) {
if (is_mtd) {
// MTD設(shè)備校驗(yàn)(SPI存儲):使用mtd讀取接口
checkdata_mtd(dest_path, md5sum_dest, dest_offset, checkSize);
} else {
//塊設(shè)備校驗(yàn)(PCIE存儲):使用普通文件讀取接口
checkdata(dest_path, md5sum_dest, dest_offset, checkSize);
}
}
|
3.4.3升級流程整合(update.c)
1.升級前解析固件時,通過image_storage記錄各分區(qū)的is_mtd屬性;
2.升級執(zhí)行時,為每個分區(qū)的update_cmd設(shè)置is_mtd;
3.調(diào)用燒寫函數(shù)(flash_normal/flash_bootloader)和校驗(yàn)函數(shù)(comparefile)時,傳入is_mtd參數(shù),確保操作與存儲類型匹配。
四、關(guān)鍵技術(shù)點(diǎn)總結(jié)
|
技術(shù)點(diǎn)
|
作用
|
實(shí)現(xiàn)方式
|
|
多存儲固件格式
|
支持SPI與PCIE固件打包
|
外層SSFW容器+內(nèi)層RKFW固件
|
|
分區(qū)級存儲標(biāo)識
|
區(qū)分每個分區(qū)的存儲類型
|
is_mtd屬性(true=SPI,false=PCIE)
|
|
動態(tài)燒寫適配
|
針對存儲類型選擇操作接口
|
塊設(shè)備直接寫入/ MTD設(shè)備通過mtd-utils
|
|
校驗(yàn)邏輯適配
|
確保不同存儲類型的校驗(yàn)準(zhǔn)確性
|
根據(jù)is_mtd選擇校驗(yàn)方法
|
五、測試與驗(yàn)證
5.1測試場景
1.基礎(chǔ)功能測試:分別升級SPI和PCIE存儲的分區(qū),驗(yàn)證單獨(dú)升級有效性;
2.混合升級測試:同時升級SPI(如uboot)和PCIE(如rootfs)分區(qū),驗(yàn)證跨存儲協(xié)同;
3.容錯測試:升級中斷后重啟,檢查是否支持?jǐn)帱c(diǎn)續(xù)傳或回滾;
4.兼容性測試:驗(yàn)證對原有單存儲固件(RKFW_TAG)的兼容能力。


5.2驗(yàn)證指標(biāo)
?升級成功率:≥99.5%(1000次測試);
?升級速度:SPI NAND(≥8MB/s),PCIE SSD(≥30MB/s);
?校驗(yàn)準(zhǔn)確性:100%識別數(shù)據(jù)篡改(通過人工修改固件測試)。
六、總結(jié)
本方案通過擴(kuò)展固件格式、引入分區(qū)級存儲標(biāo)識、適配動態(tài)燒寫與校驗(yàn)邏輯,實(shí)現(xiàn)了RK3588平臺SPI與PCIE雙存儲的OTA升級。方案兼顧兼容性與靈活性,可滿足復(fù)雜存儲場景下的升級需求,為多存儲設(shè)備的嵌入式系統(tǒng)提供可靠的固件更新能力。
-
嵌入式
+關(guān)注
關(guān)注
5198文章
20445瀏覽量
334002 -
存儲
+關(guān)注
關(guān)注
13文章
4790瀏覽量
90058 -
RK3588
+關(guān)注
關(guān)注
8文章
556瀏覽量
7323
發(fā)布評論請先 登錄
瑞芯微RK3588開發(fā)板RK3588 EVB和RK3588S EVB解讀
RK3588 EVB 用戶使用指南
重磅!基于瑞芯微RK3588旗艦芯片打造的MinipcRK3588面世
求一種基于RK3588實(shí)現(xiàn)SPI-NOR大容量存儲方案
介紹一種基于RK3588平臺的便攜式8K錄播一體機(jī)解決方案
基于RK3588芯片方案開發(fā)ARM PC項(xiàng)目
求一種基于RK3588平臺的高端游戲掌機(jī)產(chǎn)品解決方案
求一種RK3588+FPGA高速圖像處理通信處理機(jī)解決方案
基于RK3588平臺的高性能XR解決方案
基于RK3588平臺的會議平板即將發(fā)布
RK3588與3588s的區(qū)別
Banana Pi BPI-W3 RK3588平臺驅(qū)動調(diào)試篇 [ PCIE篇二 ] - PCIE的開發(fā)指南
實(shí)戰(zhàn)復(fù)盤:RK3588 SPI+PCIe3x4方案啟動修復(fù),從節(jié)點(diǎn)配置到驅(qū)動適配全解析
RK3588平臺雙存儲(SPI+PCIE)OTA升級方案教學(xué)文檔
評論