大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦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主页知乎主页微信公众号 平台上。

微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。

痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(7)- 从SD/eMMC启动的更多相关文章

  1. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU开发那些事 - 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是恩智浦i.MX RTxxx系列微控制器相关知识. 恩智浦半导体于2018年10月发布的i.MX RTxxx系列开启了ML/AI MCU ...

  2. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU特性那些事(1)- 概览

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的基本特性. 恩智浦半导体于2017年开始推出的i.MX RT系列重新定义了MCU,其第一款芯片i. ...

  3. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU开发那些事 - 索引

    大家好,我是痞子衡,是正经搞技术的痞子.本系列痞子衡给大家介绍的是飞思卡尔Kinetis系列微控制器相关知识. 飞思卡尔半导体(现恩智浦半导体)于2010年开始推出的Kinetis系列昭示着ARM C ...

  4. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU特性介绍(2)- RT685EVKA性能实测(Dhrystone)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的性能. 在前面的文章 i.MXRTxxx微控制器概览 里,痞子衡给大家简介过恩智浦半导体在2018 ...

  5. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(3)- Serial ISP模式(blhost)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Serial ISP模式. 在上一篇文章 Boot配置(ISP Pin, OTP) 里痞子衡为大家 ...

  6. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(4)- OTP及其烧写方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的OTP. 在i.MXRTxxx启动系列第二篇文章 Boot配置(ISP Pin, OTP) 里痞子 ...

  7. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(8)- 从Serial(1-bit SPI) NOR恢复启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的1-bit SPI NOR恢复启动. 在前几篇里痞子衡介绍的Boot Device都属于主动启动的 ...

  8. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(1)- Boot简介

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的BootROM功能简介. 截止目前为止i.MX RTxxx系列已公布的芯片仅有一款i.MXRT60 ...

  9. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(2)- Boot配置(ISP_Pin, OTP)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRTx ...

  10. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(6.1)- FlexSPI NOR连接方式大全(RT600)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT600的FlexSPI NOR启动的连接方式. 痞子衡前段时间一鼓作气写完了三篇关于i.MXRT1xxx系列Flex ...

随机推荐

  1. 如何添加自己的code snippet

    好了我们开始说吧 1.先建一个后缀名为.sublime-snippet的文件

  2. ROS::message_filters中的一个报错(mt::TimeStamp……)

    『方便检索』 ros::Time msg_time = mt::TimeStamp<typename mpl::at_c<Messages, i>::type>::value( ...

  3. Linux基础入门笔记

    今天带来Linux入门的一些基础的笔记,科班出身的同学们,Linux已经成为了必修课了,下面我带来关于Linux的相关入门知识以及Linux简单的介绍! Linux内核最初只是由芬兰人林纳斯·托瓦兹( ...

  4. [GWCTF 2019]babyvm re

    BABYVM 基于虚拟机操作的一个题 明面上的check函数和加密逻辑都是假的 操作码 重点分析这个vm 0xF5, 0xF1, 0xE1, 0x00, 0x00, 0x00, 0x00, 0xF2, ...

  5. 关于sys.path.append()

    当我们导入一个模块时:import  xxx,默认情况下python解析器会搜索当前目录.已安装的内置模块和第三方模块,搜索路径存放在sys模块的path中: >>> import  ...

  6. Dump Lsass内存转储新旧方法

      之前看到一篇关于Lsass内存dump的文章,学习记录一下.   lsass.exe(Local Security Authority Subsystem Service)进程空间中,存有着机器的 ...

  7. 利用 kubeasz 给 suse 12 部署 kubernetes 1.20.1 集群

    文章目录 1.前情提要 2.环境准备 2.1.环境介绍 2.2.配置静态网络 2.3.配置ssh免密 2.4.批量开启模块以及创建文件 2.5.安装ansible 2.5.1.安装pip 2.5.2. ...

  8. DBLink的使用(从A库使用SQL查询B库的数据)

    DBLink的使用 情景:今天我需要从A数据库查询B数据库的数据,进行一些数据比对和联合查询的操作. 所以用到的DBLink,在此记录一下使用流程,希望能够帮助下一个小白,一步到位的解决问题. 一句话 ...

  9. JAVA8学习——Stream底层的实现四(学习过程)

    Stream的深入(四) 从更高角度去看一下:类与类之间的设计关系 (借助IDEA的图形处理工具 Ctrl+Alt+U). ReferencePipeline的三个实现的子类: Head Statel ...

  10. nginx拒绝国外IP访问

    nginx拒绝国外IP访问方法很多,比如iptables,geoip模块,域名解析等等.这些方法不会相互冲突,可以结合起来一起使用. 今天来教大家利用两个小方法解决  域名解析禁止掉海外IP访问网站. ...