大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦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主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。