在前一篇文章 《i.MX RT1060/1010上串行NOR Flash冗余程序啟動設(shè)計》里,我詳細(xì)介紹了i.MX RT10xx上的冗余程序啟動設(shè)計,本質(zhì)上這就是個雙備份程序啟動, NORFlash里存兩份一樣的image,物理地址靠前的image 0啟動失效就繼續(xù)啟動后面的image 1,多一層保障。
i.MX RT1170是區(qū)別于i.MX RT10xx的第二代架構(gòu),性能/功能更加強(qiáng)大,其在繼承 i.MX RT10xx冗余程序啟動的基礎(chǔ)上,新增了雙程序可交替啟動設(shè)計,今天我們就來聊聊這個話題:
一、初識雙程序可交替啟動
與i.MX RT10xx一樣,這里要聊的還是在一片掛載在FlexSPI上的串行NOR Flash里做冗余/雙程序設(shè)計,就是下圖中的image L和image H,不涉及LPSPI接口Flash B里的image 2。
先說跟i.MX RT10xx上一樣的冗余程序啟動流程,i.MX RT1170上電先啟動物理地址靠前的image L,如果image L被破壞了,則繼續(xù)啟動image H。
什么是雙程序可交替啟動呢?簡單說就是物理地址靠前的image L并不總是上電首先啟動的image,在i.MX RT1170上新增了如下原型的image version啟動頭(在固定偏移 0x600 處),芯片上電 BootROM 會嘗試判斷兩個 image L/H 里的 version 頭版本,高版本的 image 優(yōu)先被啟動。這種設(shè)計方便了 OTA 升級。
-
Note: 當(dāng)image L/H中均不含有效version啟動頭時(img_ver 等于 0xFFFFFFFF,或者高低16bit不符合取反關(guān)系),雙程序可交替啟動特性就不生效,此時等效于冗余程序啟動,image L 永遠(yuǎn)被優(yōu)先啟動。
{
uint16_tversion;//版本值
uint16_tinversion;//version值的取反(~version)
}img_ver_t;
二、回顧冗余程序啟動
在測試雙程序可交替啟動新特性之前,還是先過一下冗余程序啟動。按照文章《i.MX RT1060/1010上串行NOR Flash冗余程序啟動設(shè)計》第2節(jié)里一模一樣的方法,在恩智浦官方MIMXRT1170-EVK開發(fā)板上做測試,這個板子FlexSPI1上掛了兩片F(xiàn)lash,默認(rèn)連接的16MB QuadSPI Flash,還有一片 64MB OctalFlash(需要做板子改動才能使能)。
在 i.MX RT1170 fuse 里關(guān)于冗余程序啟動的使能位定義與i.MX RT10xx上差不多,只不過 fuse 地址從 0x6E0 換到了0xC80。還是跟之前測試一樣借助MCUBootUtility工具將 FLEXSPI_NOR_SEC_IMAGE_OFFSET 燒錄為 0x10,xSPI_FLASH_IMAGE_SIZE 保持默認(rèn) 0,即第二份 image 偏移地址在 Flash 0x400000(4MB)處,最大 image 長度也是4MB。

繼續(xù)用SDK_2.11.0_MIMXRT1170-EVKoardsevkmimxrt1170demo_appsled_blinkycm7iarflexspi_nor_debug例程生成兩個稍微不一樣的 image,閃燈間隔時間一個是200ms(image L - iled_blinky_cm7_delay200ms.bin),另一個是 2s(image H - iled_blinky_cm7_delay2s.bin)。在 MCUBootUtility 工具主界面下使用 All-In-One 操作將 image L 下載進(jìn) Flash(baseaddress 設(shè)為 0x30000400),使用通用編程器界面 Write 操作將 image H 也下載進(jìn) Flash(Start 設(shè)為0x400400)。
現(xiàn)在Flash 里有了兩份 image,當(dāng)?shù)谝环?image 啟動失敗后,i.MX RT1170 BootROM 不是立刻去執(zhí)行下一份 image ,還是那個取巧的方法,在一個軟復(fù)位不置位的寄存器里(SRC_GPR10)標(biāo)記當(dāng)前狀態(tài),然后調(diào)用 NVIC_SystemReset() 重新進(jìn)入 BootROM 執(zhí)行。不過此時標(biāo)記位從 GPR10[30] 換到了 GPR10[27:26],雖然是 2bit 狀態(tài),但設(shè)值 1/2/3 等效于設(shè)值 1,因?yàn)閷τ诖?NOR Flash 最多就是兩份 image。這時候如果你想掛 J-Link 改寫 SRC_GPR10 去做快速驗(yàn)證恐怕無法如愿,原因請看《i.MX RT1170上用J-Link連接復(fù)位后PC總是停在0x223104》。
所以在i.MX RT1170上只能老老實(shí)實(shí)做破壞 image 完整性的動作來驗(yàn)證冗余程序啟動,經(jīng)實(shí)測其效果與i.MX RT10xx 是完全一致的。
三、實(shí)測雙程序可交替啟動
現(xiàn)在我們開始實(shí)測雙程序可交替啟動,主要的工作量就是為 image L 和 image H 添加 version 啟動頭,并且將它們分別下載進(jìn) Flash。因?yàn)槲覀兿腧?yàn)證物理地址靠后的 image H 比 image L 優(yōu)先啟動(冗余程序啟動做不到這點(diǎn)),所以需要將 image H 的 version 頭版本設(shè)高一點(diǎn)。
3.1 為 image 添加version 啟動頭
還是在SDK_2.11.0_MIMXRT1170-EVKoardsevkmimxrt1170demo_appsled_blinkycm7iarflexspi_nor_debug例程基礎(chǔ)上,首先在工程鏈接文件 MIMXRT1176xxxxx_cm7_flexspi_nor.icf 添加如下語句,指定 .img_ver 段的位置。
define symbol m_boot_img_ver_start = 0x30000600;
place at address mem: m_boot_img_ver_start { section .img_ver };
然后在工程隨便一個源文件里添加如下常量 s_bt_img_l_ver 定義,這個 image 閃燈間隔時間是 200ms(image L -iled_blinky_cm7_delay200ms_ver0.bin),版本是 0x0000(注意編譯鏈接工程時為防止 s_bt_img_l_ver 被優(yōu)化,可以在工程選項 Linker / Input /Keep symbols 里將其添加進(jìn)去)。
constimg_ver_ts_bt_img_l_ver@".img_ver"={
.version=0x0000,
.inversion=~0x0000,
};
同樣的工程,再生成另一個閃燈間隔時間為 2s(image H -iled_blinky_cm7_delay2s_ver1.bin) 的 image 時使用如下常量s_bt_img_h_ver 定義,版本是 0x0001。
constimg_ver_ts_bt_img_h_ver@".img_ver"={
.version=0x0001,
.inversion=~0x0001,
};
當(dāng)然如果你嫌上述方法繁瑣,也可以直接在最終 image binary 文件上做修改(注意 offset 位置一定要找對,i.MX RT1170 SDK XIP binary 文件起始數(shù)據(jù)對應(yīng) Flash 偏移是 0x400,因此文件中 0x200 處才對應(yīng) Flash 偏移 0x600):
現(xiàn)在需要借助 MCUBootUtility 工具的通用編程器功能分別將兩個含 version 頭的 image L/H 下載進(jìn) Flash。這里需要注意的是此時 image L 無法再通過主界面 All-In-One 操作來下載了,因?yàn)楣ぞ?v3.4 版本及以下沒有對 version 啟動頭做識別處理,因此會丟掉 version 頭數(shù)據(jù)(這個考慮會在 v4.0 之后加入支持)。
兩個 image下載完成,一切工作就結(jié)束了,這時候你調(diào)整芯片啟動模式到 2'b10 - Flash boot,給板卡重新上電,應(yīng)該可以看到 image H 正在執(zhí)行。
3.3 BootROM中判斷version的邏輯
BootROM中關(guān)于 version 啟動頭是否有效以及版本高低判斷邏輯其實(shí)是有一點(diǎn)復(fù)雜的,這里把具體代碼分享給大家,方便大家為 image 設(shè)置有效的 version 頭以及正確使能這個雙程序可交替啟動特性。
判斷邏輯代碼主要意思是僅當(dāng) image L 的版本不是 0xFFFFFFFF 且 image H 的版本是有效的(img_ver 高低16bit符合取反關(guān)系)情況下,如果 image L 版本無效或者 image L 版本有效但比 image H 版本低,則物理地址靠后的 image H 優(yōu)先啟動。除此以外其余情況,一律是物理地址靠前的 image L 優(yōu)先啟動。
uint32_t image_l_base = FlexSPIx_AMBA_BASE
uint32_t image_h_base = FlexSPIx_AMBA_BASE + FLEXSPI_NOR_SEC_IMAGE_OFFSET
uint32_t get_image_index(void)
{
uint32_t redundant_boot = ((SRC->GPR[9] & 0x0C000000) >> 26);
static uint32_t image_index[] = { 0, 0 };
img_ver_t image_l_version = *(img_ver_t *)(image_l_base + 0x600);
img_ver_t image_h_version = *(img_ver_t *)(image_h_base + 0x600);
if ((image_l_version.version != 0xFFFFu || image_l_version.inversion != 0xFFFFu) &&
((0xFFFFu & image_h_version.version) == (0xFFFFu ^ image_h_version.inversion)) &&
((0xFFFFu & image_l_version.version) != (0xFFFFu ^ image_l_version.inversion) || (image_l_version.version < image_h_version.version)))
{
image_index[0] = 1;
}
else
{
image_index[1] = 1;
}
return image_index[redundant_boot];
}
痞子衡在MIMXRT1170-EVK 開發(fā)板上對image 版本設(shè)置情況也做了比較全面的實(shí)測,測試結(jié)果如下:
四、一些關(guān)于image的注意事項
- 雖然文中所有的測試均是針對 XIP image,但這個冗余程序/雙程序可交替啟動特性對于 Non-XIP image 也同樣適用。
- 如果是 XIP image,其鏈接地址不一定要固定在偏移 0x2000 處,因?yàn)?IVT 的存在,其是可以鏈接在偏移 0x2000 之后的任意位置的。
- 如果是 Non-XIP image,在 SDK 包里無法直接生成含啟動頭的 Non-XIP image binary,這時候可以先使用 MCUBootUtility 主界面的 All-In-One 操作下載一次 image,再通過通用編程器界面 Read 操作讀回來便是含啟動頭的 Non-XIP image binary。
審核編輯 :李倩
-
冗余
+關(guān)注
關(guān)注
1文章
112瀏覽量
20695 -
串行
+關(guān)注
關(guān)注
0文章
237瀏覽量
34504
原文標(biāo)題:i.MX RT1170上串行NOR Flash雙程序可交替啟動設(shè)計
文章出處:【微信號:NXP_SMART_HARDWARE,微信公眾號:恩智浦MCU加油站】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
基于恩智浦i.MX RT芯片內(nèi)部RAM運(yùn)行LVGL工程

如何實(shí)現(xiàn)安卓與恩智浦i.MX RT1170的無線投屏與控制

i.MX RT系列中FlexSPI DQS信號引腳配置GPIO方法

為什么無法在MIMXRT1170-EVK上調(diào)試XIP NOR閃存?
如何禁用i.MX RT1170 MCU中的M4內(nèi)核?
在IMX RT1170的POR期間,PWM引腳變?yōu)楦唠娖绞窃趺椿厥拢?/a>
在i.MX RT 1176上正常運(yùn)行代碼時與使用IAR調(diào)試代碼時存在一些奇怪的差異,為什么?
在i.MX RT處理器上使用PXP實(shí)現(xiàn)縮放和旋轉(zhuǎn)組合操作

恩智浦i.MX 91生態(tài)合作伙伴最新開發(fā)板資源
基于NXP MCXA153 MCU實(shí)現(xiàn)RT-Thread的MTD NOR Flash驅(qū)動

NXP專為邊緣AI打造的i.MX RT700跨界MCU到底強(qiáng)在哪?

恩智浦推出全新i.MX RT700跨界MCU系列
i.MX Linux開發(fā)實(shí)戰(zhàn)指南—基于野火i.MX系列開發(fā)板
恩智浦i.MX RT1170 uSDHC eMMC啟動時間

評論