读本篇博文所需要的先行知识
关于芯片内部的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 1 和 Boot 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 分区 1Boot 分区 2User 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 Area(PARTITION_ACCESS=0x0)。若 OS 需要访问 Boot 分区或 RPMB,则需修改EXT_CSD[179] 的 PARTITION_ACCESS字段。
eMMC的EXT_CSD[179] BOOT_CONFIG是什么东西?
名字来源
EXT_CSD这个名字的来源是Extended CSD。CSD是Card-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 7Reserved-保留位,未使用,写配置值时这一位写为0即可Bit 6BOOT_ACKR/W/E设置是否在启动时发送 Boot Acknowledge信号0x0:不发送 Boot Acknowledge(默认)0x1:启动时 eMMC 发送 Boot Acknowledge信号Bit [5:3]BOOT_PARTITION_ENABLER/W/E选择哪个 Boot 分区作为启动数据源0x0:设备未启用 Boot(默认)0x1:Boot 分区 1 作为启动数据0x2:Boot 分区 2 作为启动数据0x3–0x6:保留0x7:User Area(用户区)作为启动数据Bit [2:0]PARTITION_ACCESSR/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:访问通用分区 20x6:访问通用分区 30x7:访问通用分区 4
字段说明
BOOT_ACK(Bit 6)
用于控制 eMMC 在 启动阶段(Boot Operation) 是否发送 Boot Acknowledge(ACK) 信号。设为 1 时,eMMC 会在 Boot 过程中发送一个确认信号给主机,以指示 Boot 过程的开始。设为 0(默认)时,不发送 ACK。 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(用户区) 启动。 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),该区域常用于存储受保护的数据,比如安全密钥。0x4 到 0x7 允许访问 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) 主要用于:
选择是否发送 Boot Acknowledge(Bit 6)。选择哪个 Boot 分区作为启动数据来源(Bit 5: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 作用
确保 eMMC 进入 Boot 模式
在 BOOT_ACK 使能的情况下,主机(比如 BootROM 或 Bootloader)可以通过检测 ACK 确保 eMMC 正确进入 Boot 模式。 提高 Boot 稳定性
某些平台在上电初始化时,需要确保 eMMC 设备正确响应 Boot 过程,否则可能会进入错误状态。 防止误读取数据
BOOT_ACK 使能后,主机不会误将未准备好的数据当作 Boot 数据读取。
eMMC BOOT_ACK 过程
主机复位并发送 Boot 启动命令
发送 CMD0(GO_IDLE_STATE)并选择 Boot 模式。【关于 CMD0是怎么回事?请看本篇博文后面内容(搜索“eMMC的命令详解”和“关于 eMMC的CMD0命令选择Boot 模式的工作流程的详解”)。】 eMMC 响应 BOOT_ACK(如果启用)
设备进入 Boot 状态后,会返回 ACK,通知主机已准备好发送 Boot 数据。 主机开始接收 Boot 数据
设备按照 Boot 配置传输 Boot 分区数据(通常是 BOOT_PARTITION_1 或 BOOT_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 分区的大小是固定的,但用户可以使用工具或命令进行如下调整:
用户数据区(User Area)划分逻辑分区 → 用 fdisk、parted 等工具对User Area区划分逻辑分区,如 /dev/mmcblk0p1(rootfs)、/dev/mmcblk0p2(data)。创建通用分区(General Purpose Partitions) → 通过修改 eMMC 的 EXT_CSD 寄存器,将一部分用户数据区转换为通用分区。转换部分用户数据区为增强型存储(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 卡也是同样的方式)。访问数据时:
CPU 通过 CMD 发送读/写命令,指定要访问的 LBA 地址。eMMC 内部的 Flash 控制器 解析 LBA 地址,将其映射到 NAND Flash 物理地址。数据通过 DAT 线传输,并由 eMMC 内部管理 ECC、磨损均衡等。
Linux 访问 eMMC 时,通常把它当作块设备 /dev/mmcblk0,通过 dd、fdisk 等工具进行分区和访问,而不是像 SRAM 那样直接使用地址线访问
eMMC的命令详解
eMMC(嵌入式多媒体卡)遵循 MMC(MultiMediaCard)协议,使用一套标准的 命令格式(Command Format) 来与主机(如处理器或控制器)进行通信。eMMC 的命令分为多种类型,并采用 48-bit 或 136-bit 的格式。
1. eMMC 命令格式
eMMC 命令的基本格式如下:
位名称说明47起始位(Start Bit)固定为 046传输方向(Transmission Bit)1 表示主机到设备,0 表示设备到主机45:40命令索引(Command Index)6-bit 命令编号,如 CMD0 为 00000039:8参数(Argument)32-bit 参数,具体值因命令而异7:1CRC 校验(CRC7)7-bit 循环冗余校验0结束位(End Bit)固定为 1
注意:
该格式适用于 所有 48-bit 命令(最常见)。CMD2 例外,它使用 136-bit 长响应,返回 CID 号(卡片标识)。
2. eMMC 命令类型
(1)基本命令
命令名称描述CMD0GO_IDLE_STATE使 eMMC 进入空闲状态CMD1SEND_OP_COND发送 OCR(操作条件寄存器),检查 eMMC 是否准备好CMD2ALL_SEND_CID发送 eMMC 的唯一 ID 号CMD3SET_RELATIVE_ADDR设置 eMMC 的 RCA(相对地址)CMD6SWITCH切换 eMMC 的模式(如改变工作电压)CMD7SELECT/DESELECT_CARD选中或取消选中某张 eMMC 卡
(2)读/写命令
命令名称描述CMD8SEND_EXT_CSD读取 eMMC EXT_CSD(扩展寄存器)CMD9SEND_CSD读取 eMMC CSD(卡片特性描述符)CMD16SET_BLOCKLEN设置读写块大小CMD17READ_SINGLE_BLOCK读取单个块CMD18READ_MULTIPLE_BLOCK读取多个块CMD24WRITE_BLOCK写入单个块CMD25WRITE_MULTIPLE_BLOCK写入多个块
(3)数据传输命令
命令名称描述CMD12STOP_TRANSMISSION停止多块传输CMD13SEND_STATUS查询 eMMC 的状态CMD23SET_BLOCK_COUNT预设多块传输的块数
3. eMMC 响应格式
eMMC 响应有 6 种类型:
R1(正常响应):包含 eMMC 状态R2(CID/CSD 响应):136-bit 长响应R3(OCR 响应):包含操作条件寄存器R4(不常用)R5(不常用)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 Bit、Command Index、Argument、CRC7 和 End 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_1 或 BOOT_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 1或Boot 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