在前幾篇裡痞子衡介紹的Boot Device都屬于主動啟動的Primary Boot Device(Serial NOR/NAND, Parallel NOR/NAND, SD/eMMC),試想一下如果遇到這樣的情況,你選擇啟動的某個Primary Boot Device正常工作一段時間後某次開機突然因為某種未知原因無法啟動了,此時系統無法正常工作,但如果你希望系統能夠有一定的容錯/魯棒能力,即使這種場合下也能夠保證基本工作,那應該怎麼做?别擔心,i.MXRT BootROM提供了一種解決方案,即Recovery Boot機制,BootROM支援Serial EEPROM/NOR作為Recovery Boot Device,你隻需要将備份application事先放進Recovery Boot Device即可,任何主動啟動的Primary Boot Device啟動失敗,BootROM會自動啟動Recovery Boot Device中的備份application保證系統能正常工作,是不是覺得recovery boot很貼心?今天痞子衡就為大家介紹Recovery Boot
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MX RT1xxx系列MCU的Serial EEPROM/NOR恢複啟動。
在前幾篇裡痞子衡介紹的Boot Device都屬于主動啟動的Primary Boot Device(Serial NOR/NAND, Parallel NOR/NAND, SD/eMMC),試想一下如果遇到這樣的情況,你選擇啟動的某個Primary Boot Device正常工作一段時間後某次開機突然因為某種未知原因無法啟動了,此時系統無法正常工作,但如果你希望系統能夠有一定的容錯/魯棒能力,即使這種場合下也能夠保證基本工作,那應該怎麼做?别擔心,i.MXRT1xxx BootROM提供了一種解決方案,即Recovery Boot機制,BootROM支援Serial EEPROM/NOR作為Recovery Boot Device,你隻需要将備份application事先放進Recovery Boot Device即可,任何主動啟動的Primary Boot Device啟動失敗,BootROM會自動啟動Recovery Boot Device中的備份application保證系統能正常工作,是不是覺得recovery boot很貼心?今天痞子衡就為大家介紹Recovery Boot:
i.MXRT1xxx支援加載恢複啟動的主要是1-bit SPI接口的EEPROM,除此以外市面上有些Serial(QSPI) NOR也相容EEPROM指令集(即1bit read/normal read模式),是以這些QSPI NOR也能被i.MXRT1xxx用作恢複啟動。關于Serial EEPROM基本知識請先看一下痞子衡的另一篇文章 EEPROM接口事實标準及Serial EEPROM簡介。
Serial EEPROM/NOR廠商非常多,對應Serial EEPROM/NOR晶片型号也很多,如果你在選型時不确定到底該為i.MXRT1xxx選擇哪一款Serial EEPROM/NOR時,可選用下面三款晶片,痞子衡均實測過:
Note1: BootROM固定使用SPI Mode(0,0)(即CPOL=0, CPHA=0)去通路外部EEPROM/NOR。 Note2: BootROM主要支援2bytes(存儲範圍為4Kb - 512Kb) / 3bytes(存儲範圍為1Mb - 128Mb)位址的外部EEPROM/NOR。
确定了Serial EEPROM/NOR晶片選型後,底下便進入Serial EEPROM/NOR硬體電路設計及與i.MXRT1xxx的信号連接配接環節:
i.MXRT1xxx對于Serial EEPROM/NOR的底層接口支援是通過内部LPSPI這個IP實作的,i.MXRT1xxx内部一共有4個LPSPI,BootROM對這4組LPSPI都支援,具體pinmux如下(适用RT1050):

如下是典型的SPI EEPROM硬體連接配接設計,示例EEPROM晶片是CAT25512HU5I-GT3,标準1-bit SPI,直接連接配接即可:
如下是典型的QSPI NOR硬體連接配接設計,示例NOR晶片是MT25QL128ABA1ESE-OSIT,該NOR晶片為Multiple I/O,資料線為DQ[3:0],當用作1-bit SPI模式時,僅需連接配接DQ[1:0]:
Note: 當使用QSPI Flash作為1bit SPI Flash使用時,空置的引腳IO[3:2]必須上拉,否則Flash無法正常通路。
確定Serial EEPROM/NOR硬體相關設計無誤之後,底下便是下載下傳更新Bootable Image進Serial EEPROM/NOR以供BootROM加載啟動了,在下載下傳Bootable image之前有必要先了解Serial EEPROM/NOR的加載啟動過程:
痞子衡在啟動系列文章的第六篇 Bootable image格式與加載(elftosb/.bd) 裡的最後已經介紹過non-XIP image加載啟動過程,這個過程其實已經充分地描述了Serial EEPROM/NOR的加載啟動過程。
有了non-XIP image加載啟動的背景知識,Serial EEPROM/NOR的加載啟動過程便是上電之後,在主動選擇的Primary Boot Device啟動失敗之後,BootROM會從Serial EEPROM/NOR起始位址處加載initial image資料(4KB),再根據initial image裡的IVT,Boot Data擷取Application起始位址以及總長度,然後再将Application全部拷貝到相應SRAM裡去啟動,其過程如下圖所示:
了解了Serial EEPROM/NOR加載啟動過程,我們便可以開始使用Flashloader下載下傳Application進Serial EEPROM/NOR晶片中:
痞子衡在啟動系列文章的第四篇 Flashloader初體驗(blhost) 和第六篇 Bootable image格式與加載(elftosb/.bd) 裡分别介紹了Flashloader的基本使用以及如何将你的Application制作成Bootable image,後續内容假定你已經制作好一個Bootable image并且使用blhost工具與Flashloader建立了基本通信,正要開始将Bootable image下載下傳進Serial EEPROM/NOR。
Serial EEPROM/NOR也支援configuration block,隻不過configuration block對于BootROM恢複啟動而言不是必需的,configuration block結構原型是下面的spi_nor_eeprom_config_t,在本文裡暫不使能configuration block。
前面扯了些沒用的,那麼到底怎麼樣将Bootable image資料下載下傳進Serial EEPROM/NOR中呢?當然還是靠Flashloader工具,我們隻需要提供簡化的8byte配置資料即可。下面是一種Application下載下傳更新示例(該示例适用于 Serial NOR晶片MT25QL128ABA1ESE-OSIT):
在上述示例裡痞子衡首先使用了fill-memory指令在0x2000位址處暫存了8byte配置資料,然後通過config-memory将這8byte資料裡的資訊配置到Flashloader的Serial EEPROM/NOR接口中,實際上這2個指令成功執行後,你就可以開始使用Flashloader下載下傳Bootable image了。那麼這8byte配置資料到底是怎麼組織的?詳見下表:
從上表我們可以知道,其實這8byte資料提供的配置資訊主要是SPI連接配接以及EEPROM/NOR Device屬性配置。configure-memory指令執行成功之後,底下image的下載下傳很簡單,隻需要将Bootable image從Serial EEPROM/NOR起始位址開始下載下傳即可,具體步驟如下:
Bootable image下載下傳成功之後,我們可以試着用read-memory從Serial EEPROM/NOR晶片裡讀回IVT,BootData,Application确認一下,Bootable image起始位址在0x0,那麼IVT,BootData應該在0x400,Application應該在0x2000:
至此,Application的下載下傳工作便結束了。
Application已經被成功下載下傳進Serial EEPROM/NOR晶片之後,此時我們便可以開始設定晶片從Serial EEPROM/NOR啟動:
在進入Boot Device選擇之前,你首先需要設定BOOT_MODE[1:0]=2'b10,即晶片處于Internal Boot模式,并且确認BT_FUSE_SEL(eFUSE偏移0x460處的32bit配置資料的bit4)為1'b0,或者也可以設定BOOT_MODE[1:0]=2'b00,即晶片處于Boot From Fuses模式,并且将BT_FUSE_SEL(eFUSE偏移0x460處的32bit配置資料的bit4)燒寫為1'b1,這裡看不懂的朋友請溫習痞子衡前面的文章 Boot配置(BOOT Pin/eFUSE)。
設定好正确Boot模式後,再來選擇Boot Device,Serial EEPROM/NOR屬于Recovery Boot Device,并不是可以主動選擇啟動的Boot device,是以并沒有BOOT_CFG pin或者eFUSE來配置選擇直接從Serial EEPROM/NOR啟動,如果想驗證從Seril EEPROM/NOR啟動是否能成功,你需要確定目前BOOT_CFG/eFUSE決定的Primary Boot Device中沒有Bootable image。
設定好晶片啟動模式是從Serial EEPROM/NOR啟動之後,我們還需要最後關注一下與Serial EEPROM/NOR相關的具體特性配置:
Serial EEPROM/NOR的配置相對還是比較簡單的,隻有4部分:Recovery Boot Enable、SPI Speed、SPI addressing、SPI Port,其中Recovery Boot Enable是一定要開啟的,SPI Port要根據闆級線路設計而定,SPI addressing根據選用的Serial EEPROM/NOR型号而定,SPI Speed是唯一的可以自由配置的選項(當然不能超過所選Serial EEPROM/NOR的最高速度)。
市面上基本大于64KB的QSPI NOR均相容EEPROM指令集(即1bit read/normal read模式)。 雖然從Serial EEPROM/NOR啟動的設計目的是用于recovery boot,但如果你硬要将Serial EEPROM/NOR作為系統裡的唯一Boot Device,也并不是不可以,你需要在闆級設計時考慮與Primary Boot Device連接配接的i.MXRT1xxx相關引腳在上電時的電平轉換(BootROM總是會嘗試先啟動Primary Boot Device)的影響。
上述所有步驟全部完成之後,複位晶片你就應該能看到你放在Serial EEPROM/NOR裡的Application已經正常地啟動了。
至此,恩智浦i.MX RT1xxx系列MCU的Serial EEPROM/NOR恢複啟動痞子衡便介紹完畢了,掌聲在哪裡~~~
文章會同時釋出到我的 部落格園首頁、CSDN首頁、微信公衆号 平台上。
微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。
最後歡迎關注痞子衡個人微信公衆号【痞子衡嵌入式】,一個專注嵌入式技術的公衆号,跟着痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職于恩智浦MCU系統部門,擔任嵌入式系統應用工程師。
專欄内所有文章的轉載請注明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關注痞子衡的Github首頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關于專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回複免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。