痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU啟動那些事(7)- 從SD/eMMC啟動
- 2022 年 3 月 13 日
- 筆記
- D1.單片機i.MXRT-CM33
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MXRTxxx系列MCU的SD/eMMC卡啟動。
關於 i.MXRT 啟動設備,痞子衡之前寫過很多篇文章,都是關於串並行 NOR/NAND Flash。相信對於 Flash 的原理和讀寫擦訪問,玩 MCU 的朋友一定不會陌生,但是說到讓 MCU 從 SD/eMMC 卡啟動,估計很多人都是一臉懵,這個在 MCU 世界裡沒怎麼見過啊。
從 SD/eMMC 啟動其實在 MPU(應用處理器) 世界裡非常常見,因為其更換應用程式的便利性,以及文件系統的廣泛支援。恰好 i.MXRT 系列又是引領跨界風潮的 MCU,所以支援從 SD/eMMC 啟動在 i.MXRT 上就顯得那麼自然和合理。話不多說,今天痞子衡就帶你見識一下:
一、支援的SD/eMMC
i.MXRTxxx 系列內部有一個名為 uSDHC 的強大外設,通過它能夠訪問 MMC/SD/SDIO 三類卡,BootROM 里關於 SD/eMMC 的啟動支援就是藉助這個 uSHDC 外設:
• Conforms to the SD Host Controller Standard Specification version 2.0/3.0
• Compatible with the MMC System Specification version 4.2/4.3/4.4/4.41/4.5/5.0
• Compatible with the SD Memory Card Specification version 3.0 and supports the Extended Capacity SD Memory Card
• Compatible with the SDIO Card Specification version 2.0/3.0
• Designed to work with SD Memory, miniSD Memory, SDIO, miniSDIO, SD Combo, MMC, MMC plus, and MMC RS cards
• Card bus clock frequency up to 208 MHz.
• Supports 1-bit / 4-bit SD and SDIO modes, 1-bit / 4-bit / 8-bit MMC modes.
僅對於 uSDHC 介面啟動而言,選擇 SD/eMMC 操作流程是差不多的。因為 i.MXRT500 BootROM 僅支援 eMMC 設備,而 i.MXRT600 BootROM 同時支援 SD 和 eMMC 設備,所以本文主要就以 i.MXRT600 從 eMMC 啟動為例來具體介紹今天的主題。i.MXRT600 BootROM 主要實現了以下的 eMMC 類型卡支援:
(e)MMC 卡類型:
• eMMC Version 5.0 or earlier version.
• MMC Version 4.4 or earlier version.
(e)MMC 卡模式.
• eMMC/MMC: 4-bit/8-bit; full speed SDR(26MHz), high speed SDR/DDR(52MHz).
• eMMC Version 4.4 or later version: fast boot is supported.
因為官方 MIMXRT685-EVK 上並沒有 eMMC 晶片,痞子衡找了塊內部使用的 RT600_BGA176_Chip_RevB0_Rev.C 板卡來做測試,這塊板卡上在 i.MXRT600 uSDHC0 上連接了一顆來自 Kioxia 的 THGBMNG5D1LBAIT 晶片(eMMC 5.0,容量 4GB,最高速率 400MB/s)。
二、SD/eMMC硬體連接
i.MXRT500/600 內部都有 2 個 uSDHC 模組(註:uSDHC1 可能在一些小封裝上沒有引出),BootROM 支援如下 pinmux(適用RT500/600)來連接 SD/eMMC 卡去啟動。i.MXRT500 上這兩組 uSDHC 都可以連 eMMC(僅 uSDHC0 支援 HS400 模式),i.MXRT600 上這兩組 uSDHC 也都可以連接 SD/eMMC:
如下是 RT600_BGA176_Chip_RevB0_Rev.C 板上 eMMC 連接設計:
三、SD/eMMC載入啟動過程
SD/eMMC 設備本質上屬於 NAND,而 NAND 天生不支援 XiP,所以在 SD/eMMC 中僅能放置 Non-XIP Application(鏈接到內部 SRAM 或者 外部 RAM 空間),並且 SD/eMMC 又已經簡化了 NAND 訪問,因此從 SD/eMMC 啟動載入流程其實跟 《從 Serial(1-bit SPI) NOR恢復啟動》 載入流程差不多的(參考文章第 3 小節)。
i.MXRTxxx BootROM 給全部支援的設備定義了統一的 Application 偏移地址。對於 eMMC 設備,起始偏移一般要存放系統 main boot record (MBR),因此需要讓開,所以 BootROM 會從偏移 0x1000 地址處(byte address, block index 8)讀取 image header 數據(一共64個位元組),找到其中的 imageLength 和 imageLoadAddress ,這樣就知道了 Application 載入起始地址以及總長度,然後再將 Application 全部拷貝到相應 SRAM 里去啟動。
四、下載Application進SD/eMMC
理解了 SD/eMMC 載入啟動過程,我們便可以開始使用 BootROM 的 Serial ISP 模式去下載 Application 進 SD/eMMC 設備中。痞子衡在啟動系列文章的第三篇 《Serial ISP模式(blhost)》) 里介紹了 Serial ISP 模式的使用,現在假定你已經製作好一個 Bootable image 並且使用 blhost 工具與 BootROM 的 Serial ISP 模式建立了基本通訊,正要開始將 Bootable image 下載進 SD/eMMC 設備。
此時我們只需要提供簡化的 8byte 數據就可以完成 SD/eMMC 設備的配置,下面是一種 Application 下載更新示例(該示例適用於 uSDHC0 介面連接的 THGBMNG5D1LBAIT):
// 在 SRAM 里臨時存儲 eMMC 配置數據
blhost -u 0x1fc9,0x0020 -- fill-memory 0x10C000 0x4 0xC0010100 // 4bit SDR, Normal Speed
blhost -u 0x1fc9,0x0020 -- fill-memory 0x10C004 0x4 0x0 // uSDHC0, 3.3V
// 使用 eMMC 配置數據去配置 uSDHC0 介面
blhost -u 0x1fc9,0x0020 -- configure-memory 0x121 0x10C000
在上述示例里痞子衡首先使用了 fill-memory 命令在 0x10C000 地址處暫存了 8byte 配置數據,然後通過 config-memory 將這 8byte 數據里的資訊配置到 uSDHC0 介面中,實際上這 2 個命令成功執行後,你就可以開始使用 Serial ISP 命令下載 Bootable image 了。那麼這 8byte 配置數據到底是怎麼組織的?詳見下表:
從上表我們可以知道,其實這 8byte 數據提供的配置資訊主要是 eMMC 連接以及屬性配置。configure-memory 命令執行成功之後,底下 image 的下載很簡單,只需要將 Bootable image 從 eMMC 偏移 0x1000 地址處開始下載即可,具體步驟如下:
// 擦除 eMMC 並將 image 下載進 eMMC
blhost -u 0x1fc9,0x0020 -- flash-erase-region 0x0 0x20000 0x121
blhost -u 0x1fc9,0x0020 -- write-memory 0x1000 bt_image.bin 0x121
如果你覺得手動敲命令行太麻煩,也可以使用 MCUBootUtility 工具(v3.5及以上)來完成上述操作:
五、進入SD/eMMC啟動模式
Application 已經被成功下載進 eMMC 晶片之後,此時我們便可以開始設置晶片從 eMMC 啟動,結合 ISP pin 以及 OTP 里 PRIMARY_BOOT_SRC[3:0] 設置,一共有如下選擇(下表適用 i.MXRT600)。本次測試我們無需燒錄 OTP,只需要將 ISP[2:0] 設為 3’b100 – SDIO 0 (eMMC) 即可。
六、配置OTP啟動SD/eMMC
設置好晶片啟動模式是從 eMMC 備份啟動之後,我們還需要最後關注一下與 eMMC 相關的具體特性配置:
SD/eMMC 配置主要集中在主晶片內部 OTP BOOT_CFG[2] 和 BOOT_CFG[3] 區域里,下面是最主要的 BOOT_CFG[2 配置(下表適用 i.MXRT600),默認全 0 值適用 3.3V eMMC 設備且工作在 4bit SDR Normal Speed 模式,這個默認配置可以直接用於本次測試,因此我們無需燒寫 OTP(當然有需要的話改為 8bit 更快速度模式也是可以的)。
上述所有步驟全部完成之後,複位晶片你就應該能看到你放在 eMMC 里的 Application 已經正常地啟動了。
至此,恩智浦i.MXRTxxx系列MCU的SD/eMMC卡啟動痞子衡便介紹完畢了,掌聲在哪裡~~~
歡迎訂閱
文章會同時發布到我的 部落格園主頁、CSDN主頁、知乎主頁、微信公眾號 平台上。
微信搜索”痞子衡嵌入式“或者掃描下面二維碼,就可以在手機上第一時間看了哦。