痞子衡嵌入式:自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動
阿新 • • 發佈:2021-02-26
----
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家分享的是**自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動**。
接著上篇文章 [《瞭解i.MXRT1060系列ROM中序列NOR Flash啟動初始化流程優化點》](https://www.cnblogs.com/henjay724/p/14103419.html) 繼續聊。對於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功能設計。
![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_InitFlexSPI_overall_v2.PNG)
### 二、開啟自動識別功能
Flash自動識別功能開啟位在fuse_0x450[0](或者BT_CFG[0]引腳),預設是不使能的。想要開啟這個功能需要拉高相關CFG引腳或者燒寫相應Fuse位。
```text
fuse 0x450[0] - FLASH_AUTO_PROBE_EN,Flash自動識別功能開啟
```
![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_AutoProbe_fusemap_autoprobe_en.PNG)
### 三、自動識別依賴的配置
雖說是Flash自動識別,但其實還是依賴Fuse裡一些配置的,一共有如下四處配置,BootROM會根據這四處配置去進入Flash自動識別程式從而得到一個匹配的FDCB配置塊,所以其實這個功能更準確的說法應該是FDCB自動生成。
```text
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週期
```
![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_AutoProbe_fusemap_autoprobe_type.PNG)
-
![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_AutoProbe_fusemap_autoprobe_freq.PNG)
關於FDCB自動生成,其實就是利用了BootROM裡那一套經典的FlexSPI NOR驅動(詳見痞子衡之前的文章 [《利用i.MXRT1xxx系列ROM提供的FlexSPI driver API可輕鬆IAP》](https://www.cnblogs.com/henjay724/p/13202824.html) 裡的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引數組合規則如下表所示:
### 四、自動識別功能測試
瞭解了這個自動識別功能細節之後,讓我們在MIMXRT1060-EVK上測試一下,首先需要將BT_CFG[0]引腳拉高(R325電阻焊上去,預設DNP),這就開啟了自動識別功能。
![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_AutoProbe_bt_cfg0.PNG)
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](https://github.com/JayHeng/NXP-MCUBootUtility) 工具將其一鍵下載進Flash中,下載完成後注意擦除掉Flash前1KB的資料(即沒有FDCB),切換啟動模式後復位板子,可以看到LED正常閃爍,說明自動識別功能生效了。
![](http://henjay724.com/image/cnblogs/i.MXRT1060_ROM_AutoProbe_no_FDCB.PNG)
如果我們將MIMXRT1060-EVK上的Flash改為S26KS512SDPBHI02,這是一顆典型的1.8V HyperFlash,那麼還需要將BT_CFG2[2:0]設為 3'b010 - HyperFlash 1V8才能正常自識別。
至此,自識別特性(Auto Probe)可以讓i.MXRT1060無需FDCB也能從NOR Flash啟動痞子衡便介紹完畢了,掌聲在哪裡~~~
### 歡迎訂閱
文章會同時釋出到我的 [部落格園主頁](https://www.cnblogs.com/henjay724/)、[CSDN主頁](https://blog.csdn.net/henjay724)、[知乎主頁](https://www.zhihu.com/people/henjay724)、[微信公眾號](http://weixin.sogou.com/weixin?type=1&query=痞子衡嵌入式) 平臺上。
微信搜尋"__痞子衡嵌入式__"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
![](http://henjay724.com/image/github/pzhMcu_qrcode_258x
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 | 未定義 |