痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU啟動那些事(12)- 從SD/eMMC啟動

2023-05-03 12:00:28

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MXRT1xxx系列MCU的SD/eMMC卡啟動

  最近在恩智浦官方社群上支援了一個關於 i.MXRT 從 SD 卡啟動的案例,這讓痞子衡想起了一年前寫過的一篇《i.MXRT600從SD/eMMC啟動》,那一篇重點介紹了基於 eMMC 裝置製作程式、下載程式、啟動程式的方法。雖然 SD 和 eMMC 在啟動流程上差別不大,但是細節上還是有一些不同的。藉此機會,今天痞子衡再認真捋一下 SD 卡上製作、下載、啟動程式的方法:

  • Note:文中貼圖、程式碼主要以 i.MXRT1050 為例,其餘 i.MXRT1xxx 系列原理類似。

一、支援的SD/eMMC

  i.MXRT 四位數和 i.MXRT 三位數用於存取 SD/MMC 卡的外設是同一個即 uSDHC,外設本身能支援到 SD3.0。但是晶片 BootROM 裡並不一定完全按 uSDHC 全功能來做實現,i.MXRT1050 BootROM 主要實現了以下型別的 SD 卡啟動支援:

• SDv2.0 or less
• eSDv2.10 rev-0.9, with or without FAST_BOOT
• SDXCv3.0

  作為對比,i.MXRT600 BootROM 對於 SD 卡啟動支援與 i.MXRT1050 則稍有不同:

• SD Version 3.0 or earlier version
• SD: 1-bit/4-bit; SDR12, SDR25, SDR50 and SDR104.

  全系列 MIMXRT10xx-EVK 上均設定了 MicroSD 卡槽,均連線在了第一個 uSDHC 埠上,所以我們測試 SD 啟動還是非常方便的。

二、SD/eMMC硬體連線

  除了 i.MXRT1010/1015 不包含 uSDHC 外設之外,其餘 i.MXRT1xxx 內部都有 2 個 uSDHC 模組(注:uSDHC2 可能在一些小封裝上沒有引出),i.MXRT1050 BootROM 支援如下 pinmux 來連線 SD/eMMC 卡去啟動:

  如下是 IMXRT1050-EVKB_Rev.A 板上 SD 卡槽連線設計,這個卡槽除了用來測試 SD 卡讀寫啟動之外,也可以通過連線 MicroSD 轉 eMMC 介面卡去測試啟動 eMMC(需工作在 1/4bit bus width mode):

三、SD/eMMC載入啟動過程

  我們知道 SD/eMMC 裝置中僅能放置 Non-XIP Application(連結到內部 SRAM 或者 外部 RAM 空間),其啟動載入流程跟 《從 Serial(1-bit SPI) NOR/EEPROM恢復啟動》 載入流程差不多(參考文章第 3 小節)。

  對於 SD 卡裝置,起始偏移一般要存放系統 main boot record (MBR),因此需要讓開,BootROM 會從固定偏移 0x400 地址處讀取 IVT 啟動頭,有了 IVT 後面就能找到 Application 去載入啟動了(在這裡 RT 四位數和 RT 三位數是不一樣的)。

四、下載Application進SD/eMMC

  現在假定你已經制作好一個 Bootable image 並且使用 blhost 工具與 Flashloader 建立了基本通訊,正要開始將 Bootable image 下載進 SD 裝置。此時我們只需要提供簡化的 4byte 設定資料就可以完成 SD 裝置的設定,下面是一種 Application 下載更新範例:

// 在 SRAM 裡臨時儲存 SD 設定資料
blhost -u -- fill-memory 0x20202000 0x4 0xD0000001 // 1bit, Normal Speed,uSDHC1

// 使用 SD 設定資料去設定 uSDHC 介面
blhost -u -- configure-memory 0x120 0x20202000

  上述 fill-memory 命令中 0xD0000001 引數即是簡化的 4byte 設定資料,這個設定資料組織詳見下表:

  上表 4byte 資料提供的設定資訊主要是 SD 連線以及屬性設定。configure-memory 命令執行成功之後,底下只需要將 Bootable image 從 SD 偏移 0x400 地址處開始下載即可,具體步驟如下:

// 擦除 SD 並將 image 下載進 SD
blhost -u -- flash-erase-region 0x400 0x20000 0x120
blhost -u -- write-memory 0x400 bt_image.bin 0x120

  當然以上所有繁雜的命令列操作都可以使用 MCUBootUtility 工具(v3.5及以上)來一鍵完成:

五、進入SD/eMMC啟動模式

  Application 已經被成功下載進 SD 卡之後,此時我們便可以開始設定晶片從 SD 啟動。

  先確定 BOOT_MODE[1:0]=2'b10,即晶片處於 Internal Boot 模式,再來選擇 Boot Device,Boot Device 由 BOOT_CFG1[7:4] 這四個 pin 的輸入狀態決定,其中 SD 啟動模式為 4'b01xx。

六、設定eFuse啟動SD/eMMC

  設定好晶片啟動模式是從 SD 啟動之後,我們還需要最後關注一下與 SD/eMMC 相關的具體特性設定,主要集中在晶片內部 eFuse 0x470 - 0x450 區域裡,預設全 0 值適用 3.3V SD 卡工作在 1bit Normal Speed 模式,有需要的話切換到 4bit SDR104 更快速度模式也是可以的。

七、幾個注意事項

  1. RT 四位數與 RT 三位數在 uSDHC 編號上不同,RT 四位數是 uSDHC1-2, 而 RT 三位數則是 uSDHC0-1,這反映在第四節 option.instance 設定裡。
  2. eMMC 協定是向下相容 SD 協定的,因此如果使用一塊 MicroSD 轉 eMMC 小卡插進官方 EVK 板的 SD 卡槽做測試,那麼啟動模式不管是 SD 1/4bit 或者 eMMC 4bit 模式均是能正常啟動 eMMC 程式的。
  3. 在 MIMXRT1170-EVKB Rev.B 板卡上,需要設定成 4bit 模式(BOOT_CFG2[1]=1)才能正常啟動 SD 卡里程式。

  上述所有步驟全部完成之後,復位晶片你就應該能看到你放在 SD 裡的 Application 已經正常地啟動了。

  至此,恩智浦i.MXRT1xxx系列MCU的SD/eMMC卡啟動痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時釋出到我的 部落格園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

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