痞子衡嵌入式:自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動
- 2021 年 2 月 25 日
- 筆記
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動。
接著上篇文章 《了解i.MXRT1060系列ROM中串列NOR Flash啟動初始化流程優化點》 繼續聊。對於i.MXRT1050為代表的第一代型號,Flash里必須要放置用戶FDCB配置塊,存儲在這顆Flash里的App才能被正常啟動。這個設計在i.MXRT1060為代表的第二代型號里有了改良,BootROM中增加了一個新特性,叫Auto Probe(自動識別),這個特性可以在不放置用戶FDCB配置塊的情況下App也能被正常啟動。今天痞子衡就跟大家好好聊聊這個特性:
- 備註:本文主角是i.MXRT1060,內容也基本適用i.MXRT1170,僅細節微小差別。
一、自動識別功能意義
先從整體FlexSPI NOR啟動初始化流程圖上來看,自動識別(步驟X)被插入了初始化流程中,安排在FlexSPI外設第一次初始化之後,BootROM此時會儘力嘗試去識別外接的Flash資訊,如果識別成功則會得到一個自識別FDCB配置塊,然後直接跳到FlexSPI NOR第二次初始化流程。如果識別失敗,則繼續按原來方式嘗試讀取用戶FDCB配置塊來獲取外接Flash資訊。
有了Flash自動識別功能,BootROM可以不必再強制客戶在Flash里放置FDCB塊,很多時候客戶未必特別了解Flash以及這個FDCB塊結構,不用提供FDCB可以為客戶省去很多耗費在Flash上的研發時間,客戶僅需要全心關注App功能設計。
二、開啟自動識別功能
Flash自動識別功能開啟位在fuse_0x450[0](或者BT_CFG[0]引腳),默認是不使能的。想要開啟這個功能需要拉高相關CFG引腳或者燒寫相應Fuse位。
fuse 0x450[0] - FLASH_AUTO_PROBE_EN,Flash自動識別功能開啟
三、自動識別依賴的配置
雖說是Flash自動識別,但其實還是依賴Fuse里一些配置的,一共有如下四處配置,BootROM會根據這四處配置去進入Flash自動識別程式從而得到一個匹配的FDCB配置塊,所以其實這個功能更準確的說法應該是FDCB自動生成。
fuse 0x450[10:8] - FLASH_TYPE,決定當前連接的Flash類型
fuse 0x450[3:2] - FLASH_PROBE_TYPE,當FLASH_TYPE=0/1/7時,取代FLASH_TYPE來決定當前連接的Flash類型
fuse 0x6e0[3:1] - xSPI_FLASH_BOOT_FREQUENCY,決定FlexSPI工作頻率
fuse 0x6e0[11:8] - xSPI_FLASH_DUMMY_CYCLE,配置Flash讀訪問時序前需要的Dummy周期
關於FDCB自動生成,其實就是利用了BootROM里那一套經典的FlexSPI NOR驅動(詳見痞子衡之前的文章 《利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可輕鬆IAP》 里的2.2和2.3節),自動識別就是根據配置值組合出一個匹配的 serial_nor_config_option_t option參數,經由flexSpiNorDriver->get_config()函數運行後便可得到完整的flexspi_nor_config_t config結構體(即FDCB)。
serial_nor_config_option_t option參數組合規則如下表所示:
FLASH TYPE | FLASH PROBE TYPE | option值 | 備註 |
---|---|---|---|
3’b000 3’b111 |
2’b00 | 0xc0000001 | 可進一步dummy cycle設置 |
2’b01 | 0xc0603001 | ||
2’b10 | 0xc0403001 | ||
2’b11 | 0xc0803001 | ||
3’b001 | 2’b00 | 0xc0100001 | 可進一步dummy cycle設置 |
2’b01 | 0xc0700001 | ||
2’b10 | 0xc0503001 | ||
2’b11 | 0xc0903001 | ||
3’b010 | N/A | 0xc0233001 | |
3’b011 | N/A | 0xc0333001 | |
3’b100 | N/A | 0xc0433001 | |
3’b101 | N/A | 0xc0633001 | |
3’b110 | N/A | 未定義 |
四、自動識別功能測試
了解了這個自動識別功能細節之後,讓我們在MIMXRT1060-EVK上測試一下,首先需要將BT_CFG[0]引腳拉高(R325電阻焊上去,默認DNP),這就開啟了自動識別功能。
MIMXRT1060-EVK上默認連接的是IS25WP064AJBLE,這是一顆經典的133MHz QuadSPI NOR Flash,Fuse里的初始自動識別配置(FLASH_TYPE = 000 – Device supports 3B read,FLASH BOOT FREQ = 0 – 100MHz)適合這顆Flash,因此無需再燒錄任何Fuse或拉高其他BT_CFG[x]引腳。
隨便選一個常式 \SDK\boards\evkmimxrt1060\demo_apps\led_blinky 。編譯這個 led_blinky 工程(可以選擇 flexspi_nor_debug build,工程選項里XIP_BOOT_HEADER_ENABLE=1現在可以去掉了),使用 NXP-MCUBootUtility 工具將其一鍵下載進Flash中,下載完成後注意擦除掉Flash前1KB的數據(即沒有FDCB),切換啟動模式後複位板子,可以看到LED正常閃爍,說明自動識別功能生效了。
如果我們將MIMXRT1060-EVK上的Flash改為S26KS512SDPBHI02,這是一顆典型的1.8V HyperFlash,那麼還需要將BT_CFG2[2:0]設為 3’b010 – HyperFlash 1V8才能正常自識別。
至此,自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動痞子衡便介紹完畢了,掌聲在哪裡~~~
歡迎訂閱
文章會同時發布到我的 部落格園主頁、CSDN主頁、知乎主頁、微信公眾號 平台上。
微信搜索”痞子衡嵌入式“或者掃描下面二維碼,就可以在手機上第一時間看了哦。