大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是恩智浦i.MXRT1xxx系列MCU的SD/eMMC卡啟動(dòng)。
最近在恩智浦官方社區(qū)上支持了一個(gè)關(guān)于 i.MXRT 從 SD 卡啟動(dòng)的案例,這讓痞子衡想起了一年前寫(xiě)過(guò)的一篇《i.MXRT600從SD/eMMC啟動(dòng)》,那一篇重點(diǎn)介紹了基于 eMMC 設(shè)備制作程序、下載程序、啟動(dòng)程序的方法。雖然 SD 和 eMMC 在啟動(dòng)流程上差別不大,但是細(xì)節(jié)上還是有一些不同的。借此機(jī)會(huì),今天痞子衡再認(rèn)真捋一下 SD 卡上制作、下載、啟動(dòng)程序的方法:
Note:文中貼圖、代碼主要以 i.MXRT1050 為例,其余 i.MXRT1xxx 系列原理類似。
一、支持的SD/eMMC
i.MXRT 四位數(shù)和 i.MXRT 三位數(shù)用于訪問(wèn) SD/MMC 卡的外設(shè)是同一個(gè)即 uSDHC,外設(shè)本身能支持到 SD3.0。但是芯片 BootROM 里并不一定完全按 uSDHC 全功能來(lái)做實(shí)現(xiàn),i.MXRT1050 BootROM 主要實(shí)現(xiàn)了以下類型的 SD 卡啟動(dòng)支持:
?
? SDv2.0 or less ? eSDv2.10 rev-0.9, with or without FAST_BOOT ? SDXCv3.0
?
作為對(duì)比,i.MXRT600 BootROM 對(duì)于 SD 卡啟動(dòng)支持與 i.MXRT1050 則稍有不同:
?
? SD Version 3.0 or earlier version ? SD: 1-bit/4-bit; SDR12, SDR25, SDR50 and SDR104.
?
全系列 MIMXRT10xx-EVK 上均配置了 MicroSD 卡槽,均連接在了第一個(gè) uSDHC 端口上,所以我們測(cè)試 SD 啟動(dòng)還是非常方便的。
二、SD/eMMC硬件連接
除了 i.MXRT1010/1015 不包含 uSDHC 外設(shè)之外,其余 i.MXRT1xxx 內(nèi)部都有 2 個(gè) uSDHC 模塊(注:uSDHC2 可能在一些小封裝上沒(méi)有引出),i.MXRT1050 BootROM 支持如下 pinmux 來(lái)連接 SD/eMMC 卡去啟動(dòng):
如下是 IMXRT1050-EVKB_Rev.A 板上 SD 卡槽連接設(shè)計(jì),這個(gè)卡槽除了用來(lái)測(cè)試 SD 卡讀寫(xiě)啟動(dòng)之外,也可以通過(guò)連接 MicroSD 轉(zhuǎn) eMMC 適配器去測(cè)試啟動(dòng) eMMC(需工作在 1/4bit bus width mode):
三、SD/eMMC加載啟動(dòng)過(guò)程
我們知道 SD/eMMC 設(shè)備中僅能放置 Non-XIP Application(鏈接到內(nèi)部 SRAM 或者 外部 RAM 空間),其啟動(dòng)加載流程跟 《從 Serial(1-bit SPI) NOR/EEPROM恢復(fù)啟動(dòng)》 加載流程差不多(參考文章第 3 小節(jié))。
對(duì)于 SD 卡設(shè)備,起始偏移一般要存放系統(tǒng) main boot record (MBR),因此需要讓開(kāi),BootROM 會(huì)從固定偏移 0x400 地址處讀取 IVT 啟動(dòng)頭,有了 IVT 后面就能找到 Application 去加載啟動(dòng)了(在這里 RT 四位數(shù)和 RT 三位數(shù)是不一樣的)。
四、下載Application進(jìn)SD/eMMC
現(xiàn)在假定你已經(jīng)制作好一個(gè) Bootable image 并且使用 blhost 工具與 Flashloader 建立了基本通信,正要開(kāi)始將 Bootable image 下載進(jìn) SD 設(shè)備。此時(shí)我們只需要提供簡(jiǎn)化的 4byte 配置數(shù)據(jù)就可以完成 SD 設(shè)備的配置,下面是一種 Application 下載更新示例:
?
// 在 SRAM 里臨時(shí)存儲(chǔ) SD 配置數(shù)據(jù) blhost -u -- fill-memory 0x20202000 0x4 0xD0000001 // 1bit, Normal Speed,uSDHC1 // 使用 SD 配置數(shù)據(jù)去配置 uSDHC 接口 blhost -u -- configure-memory 0x120 0x20202000
?
上述 fill-memory 命令中 0xD0000001 參數(shù)即是簡(jiǎn)化的 4byte 配置數(shù)據(jù),這個(gè)配置數(shù)據(jù)組織詳見(jiàn)下表:
上表 4byte 數(shù)據(jù)提供的配置信息主要是 SD 連接以及屬性配置。configure-memory 命令執(zhí)行成功之后,底下只需要將 Bootable image 從 SD 偏移 0x400 地址處開(kāi)始下載即可,具體步驟如下:
?
// 擦除 SD 并將 image 下載進(jìn) SD blhost -u -- flash-erase-region 0x400 0x20000 0x120 blhost -u -- write-memory 0x400 bt_image.bin 0x120
?
當(dāng)然以上所有繁雜的命令行操作都可以使用 MCUBootUtility 工具(v3.5及以上)來(lái)一鍵完成:
五、進(jìn)入SD/eMMC啟動(dòng)模式
Application 已經(jīng)被成功下載進(jìn) SD 卡之后,此時(shí)我們便可以開(kāi)始設(shè)置芯片從 SD 啟動(dòng)。
先確定 BOOT_MODE[1:0]=2'b10,即芯片處于 Internal Boot 模式,再來(lái)選擇 Boot Device,Boot Device 由 BOOT_CFG1[7:4] 這四個(gè) pin 的輸入狀態(tài)決定,其中 SD 啟動(dòng)模式為 4'b01xx。
六、配置eFuse啟動(dòng)SD/eMMC
設(shè)置好芯片啟動(dòng)模式是從 SD 啟動(dòng)之后,我們還需要最后關(guān)注一下與 SD/eMMC 相關(guān)的具體特性配置,主要集中在芯片內(nèi)部 eFuse 0x470 - 0x450 區(qū)域里,默認(rèn)全 0 值適用 3.3V SD 卡工作在 1bit Normal Speed 模式,有需要的話切換到 4bit SDR104 更快速度模式也是可以的。
七、幾個(gè)注意事項(xiàng)
RT 四位數(shù)與 RT 三位數(shù)在 uSDHC 編號(hào)上不同,RT 四位數(shù)是 uSDHC1-2, 而 RT 三位數(shù)則是 uSDHC0-1,這反映在第四節(jié) option.instance 設(shè)置里。
eMMC 協(xié)議是向下兼容 SD 協(xié)議的,因此如果使用一塊 MicroSD 轉(zhuǎn) eMMC 小卡插進(jìn)官方 EVK 板的 SD 卡槽做測(cè)試,那么啟動(dòng)模式不管是 SD 1/4bit 或者 eMMC 4bit 模式均是能正常啟動(dòng) eMMC 程序的。
在 MIMXRT1170-EVKB Rev.B 板卡上,需要設(shè)置成 4bit 模式(BOOT_CFG2[1]=1)才能正常啟動(dòng) SD 卡里程序。
上述所有步驟全部完成之后,復(fù)位芯片你就應(yīng)該能看到你放在 SD 里的 Application 已經(jīng)正常地啟動(dòng)了。
至此,恩智浦i.MXRT1xxx系列MCU的SD/eMMC卡啟動(dòng)痞子衡便介紹完畢了,掌聲在哪里~~~
審核編輯:湯梓紅
評(píng)論
查看更多