痞子衡嵌入式:飛思卡爾i.MX RTyyyy系列MCU啓動那些事(9)- 從Parallel NOR啓動


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

  上一篇講i.MXRTyyyy從Raw NAND啓動的文章 從Raw NAND啓動 一經放出,深刻廣大網友喜好,短期內閱讀量飆升,這讓痞子衡深刻鼓舞,因此趁熱打鐵繼續把從Parallel NOR啓動也順便一塊兒講了,爲何說是順便呢?由於Parallel NOR與Raw NAND都是並行接口,屬於同一門派,且這兩種外存設備在i.MXRT內部是經過同一IP(SEMC)實現底層接口通訊的,因此瞭解了Raw NAND啓動,再來看Parallel NOR啓動會以爲簡單不少。話很少說,開講。緩存

1、支持的Parallel NOR

  依舊開門見山,i.MXRTyyyy支持加載啓動的主要是兼容CFI/JESD68標準且內置EPSCD命令集(這個命令集是目前的主流,最新的NOR產品都是使用這個命令集)的ADM SLC Parallel NOR,至於數據線寬度,x8,x16都支持;關於時鐘模式,i.MXRT105x/i.MXRT102x僅支持Asynchronous,i.MXRT106x既支持Asynchronous也支持Synchronous。關於Parallel NOR基本知識請先看一下痞子衡的另外一篇文章 通用NOR接口標準(CFI-JESD68)及SLC Parallel NOR簡介
  Parallel NOR廠商很是多,對應Parallel NOR芯片型號也不少,若是你在選型時不肯定到底該爲i.MXRT選擇哪一款Parallel NOR時,可選用下面三款芯片,痞子衡均實測過:app

Micron MT28EW128ABA1LPC-0SIT    (x8/x16 bits, 32B Page/128KB Block/128Mb Device,   Non-ADM, Asynchronous)
Winbond W29GL128CH9T            (x8/x16 bits, 64B Page/128KB Sector/128Mb Device,  Non-ADM, Asynchronous)
Spansion S29GL128S90TFI020      (x16 bits,    512B Page/128KB Sector/128Mb Device, Non-ADM, Asynchronous)

Note: ADM即地址線與數據線複用,爲了減小pin腳,有些Parallel NOR芯片會將低bit地址線與數據線複用,但目前市面上主流Parallel NOR芯片仍是Non-ADM(即地址與數據是不復用的)居多,i.MXRT雖不能直接鏈接Non-ADM NOR芯片,但在i.MXRT與Non-ADM NOR芯片之間使用一片74系列鎖存器橋接一下便能正常工做。工具

2、Parallel NOR硬件鏈接

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

  i.MXRT對於Parallel NOR的底層接口支持是經過內部SEMC這個IP實現的,SEMC最多能支持五種設備(SDRAM, NAND, NOR, SRAM, 8080 Display),但SEMC接口信號是複用的,因此同一時刻僅能支持一種設備。下表是SEMC接口複用表,關於NOR接口信號,須要特別說一下的是CE#信號和地址線寬度,從表中咱們能夠看到NOR的CE4#信號有6個,即有6種配置選擇,但i.MXRT BootROM固定選擇的是SEMC_CSX[0],至於地址線寬度,SEMC自己最大可支持28bits地址寬度,可是i.MXRT BootROM裏最大隻支持24bits地址寬度(即A0-A23,最大128Mb),這2點在設計NOR硬件鏈接時須要特別注意。設計

Note: 對於小容量Paralle NOR芯片(好比512KB,地址線A0-A18),i.MXRT固然也能夠支持,SEMC未用的地址線(此處爲A19-A23)可不用管。3d

  以下是典型的NOR硬件鏈接設計,示例NOR芯片是MT28EW128ABA1LPC-0SIT,該NOR芯片爲Non-ADM,因此咱們使用了一片74ALVT16373鎖存器橋接了一下,當WEIM_ADV_B信號爲高電平時,鎖存器Dx會輸出給Qx,即此時WEIM_DATA[15:0]做爲地址線輸出給A[15:0],而WEIM_ADV_B信號爲低電平時,WEIM_DATA[15:0]就是數據線(即此處WEIM_ADV_B做爲ADV#信號是高有效,這在後續配置NOR eFUSE時會涉及到)。調試

3、Parallel NOR加載啓動過程

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

  痞子衡在啓動系列文章的第六篇 Bootable image格式與加載(elftosb/.bd) 裏的最後已經介紹過non-XIP image加載啓動過程,但實際上那個過程主要適用於存儲在外部NAND Flash中Bootable image加載啓動,對於存儲在外部Parallel NOR的Bootable image而言有一些區別,咱們知道NOR Flash是支持XIP執行的,因此從NOR啓動有兩種選擇,一種是Non-XIP,另外一種是XIP。
  對於Non-XIP啓動而言,其基本流程與第六篇裏介紹的non-XIP image加載啓動過程相似,只有兩點區別,第一個區別是存儲在NOR Flash裏的Bootable image中IVT偏移地址是固定在0x1000(對於NAND Flash,偏移固定是0x400);第二個區別是BootROM加載initial image的大小爲12KB(對於NAND Flash,initial image是4KB),且這個initial image的加載不須要通過OCRAM緩存,BootROM是直接從NOR對應的SEMC map region去獲取的
  對於XIP啓動而言,其基本流程與non-XIP image加載啓動過程差別就比較大了,由於整個Bootable image都不須要搬運,BootROM直接從NOR對應的SEMC map region去獲取IVT,BootData,Application,而BootROM中分配給SEMC NOR的XIP空間爲0x90000000 - 0x90FFFFFF,因此XIP執行的Application須要連接在這個空間裏。htm

  有了前面的背景知識,NOR的加載啓動過程即是上電以後,BootROM先從NOR起始地址處加載initial image數據(12KB),再根據initial image裏的IVT獲取Application起始地址,如Application地址是連接在SRAM裏,便認爲這是個Non-XIP Application,而後再將Application拷貝到相應SRAM裏去啓動;如Application地址是連接在SEMC NOR XIP空間裏,則不須要拷貝,直接原地XIP執行啓動。

4、下載Application進Parallel NOR

  理解了Parallel NOR加載啓動過程,咱們即可以開始使用Flashloader下載Application進Parallel NOR芯片中:

  痞子衡在啓動系列文章的第四篇 Flashloader初體驗(blhost) 和第六篇 Bootable image格式與加載(elftosb/.bd) 裏分別介紹了Flashloader的基本使用以及如何將你的Application製做成Bootable image,但那裏面製做的Bootable image主要是用於NAND啓動,而對於NOR啓動,其用於生成Bootable image的BD文件稍有不一樣。
  先來看Non-XIP的狀況,下面是一個Non-XIP的BD文件示例,ivtOffset必須設0x1000,由於startAddress = 0x8000, initialLoadSize = 0x3000,因此Application只讀段應從0xb000處開始連接:

options {
    flags = 0x00;
    # Note: This is an example address, it can be any non-zero address in ITCM region
    startAddress = 0x8000;
    ivtOffset = 0x1000;
    initialLoadSize = 0x3000;
    # Note: This is required if the default entrypoint is not the Reset_Handler 
    #       Please set the entryPointAddress to Reset_Handler address 
    // entryPointAddress = 0xd531;
}

sources {
    elfFile = extern(0);
}

section (0)
{
}

  再來看XIP的狀況,下面是一個XIP的BD文件示例,ivtOffset也必須設0x1000,由於startAddress = 0x90000000, initialLoadSize = 0x3000,因此Application只讀段應從0x90003000處開始連接:

options {
    flags = 0x00;
    startAddress = 0x90000000;
    ivtOffset = 0x1000;
    initialLoadSize = 0x3000;
    # Note: This is required if the default entrypoint is not the Reset_Handler 
    #       Please set the entryPointAddress to Reset_Handler address 
    // entryPointAddress = 0x90005531;
}

sources {
    elfFile = extern(0);
}

section (0)
{
}

  假定你已經制做好Bootable image而且使用blhost工具與Flashloader創建了基本通訊,正要開始將Bootable image下載進Parallel NOR。
  與Raw NAND啓動同樣,Parallel NOR也支持configuration block,只不過configuration block對於BootROM啓動而言不是必需的,configuration block必須放在NOR Flash起始地址處,下面是其結構原型(若是你還有印象的話,你會發現它跟Raw NAND的semc_nand_config_t很像),若是想使能configuration block,你須要手動建立這256bytes數據,而且用其覆蓋bootable image的前256bytes,在本文裏暫不使能configuration block。

#define SEMC_NOR_INIT_IMG_SIZE (12u * 1024)
#define SEMC_NOR_MAX_SIZE (16U * 1024 * 1024)

#define SEMC_MEM0_BASE (0x80000000u)
#define SEMC_MEM1_BASE (0x90000000u)
#define SEMC_MEM2_BASE (0xA0000000u)
#define SEMC_MEM3_BASE (0xC0000000u)
#define SEMC_MEM_NOR_AXI_BASE SEMC_MEM1_BASE

typedef struct __semc_nor_config
{
    semc_mem_config_t memConfig; //!< [0x000-0x04f]
    uint8_t vendorType;          //!< [0x050-0x050]
    uint8_t acTimingMode;        //!< [0x051-0x051]
    uint8_t deviceCommandSet;    //!< [0x052-0x052]
    uint8_t reserved0[77];       //!< [0x053-0x09f]
    uint32_t pageSizeInBytes;    //!< [0x0a0-0x0a3]
    uint32_t blockSizeInBytes;   //!< [0x0a4-0x0a7]
    uint32_t blockCount;         //!< [0x0a8-0x0ab]
    uint32_t reserved1[21];      //!< [0x0ac-0x0ff]
} semc_nor_config_t;

  前面鋪墊了這麼多,終於來到關鍵地方了,到底怎麼樣將Bootable image數據下載進Parallel NOR中呢?固然仍是靠Flashloader工具,咱們只須要提供簡化的4byte配置數據便可。下面是一種Application下載更新示例(該示例適用於第二節裏介紹的NOR硬件鏈接):

// 在SRAM裏臨時存儲Parallel NOR配置數據
blhost -p COMx -- fill-memory 0x2000 0x4 0xD0000600 // CSX0, ADV high active, 16bits IO, safe AC timing mode

// 使用Parallel NOR配置數據去配置Parallel NOR接口
blhost -p COMx -- configure-memory 0x8 0x2000

  在上述示例裏痞子衡首先使用了fill-memory命令在0x2000地址處暫存了4byte配置數據,而後經過config-memory將這4byte數據裏的信息配置到Flashloader的Parallel NOR接口中,實際上這2個命令成功執行後,你就能夠開始使用Flashloader下載Bootable image了。那麼這4byte配置數據究竟是怎麼組織的?詳見下表:

  從上表咱們能夠知道,其實這4byte數據提供的配置信息主要是NOR配置,這4byte裏真正須要注意的只有兩個地方(ADV# Polarity、Data Port Size),其他可用固定配置。
  configure-memory命令執行成功以後,底下image的下載很簡單,只須要將Bootable image從SEMC NOR起始map地址開始下載便可,具體步驟以下:

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

Note: 實測發現,RT1050 Flashloader 1.1裏使用USB接口去下載Parallel NOR會報kStatus_SemcNOR_ProgramVerifyFailure錯誤,而使用UART接口下載則正常,應該是USB下載對NOR的支持有缺陷,指望在後續版本的Flashloader裏修復這個問題。

  Bootable image下載成功以後,咱們能夠試着用read-memory從NOR芯片裏讀回IVT,BootData,Application確認一下,Bootable image起始地址在0x90000000,那麼IVT,BootData應該在0x90001000,Application應該在0x90003000:
  Non-XIP Bootable image讀回狀況以下,檢查初始PC可知其連接在SRAM空間

  XIP Bootable image讀回狀況以下,檢查初始PC可知其連接在SEMC NOR map空間

Note: 若是Application是XIP在SEMC NOR空間,其時鐘初始化代碼不能覆蓋BootROM裏對於SEMC的相關配置,不然XIP可能會失敗。

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

5、進入Parallel NOR啓動模式

  Application已經被成功下載進Parallel NOR芯片以後,此時咱們即可以開始設置芯片從Parallel NOR啓動:

  在進入Boot Device選擇以前,你首先須要肯定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,,你還須要將BOOT_CFG1[7:4](eFUSE偏移0x450處的32bit配置數據的bit7:4)燒寫成4'b0001,此時便進入了從SEMC NOR啓動模式。
  若是想確保i.MXRT芯片必定正在從Parallel NOR啓動,可在芯片上電時使用Jlink調試器或者藉助Flashloader讀取芯片內部2個寄存器的值,這2個寄存器分別是SRC_SBMR1/2, 咱們設的關於啓動模式的BOOT_MODE pins/BOOT_CFG pin/eFUSE偏移0x450配置值在上電時會自動加載到SRC_SBMR1/2寄存器裏,BootROM主要是根據SRC_SBMR1/2寄存器的值來判斷啓動模式的。

  PS: BOOT_MODE[1:0]也能夠設爲2'b10,即芯片處於Internal Boot模式,此時須要確保BT_FUSE_SEL(eFUSE偏移0x460處的32bit配置數據的bit4)爲1'b0和BOOT_CFG1[7:4]這四個pin的輸入狀態設爲4'b0001。

6、配置eFUSE啓動Parallel NOR

  設置好芯片啓動模式是從Parallel NOR啓動以後,咱們還須要最後關注一下與Parallel NOR相關的具體特性配置:

  你應該記得咱們在使用Flashloader下載Application的時候提供過4bytes的NOR配置數據,這4bytes的NOR配置數據是爲了讓Flashloader可以正確初始化Parallel NOR接口去訪問NOR芯片(主要是寫Bootable image),一樣BootROM上電也須要初始化Parallel NOR接口去訪問NOR芯片(主要是讀Bootable image),因此BootROM也須要相似這4bytes NOR配置數據,而BootROM的NOR配置便放在以下的eFUSE區域裏:

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

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

相關文章
相關標籤/搜索