读本篇博文所需要的先行知识

关于芯片内部的ROM的作用、工作原理的介绍,链接如下:
https://blog.csdn.net/wenhao_ir/article/details/145969584

eMMC技术标准是由JEDEC协会制定的【附PDF文档】

**eMMC(Embedded MultiMediaCard)**的标准是由 **JEDEC(Joint Electron Device Engineering Council,固态技术协会)**制定的。JEDEC 负责定义 eMMC 规范,包括数据传输模式、引脚定义、命令集、存储管理等。

目前常见的 eMMC 规范版本包括:

  • eMMC 4.41(2009年)
  • eMMC 4.5(2011年)
  • eMMC 5.0(2013年)
  • eMMC 5.1(2015年,目前常用)

最新的 eMMC 5.1 版本提供更高的读写速度、命令队列(CMDQ)、高优先级数据处理等功能。虽然 eMMC 仍然广泛用于嵌入式设备,但 UFS(Universal Flash Storage)正在逐步取代它,特别是在高端设备中。

JEDEC的官网如下:
https://www.jedec.org/

官网上关于eMMC 5.1 标准的PDF文档下载地址如下:
https://www.jedec.org/sites/default/files/docs/JESD84-B51.pdf

不过如果要下载的话先要注册,所以我就在另外的地方下载了eMMC 5.1 标准的PDF说明文档——JESD84-B51.pdf,这个文件的百度网盘下载地址如下:
https://pan.baidu.com/s/1G3VGY2-4uaynq8Fqvw9saA?pwd=vxj6

当出现人工智能的回答前后矛盾或与第三方资料不一致时,以JEDEC协会制定的技术标准为准。

eMMC的物理结构、特点、用途

这个标题的相关内容见我的另一篇博文,博文链接如下:
https://blog.csdn.net/wenhao_ir/article/details/145367399

eMMC设备的存储区域结构

eMMC(Embedded MultiMediaCard)是一种嵌入式存储设备,符合JEDEC(Joint Electron Device Engineering Council)标准,广泛用于嵌入式系统,如智能手机、单板计算机和工业设备。eMMC的存储区域结构主要包括以下部分:


1. Boot Partition(引导分区)

  • 作用:用于存储引导加载程序(如U-Boot),系统启动时可以直接从该区域加载引导代码。当系统上电复位后,SoC(处理器)内部的 ROM Code(BootROM) 会检测 eMMC 设备,并尝试从 Boot 分区 读取 Bootloader。
  • 特点
    • eMMC通常提供两个Boot分区Boot Partition 1Boot Partition 2)。
    • 每个Boot分区的大小通常是固定的(如128KB、512KB或4MB,取决于eMMC规格)。
    • 可以通过EXT_CSD[179] BOOT_CONFIG配置哪个Boot分区用于启动。关于EXT_CSD[179] BOOT_CONFIG的详细介绍见本博文后面。
    • 只能通过特殊方式(如u-boot中的eMMC命令mmc bootpart enable或 Linux 系统下的命令dd if=uboot.img of=/dev/mmcblkXboot0)写入。
    • 不能用于普通数据存储。

2. RPMB(Replay Protected Memory Block,防重放保护存储区)

  • 作用
    • 主要用于存储安全相关数据,例如加密密钥、认证信息、防篡改数据等。
    • 具有防重放保护机制,可防止存储数据的回滚攻击。防重放保护通常是指防止攻击者通过回滚存储器内容,恢复到较早的状态,从而绕过安全检查或重现旧的、可能已被撤销的凭据。
  • 特点
    • 只能通过安全认证的方式访问,不能像普通块设备一样读写。
    • 通常容量较小,例如512KB或更大。
    • 不能直接挂载或用于普通存储。

3. General Purpose Partitions(通用分区)

  • 作用
    • 额外的可由用户定义的分区,可用于存储操作系统、应用程序或其他数据。
  • 特点
    • eMMC允许创建最多4个通用分区。
    • 大小可配置,但一旦分配就不能动态调整。
    • 适用于某些特殊用途,例如存放文件系统、日志或者特定数据。

4. User Data Area(用户数据区域)

  • 作用
    • 主要存储操作系统、根文件系统、用户数据等。
  • 特点
    • 这个区域是eMMC中容量最大的部分,相当于普通SD卡的存储空间。
    • 可以划分多个逻辑分区(如ext4、FAT等)。
    • 直接映射为Linux设备,例如 /dev/mmcblkX(裸设备)或 /dev/mmcblkXpY(分区)。
    • 采用可磨损均衡(Wear Leveling)坏块管理机制,以提高eMMC的寿命和稳定性。

5. Enhanced User Data Area(增强型用户数据区)

  • 作用
    • 允许将部分User Data Area转换为SLC模式,以提升写入寿命和可靠性。
  • 特点
    • 通过配置EXT_CSD寄存器来分配。
    • 牺牲存储容量换取更高的耐久性。
    • 适用于高频写入的数据,如日志、数据库等。

6.eMMC分区示意图与相关说明

eMMC分区示意图

+----------------------+ 0x00000000
| Boot Partition 1    |  (大小固定,如4MB)
+----------------------+
| Boot Partition 2    |  (大小固定,如4MB)
+----------------------+
| RPMB Partition      |  (大小固定,如512KB)
+----------------------+
| General Purpose 1   |  (可选)
+----------------------+
| General Purpose 2   |  (可选)
+----------------------+
| General Purpose 3   |  (可选)
+----------------------+
| General Purpose 4   |  (可选)
+----------------------+
| User Area      |  (最大存储区域)
+----------------------+ 0xFFFFFFFF

eMMC通常存储容量有多大?我开发析上的eMMC容易有多大?

从上面的分区示意图可以看出,其寻址空间为0x00000000~0xFFFFFFFF,一共有8个F,即32位,32位刚好对应的是4GB,所以eMMC通常的存储容量是4GB大小。我的开发板也正是4GB大小的eMMC,如下图所示:
在这里插入图片描述
在核心版的原理图中(文件MYC-Y6ULX1211.pdf)中搜索“eMMC”得到如下结果:
在这里插入图片描述
然后查看板子的丝印文件(100ask_imx6ull_PRO_V11_silktop(丝印图).pdf):
在这里插入图片描述
所在eMMC芯片在硬件实物中的位置如下图所示:
在这里插入图片描述

各种情况下的分区编号和名字问题

这个问题很重要,所以我专门另写了一篇博文,详情见
https://blog.csdn.net/wenhao_ir/article/details/146088727

这个问题很重要,所以我专门另写了一篇博文,详情见
https://blog.csdn.net/wenhao_ir/article/details/146088727

eMMC启动过程的两个阶段

读下面的内容的时候会涉及到EXT_CSD[179] 这个重要的配置寄存器字节,下个目录正是对EXT_CSD[179] 的介绍。

eMMC 启动过程通常分为两个阶段:

1. Boot 读取阶段(ROM Code 加载 Bootloader)

  • 触发方式:当系统上电复位后,SoC(处理器)内部的 ROM Code(BootROM) 会检测 eMMC 设备,并尝试从 Boot 分区 读取 Bootloader。
  • 数据来源:由 EXT_CSD[179] (BOOT_PARTITION_ENABLE) 决定,可能是:
    • Boot 分区 1
    • Boot 分区 2
    • User Area(少见)
  • 数据传输模式
    • 普通模式(默认):SoC 使用 eMMC 标准读命令(如 CMD17)。
    • 快速启动模式(eMMC 4.4+ 支持):eMMC 直接将 Boot 分区数据发送到 SoC,无需主机发送额外的读命令。
  • Boot Acknowledge(可选):如果 EXT_CSD[179].BOOT_ACK=1,eMMC 会在 Boot 过程中发送确认信号。

2. 正常数据操作阶段(OS 加载并运行)

  • Bootloader 运行后,它会进一步初始化硬件,并从 eMMC 加载 OS(如u-boot 或 Linux)。
  • 访问数据区域:操作系统通过标准 eMMC 命令访问 User Area其他分区,此时访问的数据分区称为叫当前访问分区(也称为叫“当前活动分区”)。
  • 分区切换
    • PARTITION_ACCESS(EXT_CSD[179] 低 3 位)控制当前访问的分区(当前活动分区)为哪个分区。
    • 默认 OS 访问 User AreaPARTITION_ACCESS=0x0)。
    • 若 OS 需要访问 Boot 分区或 RPMB,则需修改EXT_CSD[179]PARTITION_ACCESS字段。

eMMC的EXT_CSD[179] BOOT_CONFIG是什么东西?

名字来源

EXT_CSD这个名字的来源是Extended CSDCSDCard-Specific Data的缩写,直译为“卡指定数据”,即为为设置存储卡指定的数据,实际上就是存储器的寄存器。
所以我们通常说:“eMMC 设备的 EXT_CSD寄存器。”

eMMC 设备的 EXT_CSD寄存器是一个 512 字节大小的寄存器空间,用于存储 eMMC 设备的各种扩展配置参数。EXT_CSD[179] 表示 EXT_CSD 寄存器的第 179 个字节(从 0 开始计算)。在 eMMC 规格中,EXT_CSD[179] 这个字节被定义为 BOOT_CONFIG(引导配置),所以出现了标题中的EXT_CSD[179] BOOT_CONFIG这个名字。

EXT_CSD[179](BOOT_CONFIG)寄存器的各字段解析

chatgpt、deepseek、文心一言对EXT_CSD[179]各字段的解释都不准确或是错的,所以直接查看“eMMC-5.1的技术标准的说明文档(JESD84-B51.pdf)”,这个文档的百度网盘下载地址如下:
https://pan.baidu.com/s/1G3VGY2-4uaynq8Fqvw9saA?pwd=vxj6

文档的224页有对 EXT_CSD[179]各字段的详细解释,如下:
在这里插入图片描述
在这里插入图片描述

Bit 7: Reserved
Bit 6: BOOT_ACK (R/W/E)
0x0 : No boot acknowledge sent (default)
0x1 : Boot acknowledge sent during boot operation Bit
Bit[5:3] : BOOT_PARTITION_ENABLE (R/W/E)
User selects boot data that will be sent to master
0x0 : Device not boot enabled (default)
0x1 : Boot partition 1 enabled for boot
0x2 : Boot partition 2 enabled for boot
0x3–0x6 : Reserved
0x7 : User area enabled for boot
Bit[2:0] : PARTITION_ACCESS (before BOOT_PARTITION_ACCESS, R/W/E_P)
User selects partitions to access
0x0 : No access to boot partition (default)
0x1 : R/W boot partition 1
0x2 : R/W boot partition 2
0x3 : R/W Replay Protected Memory Block (RPMB)
0x4 : Access to General Purpose partition 1
0x5 : Access to General Purpose partition 2
0x6 : Access to General Purpose partition 3
0x7 : Access to General Purpose partition 4

根据以上说明对EXT_CSD[179]详细介绍如下:

EXT_CSD[179]PARTITION_CONFIG)是 eMMC 设备的 扩展 CSD(Extended CSD)寄存器中的一个字节,主要用于配置 启动(Boot) 相关设置和 分区访问控制。它的各字段含义如下:

字段解析

Bit 位 字段名称 属性 描述
Bit 7 Reserved - 保留位,未使用,写配置值时这一位写为0即可
Bit 6 BOOT_ACK R/W/E 设置是否在启动时发送 Boot Acknowledge信号
0x0:不发送 Boot Acknowledge(默认)
0x1:启动时 eMMC 发送 Boot Acknowledge信号
Bit [5:3] BOOT_PARTITION_ENABLE R/W/E 选择哪个 Boot 分区作为启动数据源
0x0:设备未启用 Boot(默认)
0x1:Boot 分区 1 作为启动数据
0x2:Boot 分区 2 作为启动数据
0x3–0x6:保留
0x7:User Area(用户区)作为启动数据
Bit [2:0] PARTITION_ACCESS R/W/E_P 选择当前访问(当前活动)的 eMMC 分区
0x0:不访问 Boot 分区(默认)(即默认情况下访问的是普通用户数据区)
0x1:访问 Boot 分区 1(可读写)
0x2:访问 Boot 分区 2(可读写)
0x3:访问 RPMB(Replay Protected Memory Block)
0x4:访问通用分区 1(General Purpose Partition 1)
0x5:访问通用分区 2
0x6:访问通用分区 3
0x7:访问通用分区 4

字段说明

  1. BOOT_ACK(Bit 6)

    • 用于控制 eMMC 在 启动阶段(Boot Operation) 是否发送 Boot Acknowledge(ACK) 信号。
    • 设为 1 时,eMMC 会在 Boot 过程中发送一个确认信号给主机,以指示 Boot 过程的开始。
    • 设为 0(默认)时,不发送 ACK。
  2. BOOT_PARTITION_ENABLE(Bit 5:3)

    • 选择哪个分区作为Boot 分区。当系统上电复位后,SoC(处理器)内部的 ROM Code(BootROM) 会检测 eMMC 设备,并尝试从 Boot 分区 读取 Bootloader。
    • eMMC 设备通常具有两个 Boot 分区(Boot Partition 1 和 Boot Partition 2)。
    • 可以选择使用 Boot 分区 1、Boot 分区 2,或者直接从 User Area(用户区) 启动。
  3. PARTITION_ACCESS(Bit 2:0)

    • 控制当前访问的 eMMC 分区(即哪个分区作为前活动分区)。本博文前面我已经介绍了eMMC启动的两个阶段(请务必去看下前面的内容再看这里),这个PARTITION_ACCESS字段实际上就是控制当eMMC 进入了正常数据操作阶段后当前活动的分区是哪个。比如当u-boot或Linux启动后,到底是对eMMC的哪个分区进行操作?到底是从eMMC的哪个分区读取数据?就由这个PARTITION_ACCESS的值来决定。
    • 默认值 0x0 表示访问标准的 User Area(普通用户数据区)。
    • 可以切换到 Boot 分区 1 或 Boot 分区 2 进行读写。
    • 0x3 选择 RPMB(Replay Protected Memory Block),该区域常用于存储受保护的数据,比如安全密钥。
    • 0x40x7 允许访问 General Purpose(GP) 分区,这些分区可用于自定义用途。

应用示例
假设我们需要:

  • 从 Boot 分区 1 启动
  • 启用 Boot Acknowledge
  • 当前准备访问 Boot 分区 1 进行数据操作

那么 EXT_CSD[179] 的值应设置为:

BOOT_ACK = 1  (Bit 6 = 1)
BOOT_PARTITION_ENABLE = 0x1  (Bit [5:3] = 001)
PARTITION_ACCESS = 0x1  (Bit [2:0] = 001)

即:

0b 0100 1001  (0x49)

小结
EXT_CSD[179](PARTITION_CONFIG) 主要用于:

  1. 选择是否发送 Boot Acknowledge(Bit 6)。
  2. 选择哪个 Boot 分区作为启动数据来源(Bit 5:3)。
  3. 选择当前访问的分区(Bit 2:0)。

什么叫eMMC的 BOOT_ACK 响应?

BOOT_ACK(Boot Acknowledge,启动确认)是 eMMC 在 Boot 过程中提供的一个特殊的确认信号,用于指示 eMMC 设备已进入 Boot 模式,并准备好传输 Boot 数据了。

在 eMMC 设备的 EXT_CSD[179](BOOT_CONFIG)寄存器的 第 7 位(bit7) 控制是否启用 BOOT_ACK 机制:

  • BOOT_ACK = 0(默认) → 设备在 Boot 过程中不会发送 ACK 响应,主机必须自己确定 eMMC 是否进入了 Boot 模式。
  • BOOT_ACK = 1 → eMMC 在 Boot 过程开始时会发送一个 ACK 响应,通知主机 Boot 过程已启动。

BOOT_ACK 作用

  1. 确保 eMMC 进入 Boot 模式

    • BOOT_ACK 使能的情况下,主机(比如 BootROM 或 Bootloader)可以通过检测 ACK 确保 eMMC 正确进入 Boot 模式。
  2. 提高 Boot 稳定性

    • 某些平台在上电初始化时,需要确保 eMMC 设备正确响应 Boot 过程,否则可能会进入错误状态。
  3. 防止误读取数据

    • BOOT_ACK 使能后,主机不会误将未准备好的数据当作 Boot 数据读取。

eMMC BOOT_ACK 过程

  1. 主机复位并发送 Boot 启动命令

    • 发送 CMD0(GO_IDLE_STATE)并选择 Boot 模式。【关于 CMD0是怎么回事?请看本篇博文后面内容(搜索“eMMC的命令详解”和“关于 eMMC的CMD0命令选择Boot 模式的工作流程的详解”)。】
  2. eMMC 响应 BOOT_ACK(如果启用)

    • 设备进入 Boot 状态后,会返回 ACK,通知主机已准备好发送 Boot 数据。
  3. 主机开始接收 Boot 数据

    • 设备按照 Boot 配置传输 Boot 分区数据(通常是 BOOT_PARTITION_1BOOT_PARTITION_2)。

在 u-boot中如何查看和修改 EXT_CSD[179]的配置情况

详情见下面这篇博文
https://blog.csdn.net/wenhao_ir/article/details/146016551
搜索关键词“利用MMC子系统查看…”

在Linux系统下,如何读取EXT_CSD[179]的配置值?

在 Linux 设备中,可以查看 eMMC 的EXT_CSD[179]的配置值,用下面的命令即可:

mmc extcsd read /dev/mmcblk0 | grep BOOT_CONFIG

你应该会看到 EXT_CSD[179] 配置,例如:

BOOT_CONFIG = 0x48

其中:

  • 0x48 = 0b01001000
    • BOOT_ACK = 1(使能 Boot ACK)
    • BOOT_PARTITION_ENABLE = 01(Boot 分区 1)
    • BOOT_PARTITION_ACCESS = 00(无手动访问)

通过博文 https://blog.csdn.net/wenhao_ir/article/details/146088727可以知道,我的开发板的eMMC的User Area区在Linux系统中对应的设备节点名为mmcblk1,所以对于我的开发板,需要运行下面的命令:

mmc extcsd read /dev/mmcblk1 | grep BOOT_CONFIG

但运行结果如下:
在这里插入图片描述
这说明在读取/dev/mmcblk1的配置信息中,只搜索到一句话含有BOOT_CONFIG这个关键词,这句话如下:

Boot config protection [BOOT_CONFIG_PROT: 0x00]
  • BOOT_CONFIG_PROT 是 Boot 配置保护的寄存器,用于 保护 eMMC Boot 分区配置,防止意外修改。
  • 0x00 说明 Boot 配置保护未启用,你仍然可以修改 eMMC 的 Boot 分区配置。

也就是说没有出现我们期望的信息,看来如何在Linux系统中获取EXT_CSD[179]的配置值,还需要进一步研究, 但这个问题并不是本篇博文的重点,所以暂且把这个问题放在一边。


eMMC的哪些分区是不可调整的?哪些是可以调整的?

问:eMMC的存储区域是出厂时就划分好的,还是后来根据需要用工具或命令划分的?

答:

1. 出厂默认划分的区域

在 eMMC 出厂时,制造商已经预先划分了以下区域:

eMMC 区域 出厂时状态
Boot Partition 1 预设大小(如 4MB),无法调整
Boot Partition 2 预设大小(如 4MB),无法调整
RPMB Partition 预设大小(如 512KB),无法调整
User Data Area 整个剩余容量,可以重新分区
General Purpose Partitions(通用分区) 默认不存在,需要手动创建

2. 后续可手动调整的部分

虽然 Boot 分区和 RPMB 分区的大小是固定的,但用户可以使用工具或命令进行如下调整:

  1. 用户数据区(User Area)划分逻辑分区 → 用 fdiskparted 等工具对User Area区划分逻辑分区,如 /dev/mmcblk0p1(rootfs)、/dev/mmcblk0p2(data)。
  2. 创建通用分区(General Purpose Partitions) → 通过修改 eMMC 的 EXT_CSD 寄存器,将一部分用户数据区转换为通用分区。
  3. 转换部分用户数据区为增强型存储(Enhanced User Data Area, SLC模式) → 提升可靠性,但会减少容量。

eMMC的主要引脚功能介绍

eMMC(嵌入式多媒体卡)采用 BGA 封装,不同版本的 eMMC 可能有不同的引脚定义。一般来说,eMMC 主要使用 11 个信号引脚,支持 1-bit、4-bit 和 8-bit 数据总线模式。


1. eMMC 主要引脚功能

eMMC 采用 BGA-153、BGA-169 或 BGA-100 封装,以下是常见的引脚定义:

引脚名称 引脚编号 描述
VCC 供电引脚 核心电源(通常为 3.3V)
VCCQ 供电引脚 I/O 电源(1.8V 或 3.3V,根据工作模式)
VSS / GND 供电引脚 地线
CLK(Clock) 时钟信号 由主机提供时钟(最大 200MHz,HS400 模式下可达 400MHz)
CMD(Command) 命令信号 双向信号,用于主机和 eMMC 之间传输命令和响应
DAT0-DAT7(Data) 数据线 支持 1-bit(DAT0)、4-bit(DAT0-DAT3)、8-bit(DAT0~DAT7) 模式
RST_n(Reset) 复位信号 可选,用于硬件复位
DS(Data Strobe) 仅在 HS400 模式下使用 提高数据同步精度
NC(Not Connected) - 保留未使用的引脚

2. 详细引脚说明

(1)电源相关

  • VCC(核心电源):通常为 3.3V,部分低功耗 eMMC 可能支持 1.8V
  • VCCQ(I/O 电源)
    • 3.3V(常见于旧版 eMMC 4.3 及以下)
    • 1.8V(eMMC 4.5 及以上,低功耗模式)
  • VSS(GND):地线,必须连接到电源地。

(2)控制信号

  • CLK(时钟信号)
    • 由主机提供,用于同步数据传输。
    • 默认频率 0~26MHz,高速模式可达 52MHz,HS200/HS400 模式下可达 200MHz/400MHz
  • CMD(命令信号)
    • 由主机发送 eMMC 命令,eMMC 也可在该引脚上返回响应(双向)。
    • 逻辑上属于 开漏/推挽驱动
  • RST_n(复位信号,可选
    • 低电平复位 eMMC,部分 eMMC 可能不支持该引脚。

(3)数据传输

  • DAT0~DAT7(数据线)
    • DAT0:用于 1-bit 模式。
    • DAT0-DAT3:用于 4-bit 模式。
    • DAT0-DAT7:用于 8-bit 模式(通常用于 eMMC)。
    • 具有 内部上拉,在 空闲状态 下维持高电平。
  • DS(数据选通信号,HS400 模式专用)
    • 仅在 HS400 模式 下使用。
    • 作用:主机用于数据同步。

3. eMMC 数据模式

模式 使用的引脚 速率
1-bit 模式 CLK、CMD、DAT0 低速
4-bit 模式 CLK、CMD、DAT0-DAT3 中速
8-bit 模式 CLK、CMD、DAT0-DAT7 高速(推荐)

Linux/嵌入式系统中,eMMC 通常采用 8-bit 模式,以提高读写效率。


4. BGA-153 引脚排列示意图

典型的 BGA-153(11x11)封装 引脚示意:

   ____________________________
  |                            |
  |  DAT7  DAT6  DAT5  DAT4    |  ← 数据线
  |  VSS   VCCQ  CMD   CLK     |  ← 控制 & 电源
  |  DAT3  DAT2  DAT1  DAT0    |  ← 数据线
  |____________________________|

不同封装(BGA-100、BGA-153、BGA-169)的引脚排列可能有所不同,但信号功能基本相同。

5.关于eMMC没有地址线的说明(eMMC如何进行寻址)

1. eMMC 为何没有地址线?

在传统的并行存储器(如 NOR Flash、SRAM)中,CPU 需要使用 地址线(Address Bus) 选择存储单元,用 数据线(Data Bus) 进行读写。但 eMMC 采用 MMC(MultiMediaCard)协议,使用 CMD 命令接口 进行数据寻址,并通过 数据线(DAT0-DAT7) 传输数据,因此 不需要单独的地址线


2. eMMC 的寻址方式

eMMC 的寻址是基于 逻辑块地址(LBA, Logical Block Addressing),类似于硬盘(SD 卡也是同样的方式)。访问数据时:

  1. CPU 通过 CMD 发送读/写命令,指定要访问的 LBA 地址
  2. eMMC 内部的 Flash 控制器 解析 LBA 地址,将其映射到 NAND Flash 物理地址。
  3. 数据通过 DAT 线传输,并由 eMMC 内部管理 ECC、磨损均衡等。

Linux 访问 eMMC 时,通常把它当作块设备 /dev/mmcblk0,通过 ddfdisk 等工具进行分区和访问,而不是像 SRAM 那样直接使用地址线访问


eMMC的命令详解

eMMC(嵌入式多媒体卡)遵循 MMC(MultiMediaCard)协议,使用一套标准的 命令格式(Command Format) 来与主机(如处理器或控制器)进行通信。eMMC 的命令分为多种类型,并采用 48-bit 或 136-bit 的格式

1. eMMC 命令格式

eMMC 命令的基本格式如下:

名称 说明
47 起始位(Start Bit) 固定为 0
46 传输方向(Transmission Bit) 1 表示主机到设备,0 表示设备到主机
45:40 命令索引(Command Index) 6-bit 命令编号,如 CMD0000000
39:8 参数(Argument) 32-bit 参数,具体值因命令而异
7:1 CRC 校验(CRC7) 7-bit 循环冗余校验
0 结束位(End Bit) 固定为 1

注意

  • 该格式适用于 所有 48-bit 命令(最常见)。
  • CMD2 例外,它使用 136-bit 长响应,返回 CID 号(卡片标识)。

2. eMMC 命令类型

(1)基本命令

命令 名称 描述
CMD0 GO_IDLE_STATE 使 eMMC 进入空闲状态
CMD1 SEND_OP_COND 发送 OCR(操作条件寄存器),检查 eMMC 是否准备好
CMD2 ALL_SEND_CID 发送 eMMC 的唯一 ID 号
CMD3 SET_RELATIVE_ADDR 设置 eMMC 的 RCA(相对地址)
CMD6 SWITCH 切换 eMMC 的模式(如改变工作电压)
CMD7 SELECT/DESELECT_CARD 选中或取消选中某张 eMMC 卡

(2)读/写命令

命令 名称 描述
CMD8 SEND_EXT_CSD 读取 eMMC EXT_CSD(扩展寄存器)
CMD9 SEND_CSD 读取 eMMC CSD(卡片特性描述符)
CMD16 SET_BLOCKLEN 设置读写块大小
CMD17 READ_SINGLE_BLOCK 读取单个块
CMD18 READ_MULTIPLE_BLOCK 读取多个块
CMD24 WRITE_BLOCK 写入单个块
CMD25 WRITE_MULTIPLE_BLOCK 写入多个块

(3)数据传输命令

命令 名称 描述
CMD12 STOP_TRANSMISSION 停止多块传输
CMD13 SEND_STATUS 查询 eMMC 的状态
CMD23 SET_BLOCK_COUNT 预设多块传输的块数

3. eMMC 响应格式

eMMC 响应有 6 种类型:

  1. R1(正常响应):包含 eMMC 状态
  2. R2(CID/CSD 响应):136-bit 长响应
  3. R3(OCR 响应):包含操作条件寄存器
  4. R4(不常用)
  5. R5(不常用)
  6. R6(RCA 响应)

例如:

  • CMD2 返回 R2 响应(136-bit)
  • CMD1 返回 R3 响应(48-bit)
  • CMD13 返回 R1 响应(48-bit)

4. 数据传输格式

eMMC 读写数据时,数据通过 单线(1-bit)、4-bit 或 8-bit 模式 进行传输,通常格式如下:

  • 起始位
  • 数据块
  • CRC 校验
  • 停止位

eMMC 允许 单块或多块传输,多块传输可以提高读写效率。


5.小结

  • eMMC 采用 48-bit 标准命令格式,有 Start BitCommand IndexArgumentCRC7End Bit
  • 命令分为 初始化命令、数据传输命令、控制命令
  • 不同命令返回 不同格式的响应(R1、R2、R3等)
  • 数据传输支持 单块/多块模式,使用 CMD17/18 进行读取,CMD24/25 进行写入。

关于 eMMC的CMD0命令选择Boot 模式的工作流程的详解

上面一个目录已经详细介绍了eMMC的命令的相关知识,在此基础上,我们再来了解下CMD0命令对Boot模式的选择。

在 eMMC 设备的 Boot 过程 中,主机(Host,例如 CPU 或 BootROM)需要 复位 eMMC 并使其进入 Boot 模式,这个过程通常通过 CMD0(GO_IDLE_STATE)实现。


1. CMD0(GO_IDLE_STATE)命令的作用

CMD0 是 eMMC 规范中的一个标准命令,其作用是:

  • 让 eMMC 进入空闲(Idle)状态,类似于软复位(Software Reset)。
  • 可以附带参数来指定 eMMC 的 启动模式(Boot Mode)

在正常的数据模式下,CMD0 的参数通常是 0x00000000,表示让 eMMC 进入 Idle State(空闲状态)
但在 Boot 过程中CMD0 可以使用特定参数,使 eMMC 进入 Boot 模式 并准备传输 Boot 数据。


2. CMD0 选择 Boot 模式的参数

当系统启动时,BootROM 或 Bootloader 需要告诉 eMMC 进入 Boot 模式。
这通常通过 CMD0 命令 带上特定参数 来完成。

CMD0 参数值 含义
0x00000000 进入 空闲状态(Idle State),用于普通复位
0xFFFFFFFA 进入 Boot 操作模式(Boot Operation Mode)
0xFFFFFFF1 进入 备用 Boot 模式(Alternative Boot Mode)

其中,0xFFFFFFFA最常用的,因为它会让 eMMC 从 BOOT_PARTITION_ENABLE 指定的 Boot 分区启动。【 BOOT_PARTITION_ENABLE 是在EXT_CSD[179]中配置的,EXT_CSD[179]在前文已有详细介绍。】


3. 使用CMD0 进入 Boot 模式并启动u-boot的完整流程

步骤 1:上电并初始化 eMMC

  • 处理器上电后,eMMC 仍然处于 Inactive State(未激活状态),不会立即工作。
  • 处理器需要复位 eMMC,并配置 Boot 模式。

步骤 2:发送 CMD0 0xFFFFFFFA 进入 Boot 模式

  • BootROM 发送:
    CMD0 (0xFFFFFFFA)
    
  • eMMC 进入 Boot 模式,准备从 Boot 分区传输数据。

步骤 3:eMMC 发送 BOOT_ACK(可选)
如果 BOOT_ACK(EXT_CSD[179] Bit7)被启用:

  • eMMC 会发送一个 ACK 响应,通知主机已准备好发送 Boot 数据。

步骤 4:eMMC 传输 Boot 数据

  • eMMC 进入 Boot 传输模式,并从 EXT_CSD[179](BOOT_CONFIG)指定的 Boot 分区(BOOT_PARTITION_1BOOT_PARTITION_2发送 Boot 代码(通常是 Bootloader)。
  • 这个传输过程是 单向的,eMMC 只负责发送,主机通过 低速模式(默认 26MHz) 读取 Boot 数据。

步骤 5:主机加载 Boot 代码

  • BootROM 读取 eMMC 传输的 Boot 数据(如 u-boot)。
  • 如果数据有效,BootROM 跳转到 Boot 代码,继续启动操作系统。

常用的eMMC配置修改工具有哪些?

① u-boot可以修改eMMC的配置。
② Linux系统也可以修改eMMC的配置。
③ 注意:百问网基于NXP提供的uuu工具搞出的烧写工具在进行烧写准备前也可能去修改eMMC的配置。百问网提供的烧写工具的详细介绍见 https://blog.csdn.net/wenhao_ir/article/details/145653414 其实这个烧写工具本质上也是使用的u-boot,详情见 https://blog.csdn.net/wenhao_ir/article/details/145985144

u-boot对eMMC的管理

u-boot对eMMC管理的两个功能块

u-boot中有两个功能块对MMC(eMMC/SD)设备进行管理。
其中一个是fastboot、另一个是 MMC sub system(MMC子系统)。

fastboot主要是实现烧写数据的功能,而MMC子系统则拥有完整的命令集对MMC(eMMC/SD)设备进行管理.

fastboot也会调用MMC sub system的命令来实现其功能。关于这一点,详见我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/146012950【搜索“Fastboot 的PC端可利用FB”】

关于fastboot的介绍,请见我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/145985144

关于MMC sub system的介绍,请见我的另一篇博文:
https://blog.csdn.net/wenhao_ir/article/details/146016551

如何在u-boot中查看或修改eMMC的EXT_CSD[179]配置信息

详情见我的另一篇博文:
https://blog.csdn.net/wenhao_ir/article/details/146016551

Linux系统中如何管理eMMC

查看eMMC的配置寄存器的信息

cat /sys/class/mmc_host/mmc0/mmc0:0001/ext_csd

对于我的开发板而言,eMMC设备的编号值为1,但是下面这个目录:

/sys/class/mmc_host/mmc1/mmc1:0001

中,只有csd文件,没有ext_csd文件,如下图所示:
在这里插入图片描述
可见,如需在Linux下查看我的开发板的eMMC的ext_csd信息,还需要作进一步研究,这并不是本篇博文的重点,所以暂且不作进一步研究。

访问Boot分区

# 读取Boot分区
dd if=/dev/mmcblk0boot0 of=boot.img bs=1M

# 写入Boot分区(需启用写入)
echo 0 > /sys/block/mmcblk0boot0/force_ro
dd if=u-boot.img of=/dev/mmcblk0boot0 bs=1M

烧写u-boot的镜像文件到Boot partition 1Boot partition 2

嵌入式Linux应用开发完全手册V5.2_IMX6ULL_Pro开发板.pdf的第142页的截图如下:
在这里插入图片描述
在这里插入图片描述

如何查看eMMC的分区信息(设备文件名字、大小等)

这个问题在博文 https://blog.csdn.net/wenhao_ir/article/details/146088727 中进行了介绍,详情请在博文 https://blog.csdn.net/wenhao_ir/article/details/146088727 中搜索关键词“在Linux中的分区名字和编号问题”。

注意:这个内容比较重要,因为这涉及到u-boot传递给内核的环境变量bootargs的设置,环境变量bootargs会告诉内核根文件系统挂载在eMMC的当前活动分区(通常为User Area区)的哪个逻辑分区,怎么告诉,就通过逻辑分区名。详情见我的另一篇博文 https://blog.csdn.net/wenhao_ir/article/details/146051313 【搜索“用户数据区的逻辑分区的第2个分区”】

查看某个分区的文件系统类型

假设User Data分区的某个逻辑分区的名字为mmcblk1p2,则可用下面的命令查看它的文件系统类型:

blkid /dev/mmcblk1p2

运行结果如下:
在这里插入图片描述
可见,逻辑分区mmcblk1p2的文件系统类型是“ext4”类型。

格式化User Data分区

假设User Data分区的某个逻辑分区的名字为mmcblk1p2,则可用下面的命令对它进行格式化操作。

mkfs.ext4 /dev/mmcblk1p2

在Linux系统下,如何读取EXT_CSD[179]的配置值?

详情请搜索在本篇博文中搜索关键词:“在Linux系统下,如何读取EXT_CSD[179]的配置值”

扩展阅读

u-boot中的Fastboot(FB)协议介绍

https://blog.csdn.net/wenhao_ir/article/details/145985144

u-boot中的MMC子系统介绍

https://blog.csdn.net/wenhao_ir/article/details/146016551

百问网在uuu工具的基础上开发出的烧写工具的介绍

https://blog.csdn.net/wenhao_ir/article/details/145653414

Bootloader的三个阶段详解(BootROM、SPL、U-Boot)

https://blog.csdn.net/wenhao_ir/article/details/145999721

SPL和U-Boot合成镜像u-boot-dtb.imx时需要作填充数据处理

https://blog.csdn.net/wenhao_ir/article/details/145999721

关于eMMC存储器在各种情况下的分区编号和名字的问题

https://blog.csdn.net/wenhao_ir/article/details/146088727

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐