痞子衡嵌入式:超級下載算法(RT-UFL)開發筆記(4) - 輪詢Flash配置參數


  你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們介紹的是超級下載算法開發筆記(4)之輪詢Flash配置參數html

  文接上篇 《超級下載算法(RT-UFL)開發筆記(3) - 統一FlexSPI驅動訪問》,如今超級下載算法中已經集成了BootROM版本的統一FlexSPI驅動,原則上BootROM能支持啓動的全部串行NOR Flash型號,超級下載算法均可以對其進行擦寫操做。BootROM雖然能夠支持不少種不一樣的Flash,但其須要依賴用戶提供一個名爲FDCB的配置結構體放置在Flash固定偏移處,BootROM先配置FlexSPI爲1bit SDR低速模式去訪問Flash獲取到FDCB,而後從FDCB中獲得當前Flash的所有屬性再去從新初始化FlexSPI外設。然而超級下載算法無法從用戶處獲取到Flash的信息,只能自力更生,使用輪詢的方法去不斷嘗試,直到試出合適的配置參數。git

  本篇是開發筆記第四篇,我們就重點聊聊如何讓超級下載算法適用不一樣廠商生產的不一樣屬性串行NOR Flash。github

1、BootROM對Flash的支持(FDCB)

  前言裏講了BootROM對Flash的支持是靠不一樣的FDCB結構體配置值來實現的,這個FDCB一共512bytes,原型及各byte定義在i.MXRT1xxx參考手冊System Boot章節裏 Serial NOR configuration block (512 bytes) 一小節有詳細介紹。這個FDCB主要是用於配置FlexSPI外設的,我們超級下載算法的 flexspi_nor_flash_init() 函數的一個主要參數 flexspi_nor_config_t 其實就是FDCB。算法

status_t flexspi_nor_flash_init(uint32_t instance, flexspi_nor_config_t *config);

  關於這個FDCB具體如何賦值,恩智浦官網有一些應用筆記,這些應用筆記介紹了一些典型的Flash型號應該匹配什麼樣的FDCB值,從這些應用筆記裏咱們能夠大概瞭解FDCB用法。數組

  上面的應用筆記裏列舉了一些BootROM支持的Flash型號,這些型號僅僅是恩智浦工程師驗證過的型號,而客戶在實際項目中用到的Flash型號遠遠不止這些。從Flash型號自己角度來看,不一樣廠商的不一樣型號是獨特且惟一的,但從FDCB角度而言,不少同類型Flash型號實際上是同樣的配置值。微信

2、快速生成FDCB的方法(config option)

  那麼咱們如今是否是直接在超級下載算法中窮舉不一樣的FDCB值去輪詢呢?要知道FDCB有512bytes,這是個不小的結構體,輪詢一遍太費時且低效了。咱們須要進一步提煉FDCB,將其精簡一下,只輪詢那些跟Flash類型緊密相關的參數。這個工做其實也不須要咱們作了,恩智浦ROM研發小組已經作好了,那即是8bytes的config option配置結構體,這個配置結構體也是超級下載算法的 flexspi_nor_get_config() 函數的一個主要參數 serial_nor_config_option_t。函數

status_t flexspi_nor_get_config(uint32_t instance, flexspi_nor_config_t *config, serial_nor_config_option_t *option);

  其實這個神奇的8bytes的config option配置結構體不止一次地出現過痞子衡以前的文章裏:《致使串行NOR Flash在i.MXRT下沒法正常下載/啓動的常見因素之SFDP》《致使串行NOR Flash在i.MXRT下沒法正常下載/啓動的常見因素之QE bit》《FlexSPI NOR啓動時間(RT1170)》《MCUBootUtility v2.3發佈,此次再也不放過任何一款Flash》,它很是精煉地歸納了市面上主要的串行NOR Flash特性(都要符合JESD216規範),只要你提供config option,通過 flexspi_nor_get_config() 函數執行後即可以自動生成相對應的完整FDCB。flex

  在i.MXRTxxx參考手冊Non-Secure Boot ROM章節裏你能夠找到以下典型Flash型號對應的參考config option值:ui

3、利用config option來作輪詢

  直接利用512bytes的FDCB去輪詢太難,但利用8bytes的config option去輪詢就簡單多了。咱們順着上文中說起的ufl_target_desc_t結構體,在其中新增幾個成員(FlexSPI外設編號/基址/映射地址,config option),其中輪詢主要跟config option有關。.net

typedef struct _target_desc
{
    uint32_t imxrtChipId;
    uint32_t flexspiInstance;                 // 新增
    uint32_t flexspiBaseAddr;                 // 新增
    uint32_t flashBaseAddr;                   // 新增
    serial_nor_config_option_t configOption;  // 新增
    flexspi_nor_flash_driver_t flashDriver;
    flexspi_bsp_driver_t flexspiBsp;
} ufl_target_desc_t;

  而後咱們定義一個config option型的數組 s_flashConfigOpt[],裏面存放一些經典的config option值。當前痞子衡的設計是僅輪詢這些經典的config option值,並無窮舉config option,這也是從超級下載算法的執行效率角度考慮,這些經典的config option值足以覆蓋80%以上的Flash型號了(後期若是要提升Flash覆蓋率,會考慮轉到窮舉法的)。

static const serial_nor_config_option_t s_flashConfigOpt[] = {
    // For Normal Quad, eg. IS25LP064A, GD25LB256E
    {.option0.U = 0xc0000001, .option1.U = 0x00000000},

    // For Normal Octal, eg. MX25UM51345G
    {.option0.U = 0xc0403001, .option1.U = 0x00000000},
    {.option0.U = 0xc1503051, .option1.U = 0x20000014},

    // For Normal HyperBus, eg. S26KS512S, IS26KS512S
    {.option0.U = (0xc0233000 + kSerialNorCfgOption_MaxFreq), .option1.U = 0x00000000},

    // For Normal Octal, eg. MX25UM51245G
    {.option0.U = 0xc0403031, .option1.U = 0x00000000},

    // For Normal Octal, eg. MT35X
    {.option0.U = 0xc0603001, .option1.U = 0x00000000},
    // For Normal Octal, eg. ATXP032
    {.option0.U = 0xc0803001, .option1.U = 0x00000000},

    // For Normal 1-bit SDR
    {.option0.U = FLASH_CONFIG_OPT_1BIT_SDR, .option1.U = 0x00000000},
};

  關於具體輪詢操做,源碼在 RT-UFL 項目中的ufl_auto_probe_flash.c 文件裏,痞子衡就再也不貼出了,只講一下幾個要點:

  • 要點 1: 對於一些SIP版本的i.MXRT型號,沒有必要再輪詢了,直接給預設的config option值便可。
  • 要點 2: config option參數輪詢成功的判斷標準是,執行初始化->擦->寫操做均正常(或許還要加入回讀校驗)。
  • 要點 3: 當前config option參數輪詢失敗進到下一個option值前須要對FlexSPI外設進行復位(有條件的話還要對Flash進行復位)。
  • 要點 4: 不一樣Flash型號支持的最大速度不一樣,輪詢時老是先從最低速開始,慢慢增速到最大支持的速度(當前是100MHz,後期會調整)。
  • 要點 5: 爲了照顧沒有SFDP表的Flash(或不符合JESD216規範),輪詢過程裏增長了一個1bit SDR屬性的FDCB表做爲最後一個保底輪詢。

  至此,超級下載算法開發筆記(4)之輪詢Flash配置參數痞子衡便介紹完畢了,掌聲在哪裏~~~

歡迎訂閱

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

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

相關文章
相關標籤/搜索