大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是使能i.MXRT1050, 1060 Hab簽名或加密啟動時App連結在片內SRAM的限制。
最近有客戶反饋,在 RT1060 上測試 Non-XIP 程式啟動,如果程式體部分連結進 0x20280000 地址之後的片內 OCRAM 區域(這部分是由 FlexRAM 分配出來的,預設 256KB)且在晶片 HAB 使能時(即包含驗籤流程)會啟動失敗,但是如果不使能 HAB,則啟動正常。
這個問題其實是晶片 BootROM 裡的特殊限制,並且這個特殊限制只在 i.MXRT1xxx 家族最早期的兩顆型號 RT1050/1060 上存在,其餘型號沒有這個限制。今天痞子衡就和大家聊聊這個話題:
一、Non-XIP App一般連結限制
我們先開啟 SDK 裡最經典的工程 \SDK_2_14_0_MIMXRT1060-EVKB\boards\evkbmimxrt1060\demo_apps\hello_world\iar,工程預設包含了 6 種 build(其實對應了工程目錄下的 6 個連結檔案):
痞子衡做了一個表格,對比了這 6 個不同 Build 的差異,本質上就是程式 RO 和 RW 段連結位置的不同導致晶片 BootROM 啟動程式時需要區別對待,XIP 程式不需要搬移,Non-XIP 程式需要搬移到目標地址(片內 SRAM 或者片外 RAM)。
我們知道 i.MX RT 系列程式要想離線啟動都是需要加 《IVT 啟動頭》 的,因為 IVT 等啟動頭的存在,程式中斷向量表起始位置需要做一點犧牲(讓出最前面的位置給啟動頭),這也是下表中有些 build 不能被 BootROM 載入啟動的原因,因為沒有讓出最前面的位置。
Build名 | Readonly位置 | 中斷向量表首地址 | Readwrite位置 | 是否XIP | BootROM能否載入啟動 |
---|---|---|---|---|---|
debug/release | 片內ITCM | 0x00000000 | 片內DTCM | 否 | 否 |
flexspi_nor_debug/release | 片外NOR Flash | 0x60002000 | 片內DTCM | 是 | 能 |
sdram_debug/release | 片內ITCM | 0x00000000 | 片外SDRAM | 否 | 否 |
flexspi_nor_sdram_debug/release | 片外NOR Flash | 0x60002000 | 片外SDRAM | 是 | 能 |
sdram_txt_debug/release | 片外SDRAM | 0x80000000 | 片內OCRAM | 否 | 否 |
ram_0x1400_debug/release | 片內ITCM | 0x00001400 | 片內DTCM | 否 | 能 |
對於序列 NOR Flash 的 XIP build,程式中斷向量表在 SDK 裡預設是在偏移 0x2000 之後開始存放的(即 0x60002000),這個偏移只是一個推薦最佳值,但並不是定死的,實際上偏移最小可以是 0x1400,最大不設限(視 Flash 容量而定),這裡的設計很靈活,因為這個偏移地址會被存在固定偏移 0x1000 開始的 IVT 啟動頭裡,所以 BootROM 總能找到程式位置去跳轉執行。
對於 Non-XIP build,其在 SDK 裡沒法直接包含啟動頭,所以我們需要藉助恩智浦官方 MCUXpresso Secure Privisioning Tool 或者痞子衡設計的 MCUBootUtility 工具來一鍵新增相應啟動頭去下載到啟動裝置裡。開發者只需要做一件事,就是編出一個程式可執行檔案(elf/srec/hex/bin)給工具即可,這裡唯一需要關心的就是偏移地址問題。跟 XIP build 不同的是,原理上 Non-XIP 程式在目標地址(片內 SRAM 或者片外 RAM)連結時並不需要讓出最前面的位置,畢竟啟動頭是存在非易失性啟動裝置裡的,但是 BootROM 在搬移程式時總是會連著啟動頭一起搬移到目標地址,這是 BootROM 的程式設計限制,所以 Non-XIP 程式也不得不讓出目標地址的最前面部分。對於 NOR 型啟動裝置,最小偏移是 0x1400;對於 NAND 型啟動裝置最小偏移是 0x800;痞子衡建議一律按 SDK 裡為 XIP build 推薦的統一 0x2000 偏移最省事。基於此我們在修改 IAR 相應連結檔案時 m_interrupts_start 值可按如下修改:
連結在片內ITCM | 連結在片內DTCM | 連結在片外PSRAM/HyperRAM | 連結在片外SDRAM |
---|---|---|---|
0x00002000 | 0x20002000 | 0x60002000/0x70002000 | 0x80002000 |
上表中痞子衡特意沒有列出片內 OCRAM 的情況,原因是這裡有點特殊,因為 OCRAM 的前 32KB (0x20200000 - 0x20207FFF)被 BootROM 用作 RW 區了。對於 Non-XIP 程式,RO 段不能連結在這裡,否則 BootROM 在做程式複製時會沖掉自己的 RW 區導致自己程式異常,自顧都不暇還如何能正常載入使用者程式。所以對於 OCRAM 的情況,我們在連結程式時要減去前 32KB 空間再按上面的經驗做偏移,所以 m_interrupts_start 應設為 0x2020A000。
- Note: 不同 i.MX RT 型號 BootROM 在 OCRAM 裡佔用的起始位置和空間大小可能是不同的,具體需檢視晶片參考手冊 System Boot 章節。
二、Non-XIP App在使能HAB後的連結限制
上一小節裡,我們總結出了 Non-XIP 程式的兩個一般連結限制:讓出最前面給啟動頭的位置,讓出 BootROM 佔據的 OCRAM 空間。這對於不簽名的程式啟動來說就夠了,但是如果使能了 HAB 之後,必須加驗簽過程,情況有所變化了。痞子衡這裡就不賣關子了,直接給出如下 HAB 識別區域表,這表裡 RT1050/RT1060 一些空間標了紅,原因是它們的 BootROM 分別對最大 TCM 的後 64KB 和最大 OCRAM 後 512KB 空間有所保留,沒有全部開放給 HAB 驗籤。其餘 RT 型號,是否使能 HAB 對程式連結無影響。
這個限制對於預設 FlexRAM 配置的 RT1050 倒是沒有影響,但是 RT1060 的預設 256KB FlexRAM - OCRAM 0x20280000 - 0x202BFFFF 空間從此就不能放含簽名的 Non-XIP 程式了。
晶片 | 片內SRAM區域 | BootROM佔用區 | HAB識別區域 |
---|---|---|---|
i.MXRT117x M7 | ITCM 512KB(0x00000000 - 0x0007FFFF) DTCM 512KB(0x20000000 - 0x2007FFFF) OCRAM 2MB (0x20200000 - 0x203FFFFF) |
OCRAM 48KB(0x20240000 - 0x2024BFFF) | ITCM 512KB(0x00000000 - 0x0007FFFF) DTCM 512KB(0x20000000 - 0x2007FFFF) OCRAM 256KB(0x20200000 - 0x2023FFFF) OCRAM 1744KB(0x2024C000 - 0x203FFFFF) |
i.MXRT116x M7 | ITCM 512KB(0x00000000 - 0x0007FFFF) DTCM 512KB(0x20000000 - 0x2007FFFF) OCRAM 1MB (0x20200000 - 0x202FFFFF) |
OCRAM 48KB(0x20240000 - 0x2024BFFF) | ITCM 512KB(0x00000000 - 0x0007FFFF) DTCM 512KB(0x20000000 - 0x2007FFFF) OCRAM 256KB(0x20200000 - 0x2023FFFF) OCRAM 720KB(0x2024C000 - 0x202FFFFF) |
i.MXRT106x | ITCM 512KB (0x00000000 - 0x0007FFFF) DTCM 512KB (0x20000000 - 0x2007FFFF) OCRAM 1MB (0x20200000 - 0x202FFFFF) |
OCRAM 32KB (0x20200000 - 0x20207FFF) | ITCM 512KB (0x00000000 - 0x0007FFFF) DTCM 512KB (0x20000000 - 0x2007FFFF) OCRAM 480KB(0x20208000 - 0x2027FFFF) |
i.MXRT105x | ITCM 512KB (0x00000000 - 0x0007FFFF) DTCM 512KB (0x20000000 - 0x2007FFFF) OCRAM 512KB(0x20200000 - 0x2027FFFF) |
OCRAM 32KB (0x20200000 - 0x20207FFF) | ITCM 448KB (0x00000000 - 0x0006FFFF) DTCM 448KB (0x20000000 - 0x2006FFFF) OCRAM 480KB(0x20208000 - 0x2027FFFF) |
i.MXRT104x | ITCM 512KB (0x00000000 - 0x0007FFFF) DTCM 512KB (0x20000000 - 0x2007FFFF) OCRAM 512KB(0x20200000 - 0x2027FFFF) |
OCRAM 32KB (0x20200000 - 0x20207FFF) | ITCM 480KB (0x00000000 - 0x00077FFF) DTCM 480KB (0x20000000 - 0x20077FFF) OCRAM 480KB(0x20208000 - 0x2027FFFF) |
i.MXRT102x | ITCM 256KB (0x00000000 - 0x0003FFFF) DTCM 256KB (0x20000000 - 0x2003FFFF) OCRAM 256KB(0x20200000 - 0x2023FFFF) |
OCRAM 32KB (0x20200000 - 0x20207FFF) | ITCM 224KB (0x00000000 - 0x00037FFF) DTCM 224KB (0x20000000 - 0x20037FFF) OCRAM 224KB(0x20208000 - 0x2023FFFF) |
i.MXRT1015 | ITCM 128KB (0x00000000 - 0x0001FFFF) DTCM 128KB (0x20000000 - 0x2001FFFF) OCRAM 128KB(0x20200000 - 0x2021FFFF) |
OCRAM 32KB (0x20200000 - 0x20207FFF) | ITCM 96KB (0x00000000 - 0x00017FFF) DTCM 96KB (0x20000000 - 0x20017FFF) OCRAM 96KB (0x20208000 - 0x2021FFFF) |
i.MXRT1011 | ITCM 128KB (0x00000000 - 0x0001FFFF) DTCM 128KB (0x20000000 - 0x2001FFFF) OCRAM 128KB(0x20200000 - 0x2021FFFF) |
OCRAM 22KB (0x20200000 - 0x202057FF) | ITCM 96KB (0x00000000 - 0x00017FFF) DTCM 96KB (0x20000000 - 0x20017FFF) OCRAM 106KB(0x20205800 - 0x2021FFFF) |
至此,使能i.MXRT1050,1060 Hab簽名或加密啟動時App連結在片內SRAM的限制痞子衡便介紹完畢了,掌聲在哪裡~~~
歡迎訂閱
文章會同時釋出到我的 部落格園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。