☰
eMMC5.1协议中文学习讲解(6~6.3.7)
2026/11/3 2:53:30 网站建设 项目流程

事先声明本文不用于任何商业行为,仅用于本人学习与记录。所有截图版权均属于《Embedded Multi-Media Card (e•MMC) Electrical Standard (5.1)》

欢迎点赞、收藏、转发分享给朋友,禁止未经书面授权的复制、搬运、二次剪辑。

如有引用请注明出处。

标准规范仍然以《Embedded Multi-Media Card (e•MMC) Electrical Standard (5.1)》为准

写在最前:往后个人见解部分均用实线框出来。

上一章(5)主要讲解了基本时序,以及支持的传输速度模式,而第(6)章时eMMC协议介绍的重中之重,命令,响应格式,各模块功能都进行了详细的介绍。当然,在实现方面各家均有所不同。与Host厂家进行沟通时,对于固件来说,前端基本指的是eMMC IO,那么双方会围绕协议层展开讨论。本节对第(6)章展开详细介绍。希望大家多多交流与指正。


6 e•MMC functional description e・MMC 功能描述

6.1 e•MMC Overview e・MMC 概述

主机与设备之间的所有通信均由主机(主设备)控制。主机发送命令,设备给出响应。设备识别模式的命令流程概览见图 25,数据传输模式的命令流程概览见图 27。全部命令罗列在命令表中(见表 49 至表 58)。当前状态、收到的命令以及后续状态之间的跳转关系见表 60。e・MMC 系统(主机与设备)一共定义了 5 种工作模式:

  • Boot mode: 设备在以下三种场景进入启动模式:上电复位、收到参数为 0xF0F0F0F0 的 CMD0 命令、硬件复位信号有效。
  • Device identification mode: 启动模式结束后,或者主机 / 设备本身不支持启动模式时,设备进入设备识别模式。设备会保持在此模式,直到收到 SET_RCA 命令(CMD3)。
  • Interrupt mode: 主机和设备同步进入、退出中断模式。中断模式下不进行数据传输,仅允许设备或者主机发出中断服务请求。
  • Data transfer mode: 设备被分配 RCA 地址后,进入数据传输模式。主机在总线上识别到设备之后,也进入数据传输模式。
  • Inactive mode 如果设备的工作电压范围或者访问模式无效,设备会进入非激活模式;也可以通过 GO_INACTIVE_STATE 命令(CMD15)主动进入非激活模式。设备上电后会复位到预空闲状态。

按照使用到的频率排序,以上所说的五种工作模式:Data transfer mode>Boot mode=Device identification mode>Interrupt mode>Inactive mode,各模式功能在后文中会依次介绍。Interrupt mode与Inactive mode在我所学习接触的过程中,使用到的频率极少。此外,这里的Interrupt mode不要理解为嵌入式的中断IRQ处理,不是一个东西。


表 5 给出总线模式、工作模式和设备状态之间的对应关系。e・MMC 状态图(见图 25、图 27)里的每一个状态,都对应唯一一种总线模式以及唯一一种工作模式。

6.2 Partition Management 分区管理

6.2.1 General 概述

存储设备的默认区域包含:用于存放数据的用户数据区、最多两个可用于启动的启动区分区(见 6.3.2 节),以及重放保护内存块分区(见 6.6.22 节),该分区以带身份校验、防重放攻击的方式管理数据。 在执行任何分区操作之前,存储的初始配置由用户数据区、RPMB 分区以及启动区分区组成(分区大小和技术特性由存储厂商定义)。


Boot 0,Boot 1,RPMB分区统称为eMMC的BBR分区,用户区就是用户区。OK,第一次学习这个分区的小伙伴可能有点懵懵的。这里可以简单类比一下我们在使用电脑的时候,会把硬盘分成C盘,D盘……,这里的盘,其实就类似于eMMC的用户区。那么还有Boot区,RPMB区是干什么。Boot区顾名思义就是启动区,RPMB区是防重放攻击保护区,OK这里注意噢。这只是这些区的名字。至于里面想干什么!随便你!好,假如说我是的电脑,我选择把boot数据放在用户区,也是完全可以的!并不是说boot区一定要存boot数据。RPMB区一般用于存密码、指纹等重要数据。那么我想把密码放进用户区可不可以?完全可以!你不怕密码被轻松破解掉就放。

那么为什么还要有这些BBR分区,当然是eMMC协议规定,这些区有一些特殊的功能和增强,专门提供给主机,eMMC就像一个推销员,告诉主机,我推荐你存某些数据时放在某个分区。至于放不放的决定权在于主机。


该嵌入式设备还支持主机配置额外的本地存储分区,这些分区拥有独立地址空间,逻辑地址起始为 0x00000000,适配不同使用场景。 因此存储块区域可以分为下面几类:

  • 两个启动区分区:大小为 128KB 的整数倍,可以从 e・MMC 执行启动引导。
  • 一个 RPMB 分区:通过可信机制访问,大小为 128KB 的整数倍。
  • 四个通用分区:用于存放敏感数据或者适配主机其他使用场景,分区大小为写保护组的整数倍。

每一个通用分区都可以采用增强型或者扩展型技术特性实现(例如更高可靠性 ¹),以此和默认存储介质区分开。如果设备支持增强存储介质特性,则启动分区和 RPMB 分区默认都采用增强存储介质实现。

¹ 此处仅作为增强存储介质特性示例,不构成增强存储介质技术的强制定义。增强存储介质的定义由各系统厂商自行确定,不在本规范范围内。

启动分区与 RPMB 分区的大小和属性由存储厂商定义(只读);而通用分区的大小和属性,在设备整个生命周期内,主机仅能编程配置一次(一次性可编程)。

此外,主机可以自由在用户数据区中配置一段区域作为增强存储介质,并以写保护组为单位指定它的起始位置与容量。这个增强用户数据区的属性,在设备生命周期内也只能编程一次(一次性可编程)。

一种可行的最终配置示例如下:


这里的一次性可编程(OTP),就是配置完 GP 分区、增强用户区之后,不能再重新修改分区大小 / 属性,属于 eMMC 的分区熔丝配置,不是普通写数据。 Boot、RPMB 的大小出厂就定死,主机读,不能改。


主机对通用分区以及增强用户数据区的配置,会影响分区内已保存的数据(原有数据将会被销毁)。尤其是在配置完成后首次上电时,设备初始化耗时可能超出规范规定的最大初始化时长,因为设备内部控制器需要执行操作来完成主机指定的配置。

更广泛地说,新配置也会对下面这些初始化阶段产生影响。最大上电时序参数需要在器件技术手册中注明。

6.2.2 Command restrictions 命令限制

针对各个分区,可下发的命令存在如下限制:

  • 启动分区
    • 不允许使用第 6 类(写保护)和第 7 类(设备锁定)命令。
  • RPMB 分区
    • 仅允许使用第 0 类、第 2 类、第 4 类命令。除此之外,除 CMD0、CMD6、CMD8、CMD12、CMD13、CMD15 以及 6.6.22 节定义的命令外,使用其余任何命令都视为非法。
  • 通用分区
    • 允许使用第 0、2、4、5、6 类命令。
    • 可以对分区内每个写保护组单独设置写保护。主机能够为各个写保护组配置不同的写保护类型。

在增强用户数据区内,可以下发用户数据区所支持的全部类别命令。


这边有一个class命令类的概念,eMMC里将完成一个任务需要的命令或相似功能的命令放在class里,在后面的章节会有详细介绍,这里简单提一嘴。


6.2.3 Extended Partitions Attribute 扩展分区属性

每个通用分区可以配置不同的扩展分区属性,属性类型包括:

  • 默认:未设置任何扩展属性
  • 系统代码:该分区很少更新,存放重要系统文件(例如主机操作系统的可执行文件)
  • 非持久化:该分区用于存放临时信息(例如用于扩展主机虚拟内存的交换文件)

借助扩展属性,设备可以优化存储介质的特性组合,更好适配每个分区的预期用途。

单个分区不能同时配置增强属性与扩展属性。


默认,系统代码,非持久化这三个扩展分区属性,说实话,我目前还真没见过在哪里使用的。当然,他所描述的场景很具体,但是其实真实使用的时候好像并不会区分地这么细。所以我并不清楚是在哪里设置这些扩展分区属性。

比如说非持久化,就是写入后数据完全不管吗?临时使用一下,请了解的小伙伴可以在评论区留言指导我一下~


6.2.4 Configure partitions 配置分区

扩展 CSD 寄存器中属性段的PARTITIONING_SUPPORT字段: 第 0 位(PARTITIONING_EN):标识该存储设备是否支持分区功能。 第 1 位(ENH_ATTRIBUTE_EN):同字段内,标识设备是否支持通用分区、增强用户数据区的增强属性。 第 2 位(EXT_ATTRIBUTE_EN):同字段内,标识设备是否支持通用分区的扩展分区属性。 在本规范中,PARTITIONING_SUPPORT的第 0~2 位都必须置 1。

通用分区与增强用户数据区的属性,由主机在扩展 CSD 寄存器中写入对应值进行配置,在设备整个生命周期内仅可配置一次。 主机可下发 SWITCH 命令,设置分区特性的读写字段,包含如下参数:

  • 通用分区:最多 4 个分区的大小与属性,需要设置 EXT_CSD 寄存器 Modes 段内的字段:
    • GP_SIZE_MULT_GP0 ~ GP_SIZE_MULT_GP3:分区大小
    • PARTITIONS_ATTRIBUTE:增强属性
    • EXT_PARTITIONS_ATTRIBUTE:扩展属性
  • 增强用户数据区:区域的起始地址与属性,需要设置 EXT_CSD 寄存器 Modes 段内的字段:
    • ENH_START_ADDR:起始地址
    • ENH_SIZE_MULT:大小
    • PARTITIONS_ATTRIBUTE:增强属性

增强用户数据区的起始地址(扩展 CSD 中的 ENH_START_ADDR)必须按写保护组对齐。 容量≤2GB 的设备,该地址为字节粒度的组地址;容量>2GB 的设备,该地址为扇区粒度。设备会忽略写保护组大小以下的低位,自动将增强用户数据区起始地址对齐到所属写保护组地址(字节或扇区)。 增强用户数据区的地址空间和剩余用户数据区地址连续,二者之间不存在地址间隙。

通用分区和增强用户数据区的配置粒度,以大容量写保护组大小为单位(见 7.4 节)。配置分区参数时,扩展 CSD 里的 ERASE_GROUP_DEF 位必须置 1,表示启用大容量擦除组和大容量写保护组。 如果主机在设置 ERASE_GROUP_DEF 位之前,就通过 CMD6 向设备下发分区参数,从机会返回 SWITCH_ERROR。

分区完成、配置稳定之后,所有第 5 类、第 6 类命令都会作用于大容量擦除组和写保护组。

除了上面提到的分区参数字段,主机还需要设置 Modes 段中PARTITION_SETTING_COMPLETED的第 0 位:主机通过该位通知设备,分区配置流程已经成功结束。 该位的作用是防止分区流程遭遇意外掉电:如果分区配置只执行了一部分就发生掉电,下次上电时设备检测到该位未置位,就会判定本次分区配置无效、作废,主机可以重新发起分区流程,保证配置正确完成。

主机需要下发 CMD13,确认所有参数配置正确。如果任意分区参数有误,设备会返回 SWITCH_ERROR。 在 PARTITION_SETTING_COMPLETED 位被置位之前,设备并不知道已配置分区与用户数据区的总容量;因此当主机设置 PARTITION_SETTING_COMPLETED 位时,如果已配置分区加上用户数据区的总容量超出设备可用空间,设备同样会上报 SWITCH_ERROR。这种情况下,本次所有配置在下次上电后都会被清除,主机需要重新在各个分区配置寄存器中填写正确参数。

设备并不会在写完 EXT_CSD 后立刻完成分区硬件配置,只有经过一次上电复位之后,设备才会根据扩展 CSD 中的分区参数完成实际配置。在 PARTITION_SETTING_COMPLETED 位置 1 之后、上电复位之前下发的合法命令,都可以正常执行。在该位置 1 之前,如果分区配置流程中断,上电后会直接取消这次不完整的分区配置。

分区配置完成并上电复位后:

  • 容量≤2GB 的设备:C_SIZE 字段会更新,反映配置后的用户数据区大小
  • 容量>2GB 的设备:SEC_COUNT 字段会更新,反映配置后的用户数据区大小

对比 2GB 容量的说明:对于大于 2GB 的设备,即使配置后用户数据区容量缩减到 2GB 及以下,SEC_COUNT 仍然表示配置之后的用户数据区容量。 用户数据区的容量包含增强用户数据区。主机应当在上电之后读取这些字段,用来计算用户数据区的实际大小。分区配置完成后,访问模式保持不变。

主机如果在分区配置流程完成、已经上电之后,再次使用 CMD6 修改通用分区、增强用户数据区的相关特性,设备会在 CMD6 应答的状态寄存器中置 SWITCH_ERROR,并且不会执行任何内部修改动作。

分区配置参数保存在扩展 CSD 寄存器的一次性可编程(OTP)字段中。即使 PARTITION_SETTING_COMPLETED 位还没有置位,主机也可以通过 CMD8 读取这些参数;但分区的实际生效,仍然要等到下一次上电之后。 由于这些字段是一次性可编程,建议主机读完参数之后不要再尝试修改。

主机必须按照图 16 的流程图配置通用分区与增强用户数据区的参数;否则会产生未定义行为。


对于新人学习来说,分区大小以及分区属性设置可以不作为前期着重学习的点,了解即可。不同固件对设置分区的处理动作大同小异。另外,如果分区上原本就有数据,然后host需要切分区,那么host有义务需要对分区这个动作负责,或是备份数据,或是无所谓数据丢失。


6.2.5 Access partitions 访问分区

每次上电后,如果主机使用已经配置过分区的器件,在下发读、写、擦除、写保护命令之前,必须先将 ERASE_GROUP_DEF 位置 1;因为该位在上电后会被复位。如果不做这个操作,上述命令可能无法正常工作,还有可能导致存储的数据进入未知状态。

主机每次想要访问某个分区,都需要执行下面流程:

  1. 设置扩展 CSD 寄存器中 PARTITION_CONFIG 字段里的 PARTITION_ACCESS 位,选中目标分区;
  2. 下发针对该选中分区的命令;
  3. 恢复默认访问到用户数据区,或者切换访问到其他分区。

所有复位事件(CMD0 或者硬件复位)都会把访问目标恢复为默认的用户数据区。如果发生意外掉电,访问目标同样默认恢复到用户数据区。 当主机尝试访问一个尚未创建的分区时,器件会在状态寄存器置 SWITCH_ERROR 位,并且不会修改 PARTITION_ACCESS 位。


这里所说的状态寄存器,会在后面response一章有讲,就是用来表述命令处理或者数据处理是否正常。


6.3 Boot operation mode 启动操作模式

在启动操作模式下,主设备(eMMC 主机)可以读取从设备(eMMC 器件)的启动数据:方式为把 CMD 线拉低,或者发送参数为 0xFFFFFFFA 的 CMD0,之后再下发 CMD1。 根据寄存器配置,数据可以从启动区或者用户区读出。

6.3.1 Device reset to Pre-idle state 器件复位至预空闲状态

器件可以通过下面四种方式进入预空闲(Pre-idle)状态:

  • 主机上电之后,器件(哪怕之前处于非激活 Inactive 状态)都会进入预空闲状态。
  • GO_PRE_IDLE_STATE 命令(参数为 0xF0F0F0F0 的 CMD0)是软件复位命令,会将器件置入预空闲状态。
  • 主机可以使用硬件复位复位器件;硬件复位会让器件进入预空闲状态,同时取消复位前已经设置上电写保护的块的上电写保护。
  • 器件在睡眠状态时,如果收到 GO_PRE_IDLE_STATE 命令(参数 0xF0F0F0F0 的 CMD0),或者硬件复位信号有效,器件也会进入预空闲状态。

当收到 GO_PRE_IDLE_STATE 命令,或者硬件复位信号 RESET 有效时,器件总线输出驱动器进入高阻态;器件完成初始化,相对设备地址使用默认值(0x0001),驱动器阶段寄存器采用默认配置,详见 7.6 节。

器件上电时,RST_n 信号会跟随电源电压上升。因此器件在上电阶段有可能检测到 RST_n 信号的上升沿,对应下图中的 (1)、(2)、(3)、(4) 四种场景。器件必须能够处理该情况,保证上电后正常工作。

如果 RST_n 信号在 VCCQ 完全上电之前就已经拉低,则把 VCCQ 的上升沿等效看作 RST_n 的下降沿。这种场景下,RST_n 脉冲宽度的测量起点为 RST_n 的上升沿,终点为 VCCQ 上电完成时刻。

器件上电后会立刻启动内部初始化流程,此时控制器可能还没有加载完扩展 CSD 寄存器里的 RST_n_ENABLE 位,因此器件有可能识别不到本次 RST_n 信号。但上电本身已经触发了内部初始化流程(上电流程本身就包含 RST_n 触发的复位流程),器件不需要重复执行复位流程,但是必须在 1 秒内完成内部初始化。 在该场景下,初始化延迟最长取下面三者中的最大值:1 毫秒、74 个时钟周期、电源爬升时间。

6.3.2 Boot partition 启动分区

一共有两个启动分区区域。每个启动分区的最小容量为 128KB。 启动分区容量计算公式: 最大启动分区容量 = 128 字节 × BOOT_SIZE_MULT BOOT_SIZE_MULT:位于扩展 CSD 寄存器第 226 字节。 启动分区与用户区相互独立,如图 19 所示。

从设备的启动配置存放在扩展 CSD 寄存器第 179 字节。主设备可以通过 CMD6(SWITCH 命令)写入该寄存器,选择对应的配置。 也可以将扩展 CSD 寄存器第 179 字节中的 BOOT_PARTITION_ENABLE 位设置为 11b,配置从设备从用户区启动。

6.3.3 Boot operation 启动操作

上电或者复位之后(复位方式可以是参数为 0xF0F0F0F0 的 CMD0,或是硬件复位),在下发第一条命令之前,如果扩展 CSD 寄存器第 162 字节的 [1:0] 位已经使能启动模式,并且CMD 线被拉低保持 74 个时钟周期及以上,从设备就识别到启动模式已经开始,并且在内部准备启动数据。

主机预先可以通过扩展 CSD 第 179 字节的 [5:3] 位,选择要读取的启动分区。 主机在启动阶段可以读取的数据大小 = 128KB × BOOT_SIZE_MULT(扩展 CSD 第 226 字节)。 CMD 线拉低后的 1 秒以内,从设备开始在 DAT 线上向主机发送首批启动数据。主机必须持续保持 CMD 线为低,直到读完全部启动数据。主机在整个启动操作结束前,都必须使用推挽模式驱动 CMD 线。

主机可以通过配置扩展 CSD 寄存器第 177 字节的 [4:3] 位,选择启动阶段的接口时序: 兼容旧版本的单速率时序、高速单速率时序;如果器件支持,也可以选择双速率时序,详见 10.6 节。 扩展 CSD 寄存器第 228 字节的第 2 位,用于告知主机器件是否支持启动阶段的高速时序。

主机也可以配置扩展 CSD 寄存器第 177 字节的 [4:3] 位为 “10”,选择启动阶段使用双数据速率模式,接口规范见表 208。 扩展 CSD 寄存器第 228 字节的第 1 位,用于告知主机器件是否支持启动阶段的双速率模式。

HS200、HS400 模式不支持在启动操作中使用。

主机可以将扩展 CSD 寄存器第 179 字节第 6 位置 1,选择接收从设备的启动应答,以此识别从设备正处于启动模式。如果启动应答功能开启,从设备必须在 CMD 线拉低后的 50ms 内向主机发送应答序列 “010”;如果启动应答关闭,从设备不会发送 “0-1-0” 应答序列。

单数据速率模式:器件在时钟上升沿移出数据,主机在时钟上升沿采样;每条数据线附带 1 个 CRC 校验。

双数据速率模式:在时钟上升沿与下降沿同时输出数据;每条数据线附带 2 个 CRC 校验。 该模式下块长度固定为 512 字节,字节交织方式支持 4bit 或 8bit 位宽配置。 奇数序号字节(1,3,5,…,511)由主机在时钟上升沿采样; 偶数序号字节(2,4,6,…,512)由主机在时钟下降沿采样。 器件会为每一条有效数据线追加 2 个 CRC16: 第一个 CRC 对应 256 个奇数字节(上升沿采样); 第二个 CRC 对应 256 个偶数字节(下降沿采样)。

DAT 线上所有时序遵循 DDR 时序规范。起始位、结束位、启动应答位仅在时钟上升沿有效;下降沿上的这些信号值不保证有效。

主机可以将 CMD 线拉高,以此终止启动模式。如果主机在数据传输中途把 CMD 线拉高,从设备必须在个时钟周期内停止数据传输或者停止应答序列(1 个数据周期 + 结束位周期)。 如果主机在两个数据块之间终止启动模式,从设备必须在个时钟周期内释放 DAT 数据线。

当所有已启用的启动数据全部发送给主机后,启动操作自动结束。启动操作完成后,从设备准备好接收 CMD1,主机需要发送 CMD1,开始标准 eMMC 初始化流程。

详细时序参见 6.15.4 节。

从 CMD 信号拉高到下一条 eMMC 命令,最少需要 8 个时钟 + 48 个时钟 = 56 个时钟周期。 上电之后、下发 CMD1 之前,如果 CMD 线拉低的时长不足 74 个时钟周期;或者主机在启动模式触发前,发送了除参数为 0xFFFFFFFA 的 CMD0 以外的普通 eMMC 命令,从设备将不会响应,并且退出启动模式,直到下一次上电或者硬件复位才可以重新进入启动模式,器件进入空闲态。

当 BOOT_PARTITION_ENABLE 位配置完成,主机下发 CMD1(SEND_OP_COND)时,从设备必须进入设备识别模式,并响应该命令。 如果从设备不支持启动模式(v4.2 及更早版本),或者 BOOT_PARTITION_ENABLE 位被清零,器件上电后会自动进入空闲态。

6.3.4 Alternative boot operation 替代启动操作

v4.4 及以上版本规范的器件必须支持该启动功能。遵循 v4.4 规范的器件,扩展 CSD 寄存器第 228 字节的第 0 位必须为 1。 上电或者复位之后(复位方式:参数 0xF0F0F0F0 的 CMD0,或者硬件复位,且启动功能已使能),在 CMD1 下发之前,如果主机在 74 个时钟周期之后发送参数为 0xFFFFFFFA 的 CMD0(或者将 CMD 线拉低),从设备识别到启动模式触发,在内部准备启动数据。 主机预先通过扩展 CSD 第 179 字节的 [5:3] 位选择要读取的启动分区。 主机启动阶段可读数据大小 = 128KB × BOOT_SIZE_MULT(扩展 CSD 第 226 字节)。 在收到参数 0xFFFFFFFA 的 CMD0 之后 1 秒以内,从设备开始在 DAT 线上向主机发送首批启动数据。主机在整个启动操作结束前,都必须使用推挽模式驱动 CMD 线。 主机可配置扩展 CSD 寄存器第 177 字节的 [4:3] 位,选择接口时序:兼容旧版的单速率时序、高速单速率时序;若器件支持,也可选择双速率时序,详见 10.7 节。扩展 CSD 寄存器第 228 字节第 2 位用于告知主机,器件是否支持启动阶段的高速时序。

主机可以将扩展 CSD 寄存器第 179 字节第 6 位置 1,选择接收从设备的启动应答,以此识别从设备正处于启动模式。如果启动应答开启,从设备在收到参数 0xFFFFFFFA 的 CMD0 之后,必须在 50ms 内向主机发送应答序列 “010”;如果启动应答关闭,从设备不会发送 “010” 应答序列。

单数据速率模式:器件在时钟上升沿移出数据,主机在时钟上升沿采样;每条数据线附带 1 个 CRC 校验。

双数据速率模式下,时钟上升沿与下降沿都会输出数据,每条数据线附加 2 个 CRC。该模式块长固定为 512 字节,字节交织支持 4 位或 8 位位宽配置。 奇数序号字节(1,3,5,…,511)由主机在时钟上升沿采样;偶数序号字节(2,4,6,…,512)由主机在时钟下降沿采样。 器件会为每一条有效数据线追加两个 CRC16:第一个 CRC 对应 256 个在时钟上升沿采样的奇数字节,第二个 CRC 对应块内剩下 256 个在时钟下降沿采样的偶数字节。

DAT 线上所有时序遵循 DDR 时序模式。起始位、结束位、启动应答位仅在时钟上升沿有效,下降沿上的信号值不保证有效。

主机可以下发 CMD0(复位命令)来终止启动模式。如果主机在数据传输过程中下发 CMD0(复位),从设备必须在个时钟周期内停止数据传输或者应答序列(1 个数据周期 + 结束位周期)。 如果主机在连续数据块之间终止启动模式,从设备必须在个时钟周期内释放数据线。

当所有启用的启动数据全部发送给主机后,启动操作结束。启动操作完成后,从设备做好接收 CMD1 的准备,主机需要下发 CMD1,启动标准 MMC 初始化流程。

详细时序参见 6.15.4 节。

上电之后、下发 CMD1 之前,如果 CMD 线拉低时长不足 74 个时钟周期;或者主机在启动模式触发前,发送了除 CMD1、参数 0xFFFFFFFA 的 CMD0 以外的普通 MMC 命令,从设备不会响应,并且锁定退出启动模式,直到下一次上电,器件进入空闲态。

当 BOOT_PARTITION_ENABLE 位配置完成,主机下发 CMD1(SEND_OP_COND)时,从设备必须进入设备识别模式并响应该命令。 如果从设备不支持启动模式(v4.2 及更早版本),或者 BOOT_PARTITION_ENABLE 位被清零,器件上电后会自动进入空闲态。

6.3.5 Access to boot partition 访问启动分区

主机将从设备置入传输状态后,下发 CMD6(SWITCH 命令),配置扩展 CSD 寄存器第 179 字节中的 PARTITION_ACCESS 位。配置完成后,主机就可以使用常规 MMC 命令访问启动分区。

主机可以使用 CMD24(单块写)或者 CMD25(多块写),配合从设备支持的寻址方式(字节寻址或扇区寻址),在 DAT 线上向启动分区写入启动数据。 如果主机使用 CMD25 多块写,并且写入操作越过所选分区的边界,从设备会上报 “ADDRESS_OUT_OF_RANGE” 地址越界错误;落在分区边界以内的数据会正常写入当前选中的启动分区。

主机可以使用 CMD17(单块读)或者 CMD18(多块读),配合从设备支持的寻址方式(字节寻址或扇区寻址),在 DAT 线上读取启动分区数据。 如果主机使用 CMD18 多块读,读操作越过所选分区边界,从设备会上报 “ADDRESS_OUT_OF_RANGE” 地址越界错误。

完成启动分区的数据访问之后,需要清除 PARTITION_ACCESS 位。随后可以配置扩展 CSD 寄存器中非易失性的 BOOT_PARTITION_ENABLE 位,指定哪个分区作为启动分区。这样从设备在启动阶段就可以从该启动分区读取数据。

主机也可以通过把扩展 CSD 寄存器第 179 字节的 PARTITION_ACCESS 位清零为 000b,切回用户区,使用普通命令访问用户区。 如果用户区被锁定,并且配置为启动源,那么在启动模式下不会向主机输出数据;但是如果用户区锁定,而两个启动分区其中一个被配置为启动源,启动模式下依然可以正常向外输出数据。

6.3.6 Boot bus width and data access configuration 启动总线位宽与数据访问配置

启动操作期间,总线位宽由扩展 CSD 寄存器第 177 字节的 [0:1] 非易失配置位决定。 寄存器第 177 字节的第 2 位,用于控制:启动结束后,从设备是回到 x1 总线位宽、兼容传统时序的单速率模式,还是保持启动阶段配置的总线位宽。 寄存器第 177 字节的 [4:3] 位,决定启动阶段数据线配置为:兼容传统时序的单速率、高速时序单速率,或是双速率模式。 如果没有执行启动操作,无论寄存器如何配置,从设备上电后都会默认初始化为 x1 总线、单速率、兼容传统时序。

6.3.7 Boot Partition Write Protection 启动分区写保护

为了让主机能够保护启动区,防止启动区被擦除或者写入,eMMC 为每一个启动区支持两级写保护:永久写保护、上电写保护。 可以通过 BOOT_WP 寄存器(扩展 CSD [173]),单独对某一个启动区开启保护,或者同时对两个启动区开启保护。

主机在写入 BOOT_WP 寄存器时,需要注意以下事项:

  • BOOT_WP 寄存器中,除 B_PERM_WP_DIS(第 4 位)、B_PERM_WP_EN(第 2 位)这两个可读写位以外,其余所有位在一次上电周期内仅允许写入一次。对两个启动区的保护模式,通过一次写入完成配置。
  • 寄存器内 B_PERM_WP_DIS(第 4 位)、B_PERM_WP_EN(第 2 位)为可读写位;对该启动寄存器的第一次写入,会永久固化这两个位。第一次写入 BOOT_WP 寄存器时,需要遵循图 24 的流程图,保证这两个位配置正确。
  • 如果仅为其中一个启动分区置位 B_PERM_WP_EN,主机必须正确配置 B_SEC_WP_SEL(第 7 位)与 B_PERM_WR_SEC_SEL(第 3 位),避免另一个启动区被意外设置永久写保护。

主机可以通过置位 B_PERM_WP_DIS(扩展 CSD [173] 第 4 位)和 B_PWR_WP_DIS(扩展 CSD [173] 第 6 位),关闭启动区的永久写保护与上电写保护。 如果不需要启动区保护,建议配置这两个位,防止启动区被无意或者恶意地加上写保护。

当 SECURE_WP_EN 被置位时,BOOT_WP 寄存器的更多处理规则请参考 6.6.40 节 安全写保护模式。


6.3节详细的介绍了启动操作模式,有一个大概了解就好,在后续的文章中,图25的程序流程图会更直观(简易)看到设备是怎么启动并被选取的。


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询