痞子衡嵌入式:致使串行NOR Flash在i.MXRT下沒法正常下載/啓動的常見因素之SFDP


  你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們介紹的是致使串行NOR Flash在i.MXRT下沒法正常下載/啓動的常見因素之SFDPhtml

  i.MXRT系列MCU發佈已兩年多了,基於i.MXRT的客戶產品也愈來愈多,能夠說是全面開花了。痞子衡做爲i.MXRT產品線的系統應用工程師,早期的時候還能夠盡情作參考設計,如今基本大量時間都被客戶支持佔據了。git

  由於i.MXRT系列都沒有內置Flash(RT1064, RT1024等SIP型號除外),所以爲其搭配一塊串行NOR Flash去啓動是客戶項目的頭等大事,而串行NOR Flash廠商很是多,客戶選擇餘地很大,所以咱們不得不與客戶一塊兒同茫茫Flash型號打交道,痞子衡也經常調侃本身已淪爲Flash測試工程師。github

  痞子衡在支持客戶解決串行NOR Flash下載啓動問題過程當中主要遇到幾個常見因素,這幾個因素可能會影響Flash在i.MXRT下沒法正常使用,今天痞子衡就重點跟你們聊聊SFDP這個因素。算法

1、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之間輕鬆切換。工具

2、部分Flash型號不支持SFDP

  由於SFDP標準是2011年纔開始推出,新興Flash廠商(好比兆易創新)的產品基本都是支持SFDP標準的,而部分老牌Flash廠商(好比華邦)則存在老型號和新型號共存的問題。老型號都是2011年前設計生產的,不支持SFDP;2011年以後設計的新型號基本都是支持SFDP的。測試

  華邦目前是串行Flash第一大廠商,痞子衡遇到好幾個i.MXRT客戶,選用的華邦NOR Flash,但Flash裏不支持SFDP,所以客戶支持稍微複雜一些。關於SFDP支持問題,痞子衡特別聯繫過華邦銷售人員,獲得了他們的答覆,華邦NOR Flash家族裏 W25QxxJVW25QxxJW 系列都是新型號,所有支持SFDP;而 W25QxxFVW25QxxFW 系列屬於老型號,大多沒有SFDP,可是也有以下部分型號支持SFDP:flex

  雖然咱們能夠在後續開發的過程當中也能正常使用非SFDP標準的Flash以及能經過讀SFDP命令查詢出芯片是否支持SFDP,但最好在Flash選型前就能明確知道其SFDP狀況,這個須要跟Flash廠商銷售溝通好。總之,痞子衡推薦你們選用各廠商支持SFDP標準的新型號。ui

3、不支持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,爲後續擦寫操做作準備。

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不可缺。

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下載算法源工程,能夠參考 /boards/msft_rt600_xproject/flash_algo_b0_silicon/Keil_JLink 這個源工程
  2. MCUBootUtility v2.3更新,參看文章 《MCUBootUtility v2.3發佈,此次再也不放過任何一款Flash》 第2.3節

  至此,致使串行NOR Flash在i.MXRT下沒法正常下載/啓動的常見因素之SFDP痞子衡便介紹完畢了,掌聲在哪裏~~~

歡迎訂閱

文章會同時發佈到個人 博客園主頁CSDN主頁知乎主頁微信公衆號 平臺上。

微信搜索"痞子衡嵌入式"或者掃描下面二維碼,就能夠在手機上第一時間看了哦。

相關文章
相關標籤/搜索