本篇是開發筆記第四篇,咱們就重點聊聊如何讓超級下載下傳算法适用不同廠商生産的不同屬性串行NOR Flash。
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是超級下載下傳算法開發筆記(4)之輪詢Flash配置參數。
文接上篇 《超級下載下傳算法(RT-UFL)開發筆記(3) - 統一FlexSPI驅動通路》,現在超級下載下傳算法中已經內建了BootROM版本的統一FlexSPI驅動,原則上BootROM能支援啟動的所有串行NOR Flash型号,超級下載下傳算法都可以對其進行擦寫操作。BootROM雖然可以支援很多種不同的Flash,但其需要依賴使用者提供一個名為FDCB的配置結構體放置在Flash固定偏移處,BootROM先配置FlexSPI為1bit SDR低速模式去通路Flash擷取到FDCB,然後從FDCB中得到目前Flash的全部屬性再去重新初始化FlexSPI外設。然而超級下載下傳算法沒法從使用者處擷取到Flash的資訊,隻能自力更生,使用輪詢的方法去不斷嘗試,直到試出合适的配置參數。
本篇是開發筆記第四篇,咱們就重點聊聊如何讓超級下載下傳算法适用不同廠商生産的不同屬性串行NOR Flash。
前言裡講了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。
關于這個FDCB具體如何指派,恩智浦官網有一些應用筆記,這些應用筆記介紹了一些典型的Flash型号應該比對什麼樣的FDCB值,從這些應用筆記裡我們可以大概了解FDCB用法。

上面的應用筆記裡列舉了一些BootROM支援的Flash型号,這些型号僅僅是恩智浦工程師驗證過的型号,而客戶在實際項目中用到的Flash型号遠遠不止這些。從Flash型号本身角度來看,不同廠商的不同型号是獨特且唯一的,但從FDCB角度而言,很多同類型Flash型号其實是一樣的配置值。
那麼我們現在是不是直接在超級下載下傳算法中窮舉不同的FDCB值去輪詢呢?要知道FDCB有512bytes,這是個不小的結構體,輪詢一遍太費時且低效了。我們需要進一步提煉FDCB,将其精簡一下,隻輪詢那些跟Flash類型緊密相關的參數。這個工作其實也不需要我們做了,恩智浦ROM研發小組已經做好了,那便是8bytes的config option配置結構體,這個配置結構體也是超級下載下傳算法的 flexspi_nor_get_config() 函數的一個主要參數 serial_nor_config_option_t。
其實這個神奇的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。
在i.MXRTxxx參考手冊Non-Secure Boot ROM章節裡你可以找到如下典型Flash型号對應的參考config option值:
直接利用512bytes的FDCB去輪詢太難,但利用8bytes的config option去輪詢就簡單多了。我們順着上文中提及的ufl_target_desc_t結構體,在其中新增幾個成員(FlexSPI外設編号/基址/映射位址,config option),其中輪詢主要跟config option有關。
然後我們定義一個config option型的數組 s_flashConfigOpt[],裡面存放一些經典的config option值。目前痞子衡的設計是僅輪詢這些經典的config option值,并沒有窮舉config option,這也是從超級下載下傳算法的執行效率角度考慮,這些經典的config option值足以覆寫80%以上的Flash型号了(後期如果要提高Flash覆寫率,會考慮轉到窮舉法的)。
關于具體輪詢操作,源碼在 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首頁、知乎首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。