1. 程式人生 > >痞子衡嵌入式:導致序列NOR Flash在i.MXRT下無法正常下載/啟動的常見因素之SFDP

痞子衡嵌入式:導致序列NOR Flash在i.MXRT下無法正常下載/啟動的常見因素之SFDP

----   大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是**導致序列NOR Flash在i.MXRT下無法正常下載/啟動的常見因素之SFDP**。   i.MXRT系列MCU釋出已兩年多了,基於i.MXRT的客戶產品也越來越多,可以說是全面開花了。痞子衡作為i.MXRT產品線的系統應用工程師,早期的時候還可以盡情做參考設計,現在基本大量時間都被客戶支援佔據了。   因為i.MXRT系列都沒有內建Flash(RT1064, RT1024等SIP型號除外),因此為其搭配一塊序列NOR Flash去啟動是客戶專案的頭等大事,而序列NOR Flash廠商非常多,客戶選擇餘地很大,因此我們不得不與客戶一起同茫茫Flash型號打交道,痞子衡也常常調侃自己已淪為Flash測試工程師。   痞子衡在支援客戶解決序列NOR Flash下載啟動問題過程中主要遇到幾個常見因素,這幾個因素可能會影響Flash在i.MXRT下無法正常使用,今天痞子衡就重點跟大家聊聊SFDP這個因素。 #### 一、SFDP標準簡介   SFDP又叫JESD216,是JEDEC協會於2011年開始推出的序列Flash介面標準,類似於CFI在並行NOR Flash上的標準。SFDP發展至今已經誕生了如下版本:
時間 標準
2011 JESD216
2013.07 JESD216A
2014.05 JESD216B
2018.08 JESD216C
2018.11 JESD216D
2019.08 JESD216D.01
  我們知道序列Flash廠商非常多,在2011年之前,大家都是各自玩,沒有明確的統一標準(雖然幾個領頭廠商起了示範作用,但各家在具體細節上還是會有差異),這對於Flash使用者來說就比較麻煩了,需要把各家Flash手冊仔細研讀,不能漏掉任何一個細節。   隨著序列Flash市場需求越來越強烈,各個廠商也在鉚足勁給自家Flash加特性,這時候JEDEC站出來了,拉了幾個主要的Flash廠商一起訂個SFDP標準,有了這個標準,Flash使用者就方便多了,尤其是軟體設計人員,開發Flash驅動從此有標準可依,甚至一套驅動可以用在所有支援SFDP標準的Flash上,實現各廠商Flash之間輕鬆切換。 #### 二、部分Flash型號不支援SFDP   因為SFDP標準是2011年才開始推出,新興Flash廠商(比如兆易創新)的產品基本都是支援SFDP標準的,而部分老牌Flash廠商(比如華邦)則存在老型號和新型號共存的問題。老型號都是2011年前設計生產的,不支援SFDP;2011年之後設計的新型號基本都是支援SFDP的。   華邦目前是序列Flash第一大廠商,痞子衡遇到好幾個i.MXRT客戶,選用的華邦NOR Flash,但Flash裡不支援SFDP,因此客戶支援稍微複雜一些。關於SFDP支援問題,痞子衡特別聯絡過華邦銷售人員,得到了他們的答覆,華邦NOR Flash家族裡 **W25QxxJV** 和 **W25QxxJW** 系列都是新型號,全部支援SFDP;而 **W25QxxFV** 和**W25QxxFW** 系列屬於老型號,大多沒有SFDP,但是也有如下部分型號支援SFDP: ![](http://henjay724.com/image/cnblogs/i.MXRT_Serial_NOR_Flash_major_Issue_Winbond_Legacy_parts_with_SFDP.PNG)   雖然我們可以在後續開發的過程中也能正常使用非SFDP標準的Flash以及能通過讀SFDP命令查詢出晶片是否支援SFDP,但最好在Flash選型前就能明確知道其SFDP情況,這個需要跟Flash廠商銷售溝通好。總之,痞子衡推薦大家選用各廠商支援SFDP標準的新型號。 #### 三、不支援SFDP的Flash如何適用i.MXRT下載   如果你認真看過痞子衡寫的i.MXRT啟動系列文章,你應該知道i.MXRT之所以能夠支援市面上幾乎所有的序列NOR Flash啟動是靠的512 byte的FDCB結構體,這個結構體原型即flexspi_nor_config_t,它可以描述啟動所需的所有Flash引數資訊。   i.MXRT在啟動時首先會用1bit SDR時序模式去獲取使用者放在Flash開始或偏移0x400處(因i.MXRT型號而異)的FDCB,然後根據FDCB裡的資訊去進一步配置啟動,因此Flash裡有無SFDP其實不影響啟動,只要在FDCB裡描述清楚即可。   但是Flash裡有無SFDP非常影響在i.MXRT相關配套工具下的擦寫操作(俗稱下載),因為所有工具(JLink、各IDE、ROM配套Flashloader、痞子衡的MCUBootUtility)預設都是基於SFDP來設計Flash下載演算法的。   僅以ROM配套Flashloader為例,其上位機工具是blhost.exe,它有如下經典的命令序列。這個序列就是利用使用者提供簡化的序列Flash配置值0xc0000007(描述一般的四線QSPI)來初始化FlexSPI以及Flash,為後續擦寫操作做準備。 ```text blhost -u -- fill-memory 0x20202000 4 0xc0000007 blhost -u -- configure-memory 0x9 0x20202000 ```   configure-memory命令底層到底是什麼樣的邏輯呢?讓我們找到任何一個SDK包,在\SDK_2.x.x_MIMXRTxxxx-EVK\middleware\mcu-boot\src\memory\src\flexspi_nor_memory.c裡可以找到如下函式flexspi_nor_mem_config(),它就是其底層邏輯,在這個函式裡我們可以看到,Flashloader會判斷傳來的config值到底是簡化的serial_nor_config_option_t,還是完整的flexspi_nor_config_t。   如果config是簡化的serial_nor_config_option_t,Flashloader會呼叫flexspi_nor_get_config()函式去自動填充生成完整的flexspi_nor_config_t,你可以繼續去看flexspi_nor_get_config()函式的實現,對於普通四線QSPI,其就是根據Flash裡讀回的SFDP表內容來做的填充,因此這種方式下SFDP不可缺。 ```C status_t flexspi_nor_mem_config(uint32_t *config) { status_t status = kStatus_InvalidArgument; bool isNorConfigOption = false; serial_nor_config_option_t *option = (serial_nor_config_option_t *)config; flexspi_nor_config_t *norConfig = (flexspi_nor_config_t *)config; if (option->
option0.B.tag == kSerialNorCfgOption_Tag) { status = flexspi_nor_get_config(s_flexspiNorContext.instance, &s_flexspiNorConfigBlock, option); // ... isNorConfigOption = true; } else if (norConfig->memConfig.tag == FLEXSPI_CFG_BLK_TAG) { memcpy(&s_flexspiNorConfigBlock, norConfig, sizeof(flexspi_nor_config_t)); isNorConfigOption = true; } // ... if (isNorConfigOption) { status = flexspi_nor_flash_init(s_flexspiNorContext.instance, &s_flexspiNorConfigBlock); // ... } return status; } ```   上面這種0xc0000007搞定一切四線QSPI的方式僅適用於含SFDP的Flash,對於不含SFDP的Flash怎麼辦呢。其實上面已經給瞭解決方法,那就是直接提供完整的FDCB,因此i.MXRT相關配套工具下載演算法都需要相應改一下,痞子衡在兩個專案上都做了非SFDP Flash支援: >
1. [J-Link下載演算法源工程](https://github.com/JayHeng/imxrt-tool-flash-algo),可以參考 /boards/msft_rt600_xproject/flash_algo_b0_silicon/Keil_JLink 這個源工程 > 2. [MCUBootUtility v2.3更新](https://github.com/JayHeng/NXP-MCUBootUtility/releases/tag/v2.3.0),參看文章 [《MCUBootUtility v2.3釋出,這次不再放過任何一款Flash》](https://www.cnblogs.com/henjay724/p/12984020.html) 第2.3節   至此,導致序列NOR Flash在i.MXRT下無法正常下載/啟動的常見因素之SFDP痞子衡便介紹完畢了,掌聲在哪裡~~~ ### 歡迎訂閱 文章會同時釋出到我的 [部落格園主頁](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_258x258.jpg)