測一測i.MXRT1170 Raw NAND啟動時

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1170Raw NAND啟動時間。

關於 i.MXRT1170 這顆劃時代的 MCU,痞子衡去年 10 月在其剛發佈的時候,專門寫過一篇文章介紹過其特點(詳見 《終於可以放開聊一聊 i.MXRT1170 這顆劃時代 MCU 了》),眼看著其上市日期越來越近了,恩智浦軟硬件技術支持團隊也正在緊鑼密鼓地開發 SDK 以及參考設計。因為官方首次在 i.MXRT1170 EVK 板上(Rev.B)放了一片旺宏的 Raw NAND芯片,而 i.MXRT 當然是支持從 Raw NAND 啟動的,因此痞子衡打算為大家測一測 Raw NAND 的啟動時間(這裡指在 ITCM 執行,暫不考慮在 SDRAM 執行)。

一、準備工作

1.1 知識儲備

在開始測試之前,你需要認真讀一下痞子衡的舊文 《恩智浦 i.MX RT1xxx 系列 MCU 啟動那些事(8)- 從 Raw NAND 啟動》,對 i.MXRT 從 Raw NAND 啟動的原理有一個充分認識。

Raw NAND 啟動不同於你最熟悉的 Serial NOR 啟動,由於 NAND 訪問的特殊性(僅能按 Page 讀,且允許壞塊),因此其僅支持 Non-XIP Application(即需要把 Application image 從 NAND 中全部拷貝出來,放到 RAM 中執行),無法原地執行。這個拷貝工作就由芯片內部的 BootROM 來完成,為了讓 BootROM 順利完成拷貝工作,我們需要在 NAND 中放一些特殊數據(即下面的 FCB, DBBT, IVT)。

FCB 永遠放在 NAND 的第一個 block 裡的固定位置,BootROM 首先從 NAND 中讀取 FCB(此時是利用 eFuse 0x940 和 0xC80 裡的簡化時序配置選項),FCB 中含有三類信息:用戶設置的完整時序配置數據(可選的)、DBBT 位置,IVT 位置。BootROM 首先會檢查是否存在完整時序配置數據,如果有,則使用這個數據重新配置 NAND 訪問時序。然後 BootROM 會繼續獲取 DBBT 數據,獲知當前 NAND 的壞塊信息,接下來便是根據 IVT 信息獲取 Application 數據完成拷貝(拷貝過程中需要避開壞塊)。

测一测i.MXRT1170 Raw NAND启动时

1.2 時間界定

說到啟動時間的界定,其實無非是找到時間起點以及時間終點。

時間起點很好辦,根據 i.MXRT1170 芯片 POR 信號變化即可(下圖中的 RST_TGTMCU_B 的上升沿),也就是芯片開始上電為起點。

测一测i.MXRT1170 Raw NAND启动时

時間終點稍微有點難辦,如果監測 Raw NAND 信號(比如 CE#最後一個上沿)有點難抓,也不夠精準,畢竟 BootROM 拷貝完所有 Application image 數據後是否還會做一些校驗工作才會跳轉不得而知,所以還是以執行到 Application 為準。到了 Application 的執行就簡單了,在 Application 里加個 GPIO 翻轉(比如點燈)即可,我們只需抓取這個 GPIO 的信號變化(抓下圖中 R1855 的上升沿)。

测一测i.MXRT1170 Raw NAND启动时

1.3 製作應用程序

現在我們開始製作測試用的 Non-XIP Application,以 \\SDK_xxx_MIMXRT1170-

EVK\\boards\\evkmimxrt1170\\demo_apps\\led_blinky\\cm7\\ 下的工程為基礎,但需要做一些修改。

痞子衡以 IAR 工程示例,首先需要選中 debug build(release 也行),這個 build 即是在 ITCM 中執行的 Non-XIP 版本,而且其鏈接文件裡的 m_interrupts_start 也需要從 0x00000000 修改為 0x00002000(這裡如果不明白的話,繼續回去看痞子衡寫的 Raw NAND 啟動文章)。

测一测i.MXRT1170 Raw NAND启动时

這個工程裡的 led_blinky.c 裡已經有 GPIO 翻轉代碼了,但是位置在 main函數里,為了得到儘量準確的啟動時間,我們應該把 GPIO 翻轉的代碼提前,下面是程序 Reset_Handler 代碼,原則上我們應該要在這裡加彙編,但是為了簡單起見,我們也可以在 SystemInit函數里加 C 代碼(痞子衡認為在 data/bss 段初始化之前就可以了)。

<code>        PUBWEAK Reset_Handler
SECTION .text:CODE:REORDER:NOROOT(2)
Reset_Handler
CPSID I ; Mask interrupts
LDR R0, =0xE000ED08
LDR R1, =__vector_table
STR R1, [R0]
LDR R2, [R1]
MSR MSP, R2
LDR R0, =SystemInit
BLX R0
CPSIE I ; Unmask interrupts
LDR R0, =__iar_program_start
BX R0
/<code>
测一测i.MXRT1170 Raw NAND启动时

編譯後可以得到一個 17732 bytes 的 Application(可以生成 .srec 格式,方便後面下載),但是我們知道 Raw NAND 啟動時間跟 Application 長度是成正比的(主要耗時就是在拷貝上),所以我們還需要再製作一個稍微大一些的 Application,可以直接在代碼里加上如下 const 數組定義,並且在 IAR 的 Option/Linker/Input 裡的 Keep symbols 里加上 s_dummyBuffer,防止這個數組被優化掉。

<code>const uint8_t s_dummyBuffer[1024*230] = {0};
/<code>
测一测i.MXRT1170 Raw NAND启动时

1.4 下載應用程序

應用程序的下載需藉助痞子衡開發的 NXP-MCUBootUtility 工具(v2.2 版本及以上),將 i.MXRT 啟動模式設到 SDP 模式(EVK 上 SW1 撥碼開關設為 4'b0001),然後給板子上電。軟件的使用不予贅述,NAND 具體配置如下即可,後面的測試我們只需要更改 ONFI Timing Mode 這一個參數。

Note: 這個工具會自動生成 FCB(包含完整 NAND 時序配置), DBBT, IVT 並將其和 Application 一起下載進 Raw NAND 中

测一测i.MXRT1170 Raw NAND启动时

程序下載完成後,將 i.MXRT 啟動模式設到 Internal Boot 模式(EVK 上 SW1 撥碼開關設為 4'b0010),並且將啟動設備設為 Raw NAND(EVK 上 SW2 撥碼開關設為 10'b0000010000),斷電重啟你應該就可以看到 LED 燈會亮,這代表 Raw NAND 啟動成功了。

1.5 示波器抓取信號

一切準備就緒,可以用示波器抓 Raw NAND 啟動時間了。除了通道一監測 POR 信號,通道三監測 LED GPIO 信號,為了更直觀地看啟動過程,痞子衡特地加了通道二來監測 NAND_CE#信號,這樣可以看到 Application 拷貝過程。

测一测i.MXRT1170 Raw NAND启动时

二、開始測試

2.1 影響因素

2.1.1 App 長度

App 的長度是影響啟動時間的第一因素。痞子衡在前面 1.3 節 製作應用程序裡,已經制作了兩個不同長度的 App 用於測試。

2.1.2 NAND 訪問模式

NAND 訪問模式是影響啟動時間的第二因素。SEMC 支持的 NAND 訪問模式一共兩種,分別是 IPG CMD 模式和 AXI CMD 模式,前者是應用程序手動發命令去一次讀取 4byte 數據到 SEMC 數據寄存器,然後再從寄存器中取數據;後者是應用程序訪問指定的 AXI 空間(假定也是取 4byte),由 SEMC 自動發命令讀取 4byte 並放到對應 AXI 映射空間裡。

NXP-MCUBootUtility 工具裡所依賴的 flashloader 固定使用 IPG CMD 模式,因此想切換到 AXI CMD 模式,需要從 SDK/middleware/mcu-boot 中獲取 flashloader 源碼,修改源碼(在 semc_nand_mem_config()函數中做如下修改)後重新編譯使用。

测一测i.MXRT1170 Raw NAND启动时

使用修改後的 flashloader 程序下載完成 Application 之後,需要在回讀的 image 數據中偏移 0x109 的地址查看數據(0x01 代表 AXI,0x00 代表 IPG)。

测一测i.MXRT1170 Raw NAND启动时

痞子衡繼續使用示波器抓取 NAND_RE#信號如下:

這是 IPG CMD 模式下的時序(ONFI timing mode5):

测一测i.MXRT1170 Raw NAND启动时

這是 AXI CMD 模式下的時序(ONFI timing mode5):

测一测i.MXRT1170 Raw NAND启动时

從上述時序上看,AXI CMD 模式讀取數據明顯比 IPG CMD 模式更高效,每 4byte 訪問之後的間隔時間大大縮短。

2.1.3 ONFI Timing Mode

ONFI Timing Mode 是影響啟動時間的第三因素。NXP-MCUBootUtility 工具中支持更改 ONFI Timing Mode(主要是將設置寫進 FCB),痞子衡查了下 EVK 板上這顆 NAND 芯片,能支持 mode0 - mode5 一共 6 種模式,我們就先來看看最慢的 mode0 和最快的 mode5 是否設置生效。在程序下載完成之後,需要在回讀的 image 數據中偏移 0x153 的地址查看數據(0x01 代表 mode0,0x06 代表 mode5)。

测一测i.MXRT1170 Raw NAND启动时

Raw NAND 訪問是通過 SEMC 模塊實現的,SEMC 一次會從 NAND 讀取 4byte 放到內部 32bit 數據寄存器中,痞子衡使用示波器抓取 NAND_RE#信號如下:

這是 ONFI Timing Mode0 下的時序:

测一测i.MXRT1170 Raw NAND启动时

這是 ONFI Timing Mode5 下的時序:

测一测i.MXRT1170 Raw NAND启动时

從上述時序上看,ONFI Timing Mode 設置是生效的,mode5 耗時確實比 mode0 短一些,與 ONFI 1.0 手冊裡規定的數值基本是吻合的。

2.2 測試結果

前面分析完了影響因素,現在到了公佈結果的時候了,痞子衡基於前面的影響因子組合一共做了 8 個測試,結果如下表所示。總之一句話,想要最快的啟動時間,設為 AXI 訪問模式以及 ONFI Timing Mode5 即可,另外如果對啟動時間敏感(比如 Auto 應用),不妨做兩級啟動(Boot+App),Boot 儘量小,App 可以很大,Boot 起來之後去做一些啟動任務(響應 CAN,點亮 LCD 屏),然後由 Boot 再去慢慢加載 App。

<table> <tbody> NAND 訪問模式ONFI 時序模式Application 長度啟動時間 IPG CMDmode 0 - 10MHz17732 bytes40.58ms IPG CMDmode 5 - 50MHz17732 bytes38.90ms IPG CMDmode 0 - 10MHz253252 bytes172.3ms IPG CMDmode 5 - 50MHz253252 bytes164.3ms
AXI CMDmode 0 - 10MHz17732 bytes32.8ms AXI CMDmode 5 - 50MHz17732 bytes32.6ms AXI CMDmode 0 - 10MHz253252 bytes104.9ms AXI CMDmode 5 - 50MHz253252 bytes78.86ms/<tbody>/<table>

測試結果波形圖較多,痞子衡且放一張(AXI, mode0, 17732bytes)給大家看看吧。

测一测i.MXRT1170 Raw NAND启动时

至此,恩智浦 i.MX RT1170 Raw NAND 啟動時間痞子衡便介紹完畢了,掌聲在哪裡~~~


分享到:


相關文章: