大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MXRT1xxx系列MCU的SD/eMMC卡啟動。 最近在恩智浦官方社區上支持了一個關於 i.MXRT 從 SD 卡啟動的案例,這讓痞子衡想起了一年前寫過的一篇《i.MXRT600從SD/eMMC啟動》,那一篇重點介紹了基於 ...
大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦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 更快速度模式也是可以的。
七、幾個註意事項
- RT 四位數與 RT 三位數在 uSDHC 編號上不同,RT 四位數是 uSDHC1-2, 而 RT 三位數則是 uSDHC0-1,這反映在第四節 option.instance 設置里。
- eMMC 協議是向下相容 SD 協議的,因此如果使用一塊 MicroSD 轉 eMMC 小卡插進官方 EVK 板的 SD 卡槽做測試,那麼啟動模式不管是 SD 1/4bit 或者 eMMC 4bit 模式均是能正常啟動 eMMC 程式的。
- 在 MIMXRT1170-EVKB Rev.B 板卡上,需要設置成 4bit 模式(BOOT_CFG2[1]=1)才能正常啟動 SD 卡裡程式。
上述所有步驟全部完成之後,複位晶元你就應該能看到你放在 SD 里的 Application 已經正常地啟動了。
至此,恩智浦i.MXRT1xxx系列MCU的SD/eMMC卡啟動痞子衡便介紹完畢了,掌聲在哪裡~~~
歡迎訂閱
文章會同時發佈到我的 博客園主頁、CSDN主頁、知乎主頁、微信公眾號 平臺上。
微信搜索"痞子衡嵌入式"或者掃描下麵二維碼,就可以在手機上第一時間看了哦。
最後歡迎關註痞子衡個人微信公眾號【痞子衡嵌入式】,一個專註嵌入式技術的公眾號,跟著痞子衡一起玩轉嵌入式。
衡傑(痞子衡),目前就職於某知名外企半導體公司MCU系統部門,擔任嵌入式系統應用工程師。
專欄內所有文章的轉載請註明出處:http://www.cnblogs.com/henjay724/
與痞子衡進一步交流或咨詢業務合作請發郵件至 [email protected]
可以關註痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式項目。
關於專欄文章有任何疑問請直接在博客下麵留言,痞子衡會及時回覆免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。