大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是恩智浦i.MXRT1xxx系列MCU的SD/eMMC卡啟動。
最近在恩智浦官方社群上支援了一個關於 i.MXRT 從 SD 卡啟動的案例,這讓痞子衡想起了一年前寫過的一篇《i.MXRT600從SD/eMMC啟動》,那一篇重點介紹了基於 eMMC 裝置製作程式、下載程式、啟動程式的方法。雖然 SD 和 eMMC 在啟動流程上差別不大,但是細節上還是有一些不同的。藉此機會,今天痞子衡再認真捋一下 SD 卡上製作、下載、啟動程式的方法:
- Note:文中貼圖、程式碼主要以 i.MXRT1050 為例,其餘 i.MXRT1xxx 系列原理類似。
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 啟動還是非常方便的。
除了 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 裝置中僅能放置 Non-XIP Application(連結到內部 SRAM 或者 外部 RAM 空間),其啟動載入流程跟 《從 Serial(1-bit SPI) NOR/EEPROM恢復啟動》 載入流程差不多(參考文章第 3 小節)。
對於 SD 卡裝置,起始偏移一般要存放系統 main boot record (MBR),因此需要讓開,BootROM 會從固定偏移 0x400 地址處讀取 IVT 啟動頭,有了 IVT 後面就能找到 Application 去載入啟動了(在這裡 RT 四位數和 RT 三位數是不一樣的)。
現在假定你已經制作好一個 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及以上)來一鍵完成:
Application 已經被成功下載進 SD 卡之後,此時我們便可以開始設定晶片從 SD 啟動。
先確定 BOOT_MODE[1:0]=2'b10,即晶片處於 Internal Boot 模式,再來選擇 Boot Device,Boot Device 由 BOOT_CFG1[7:4] 這四個 pin 的輸入狀態決定,其中 SD 啟動模式為 4'b01xx。
設定好晶片啟動模式是從 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/
與痞子衡進一步交流或諮詢業務合作請發郵件至 https://www.cnblogs.com/henjay724/p/[email protected]
可以關注痞子衡的Github主頁 https://github.com/JayHeng,有很多好玩的嵌入式專案。
關於專欄文章有任何疑問請直接在部落格下面留言,痞子衡會及時回覆免費(劃重點)答疑。
痞子衡郵箱已被私信擠爆,技術問題不推薦私信,堅持私信請先掃碼付款(5元起步)再發。