

痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(7)- 从SD/eMMC启动 - 痞子衡
source link: https://www.cnblogs.com/henjay724/p/16001983.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦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主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。
最后欢迎关注痞子衡个人微信公众号【痞子衡嵌入式】,一个专注嵌入式技术的公众号,跟着痞子衡一起玩转嵌入式。
衡杰(痞子衡),目前就职于恩智浦MCU系统部门,担任嵌入式系统应用工程师。
专栏内所有文章的转载请注明出处:http://www.cnblogs.com/henjay724/
与痞子衡进一步交流或咨询业务合作请发邮件至 [email protected]
可以关注痞子衡的Github主页 https://github.com/JayHeng,有很多好玩的嵌入式项目。
关于专栏文章有任何疑问请直接在博客下面留言,痞子衡会及时回复免费(划重点)答疑。
痞子衡邮箱已被私信挤爆,技术问题不推荐私信,坚持私信请先扫码付款(5元起步)再发。
Recommend
-
17
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是 利用IAR自带CRC完整性校验功能的一次实践(为KBOOT加BCA) 。 痞子衡之前写过两篇关于IAR中自带CRC校验功能的文章
-
6
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家分享的是IAR内部C-SPY调试组件配套宏文件(.mac)用法。 痞子衡之前写过一篇 《JLink Script文...
-
6
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是系统看门狗WDOG1在i.MXRT1xxx系统启动中的应用及影响。 软件看门狗模块(WDOG)在 MCU 应用里可以说是非常基础的功能模块。对于一个产品级的应...
-
5
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的QPI/OPI模式。 我们知道 Flash 读时序里有五大子序列 CMD + ADDR + MODE + DUMMY + READ,前面的文章中痞子衡讲过
-
4
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT10xx系列MCU外接24MHz晶振的作用。 痞子衡之前写过一篇关于时钟引脚的文章
-
5
痞子衡嵌入式:对比恩智浦全系列MCU(包含Kinetis/LPC/i.MXRT/MCX)的GPIO电平中断设计差异 - 痞子衡 - 博客园 大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦全系列MCU(包含Kinetis, L...
-
9
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设。 关于 i.MXRT1xxx 系列芯片 BootROM 中集成的 DCD 功能这个话题,...
-
5
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MXRT1xxx系列MCU的SD/eMMC卡启动。 最近在恩智浦官方社区上支持了一个关于 i.MXRT 从 SD 卡启动的案例,这让痞子衡...
-
6
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1xxx上第三级启动保障 - SDMMC manufacture模式。 如果你在 i.MXRT1xxx 板卡上尝试过从 SD/eMMC 卡启动,你会发现一...
-
3
痞子衡嵌入式:借助i.MXRT10xx系列INIT_VTOR功能可以缩短程序热重启时间 ...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK