痞子衡嵌入式:飛思卡爾i.MX RTyyyy系列MCU啓動那些事(13)- 從Serial(1-bit SPI) EEPROM/NOR恢復啓動


  你們好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給你們介紹的是飛思卡爾i.MX RTyyyy系列MCU的Serial EEPROM/NOR恢復啓動html

  在前幾篇裏痞子衡介紹的Boot Device都屬於主動啓動的Primary Boot Device(Serial NOR/NAND, Parallel NOR/NAND, SD/eMMC),試想一下若是遇到這樣的狀況,你選擇啓動的某個Primary Boot Device正常工做一段時間後某次開機忽然由於某種未知緣由沒法啓動了,此時系統沒法正常工做,但若是你但願系統可以有必定的容錯/魯棒能力,即便這種場合下也可以保證基本工做,那應該怎麼作?別擔憂,i.MXRTyyyy 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:app

1、支持的Serial EEPROM/NOR

  i.MXRT支持加載恢復啓動的主要是1-bit SPI接口的EEPROM,除此之外市面上有些Serial(QSPI) NOR也兼容EEPROM命令集(即1bit read/normal read模式),因此這些QSPI NOR也能被i.MXRT用做恢復啓動。關於Serial EEPROM基本知識請先看一下痞子衡的另外一篇文章 EEPROM接口事實標準及Serial EEPROM簡介
  Serial EEPROM/NOR廠商很是多,對應Serial EEPROM/NOR芯片型號也不少,若是你在選型時不肯定到底該爲i.MXRT選擇哪一款Serial EEPROM/NOR時,可選用下面三款芯片,痞子衡均實測過:工具

Onsemi CAT25512HU5I-GT3         (EEPROM,    1-bit SPI,    20MHz,      128B Page/512Kb Device)
Micron MT25QL128ABA1ESE-OSIT    (NOR Flash, Multiple I/O, 133MHz-STR, 64B Page/4-32-64KB Sector/128Mb Device)
Spansion S25FL129P              (NOR Flash, Multiple I/O, 80MHz,      256B Page/4-8-64-256KB Sector/128Mb Device)

Note1: BootROM固定使用SPI Mode(0,0)(即CPOL=0, CPHA=0)去訪問外部EEPROM/NOR。
Note2: BootROM主要支持2bytes(存儲範圍爲4Kb - 512Kb) / 3bytes(存儲範圍爲1Mb - 128Mb)地址的外部EEPROM/NOR。ui

2、Serial EEPROM/NOR硬件鏈接

  肯定了Serial EEPROM/NOR芯片選型後,底下便進入Serial EEPROM/NOR硬件電路設計及與i.MXRT的信號鏈接環節:設計

  i.MXRT對於Serial EEPROM/NOR的底層接口支持是經過內部LPSPI這個IP實現的,i.MXRT內部一共有4個LPSPI,BootROM對這4組LPSPI都支持,具體pinmux以下:3d


  以下是典型的SPI EEPROM硬件鏈接設計,示例EEPROM芯片是CAT25512HU5I-GT3,標準1-bit SPI,直接鏈接便可:code

  以下是典型的QSPI NOR硬件鏈接設計,示例NOR芯片是MT25QL128ABA1ESE-OSIT,該NOR芯片爲Multiple I/O,數據線爲DQ[3:0],當用做1-bit SPI模式時,僅需鏈接DQ[1:0]:orm

3、Serial EEPROM/NOR加載啓動過程

  確保Serial EEPROM/NOR硬件相關設計無誤以後,底下即是下載更新Bootable Image進Serial EEPROM/NOR以供BootROM加載啓動了,在下載Bootable image以前有必要先了解Serial EEPROM/NOR的加載啓動過程:htm

  痞子衡在啓動系列文章的第六篇 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裏去啓動,其過程以下圖所示:blog

4、下載Application進Serial EEPROM/NOR

  理解了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。

//! @brief Serial NOR/EEPROM peripheral Config block structure
typedef struct __spi_nor_eeprom_peripheral_config
{
    uint8_t spiIndex;     //!< Index of SPI module
    uint8_t spiPcsx;      //!< PCS instance of SPI module
    uint8_t reserved0[2]; //!< Reserved0
    uint32_t spiSpeed_Hz; //!< SPI transfer speed to connected NOR/EEPROM
} spi_nor_eeprom_peripheral_config_t;

//! @brief Serial NOR/EEPROM Config block structure
typedef struct __serial_nor_eeprom_config
{
    uint8_t memoryType;                            //!< Determines the connected memory type
    uint8_t addressLengthInBits;                   //!< Nor/Eeprom address length
    uint8_t waitTime;                              //!< Wait time before read
    uint8_t reserved0;                             //!< Reserved0
    uint32_t memorySizeInBytes;                    //!< Nor/Eeprom memory size
    uint32_t pageSizeInBytes;                      //!< Nor/Eeprom page size
    uint32_t sectorSizeInBytes;                    //!< Nor/Eeprom sector size
    serial_nor_eeprom_command_set commandSet;      //!< Nor/Eeprom command set
} serial_nor_eeprom_config_t;

//! @brief Serial NOR/EEPROM Config block structure
typedef struct __spi_nor_eeprom_config
{
    uint32_t tag;                                 //!< [0x000-0x003]
    uint32_t version;                             //!< [0x004-0x007]
    spi_nor_eeprom_peripheral_config_t spiConfig; //!< [0x008-0x00f]
    serial_nor_eeprom_config_t memoryConfig;      //!< [0x010-0x02b]
} spi_nor_eeprom_config_t;

  前面扯了些沒用的,那麼到底怎麼樣將Bootable image數據下載進Serial EEPROM/NOR中呢?固然仍是靠Flashloader工具,咱們只須要提供簡化的8byte配置數據便可。下面是一種Application下載更新示例(該示例適用於 Serial NOR芯片MT25QL128ABA1ESE-OSIT):

// 在SRAM裏臨時存儲Serial EEPROM/NOR配置數據
blhost -p COMx -- fill-memory 0x2000 0x4 0xC1100500 // SPI1, PCS0, NOR Flash, 256B Page, 4KB Sector, 16MB Device
blhost -p COMx -- fill-memory 0x2004 0x4 0x00000000 // 20MHz SPI Speed

// 使用Serial EEPROM/NOR配置數據去配置SPI接口
blhost -p COMx -- configure-memory 0x110 0x2000

  在上述示例裏痞子衡首先使用了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起始地址開始下載便可,具體步驟以下:

// 擦除Serial EEPROM/NOR並將image下載進Serial EEPROM/NOR
blhost -p COMx -- flash-erase-region 0x0 0x20000 0x110
blhost -p COMx -- write-memory 0x0 ivt_image.bin 0x110

  Bootable image下載成功以後,咱們能夠試着用read-memory從Serial EEPROM/NOR芯片裏讀回IVT,BootData,Application確認一下,Bootable image起始地址在0x0,那麼IVT,BootData應該在0x400,Application應該在0x2000:

  至此,Application的下載工做便結束了。

5、進入Serial EEPROM/NOR備份啓動模式

  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。

6、配置eFUSE啓動Serial EEPROM/NOR

  設置好芯片啓動模式是從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的最高速度)。

7、幾個注意事項

  1. 市面上基本大於64KB的QSPI NOR均兼容EEPROM命令集(即1bit read/normal read模式)。
  2. 雖然從Serial EEPROM/NOR啓動的設計目的是用於recovery boot,但若是你硬要將Serial EEPROM/NOR做爲系統裏的惟一Boot Device,也並非不能夠,你須要在板級設計時考慮與Primary Boot Device鏈接的i.MXRT相關引腳在上電時的電平轉換(BootROM老是會嘗試先啓動Primary Boot Device)的影響。

  上述全部步驟所有完成以後,復位芯片你就應該能看到你放在Serial EEPROM/NOR裏的Application已經正常地啓動了。

  至此,飛思卡爾i.MX RTyyyy系列MCU的Serial EEPROM/NOR恢復啓動痞子衡便介紹完畢了,掌聲在哪裏~~~

相關文章
相關標籤/搜索