【SDIO】【SDMMC】硬件层
kernel使用MMC subsystem 统一管理MMC、SD、SDIO 等设备
-
MMC实例:EMMC -
SD实例:SD卡 -
SDIO实例:从SD演化出来的,强调的是接口(IO,Input/Output)不再关注另一端的具体形态(可以是WIFI设备、Bluetooth设备等等)。
我们将针对 secure Digital(SD)进行讲解。
一、硬件电路
MMC分别从卡(card concept)、总线(Bus concept )以及控制器(Host controller )三个方面,定
义 MMc system 的行为。

-
CLK :CLK 信号用于从
Host端输出时钟信号,进行数据传输的同步和设备运作的驱动。 -
CMD :CMD 信号主要用于
Host向eMMC发送command和eMMC向Host发送对于的Response。 -
DATA: DAT0-7 信号主要用于 Host和 eMMC之间的数据传输。在 eMMC上电或者软复位后,只有
DAT0可以进行数据传输,完成初始化后,可配置DAT0-3或者DAT0-7进行数据传输,即数据总线可以配置为4 bits或者8 bits模式。
二、硬件抽象
eMMC 规范包含了对接口功能和器件控制器的描述。规范对 eMMC 系统的描述包含了 eMMC 外部的控制器和对应的 eMMC器件,而规范对接口做了详细的说明,但是对于外部的 eMMC 控制器不做过多规定,内部的 Flash 控制器由各个器件厂商自行设计,只需对外部提供符合 eMMC规范的标准 MMC接口即可。

三、MMC通信协议
器件上电或复位后,主控制器必须按照特定的携带特殊信息总线协议对 eMMC 器件进行初始化。这些特殊的信息传输是由命令、响应和数据组成的。 eMMC 的总线数据传输是由命令、响应和数据块的组合构成。一次数据传输就称为一次"总线操作”。操作总是包含命令和响应,有些操作还包含数据,如数据传输操作。
MMC 总线上传送的信息流可分为三类:
- 命令( command)
命令的传输方向为从 MMC 卡控制器到 MMC 卡,用来表明一个操作的开始。
- 响应(response)
响应的传输方向为 MMC 卡到控制器,为某一MMC 卡或总线上所有的卡同时对一命令执行情况的回应,命令和响应都通过 CMD 线传输。
- 数据( data)。
数据的传输方向为 MMC 卡到控制器,或由控制器到 MMC 卡,数据的传输通过 DAT 线进行。
3.1 命令和响应
- 命令

传输控制部分是整个 MMC设计的核心。电路中的命令模块将要发送的命令进行打包,包括添加开始位,传输位,结束位,以及 CRC 校验位,组装成一个固定格式( 48 位)的一帧数据,串行输出到 MMC 命令线上。对于接收到的命令进行解包,并进行 CRC7 校验,如果正确,则将相应的值写入命令寄存器 。

如上表所示,指令在传输过程中总是以”01“作为起始位,标志指令开始传输;总是以”1”为结束位,标志该条指令发送完毕。指令[45:40]bit 为所发送指令的索引值,该值会被 SD 卡控制器进行解释。指令[39:8]bit为所发送指令附带的参数,通常不同的指令附带参数的意义不同,需根据指令的索引值进行相应的解释。指令在发送过程中需进行 CRC7 校验,以确认在主控制器和存储器之间指令传输是否正确。
- 响应

3.2 数据读写操作
- 读操作
读取数据和写入数据操作允许单块或多块的数据传输。与顺序读操作类似,当进行多块数据传输时是由“停止传输命令来终止操作的。下图描述了单块读操作和多块读操作。在进行单块数据读操作时,主控制器通过 CMD 信号线发送命令,eMMC 器件接收命令之后会做出响应,在 CMD 信号线上发送至主控制器,在命令和响应的传输中都是包含 CRC7 校验以保证传输的正确性的。同时在数据线 DAT0~DAT7(根据位宽的设置可以变化)上向主控制器发送数据,每根数据线上的数据都会在最后跟随一个 CRC16 校验保证数据传输的正确性,也为主控制器校验数据提供依据。而在多块数据的读操作中,主控制器发送读数据命令之后 eMMC 做出相应,并会连续的发送数据块直到主控制器发送停止读取数据的命令之后 eMMC 器件才不向外发送数据。

单个block读取流程

多个block读取流程

- 写操作

单个block 写入流程

多个block写入流程
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
四、 MMC寄存器

文件:include/linux/mmc/card.h
mmc_card 代表了一张MMC卡
4.1、mmc_cid
CID(Device Identification Register ,器件识别寄存器)寄存器的长度为 128 bits 。寄存器中包含了器件识别过程中的的识别信息,是符合 eMMC 协议的。需要注意的是每个 eMMC 芯片都具有唯一的器件识别码并且每种类型的 eMMC 芯片都会局域唯一的分类识别码。
目录:kernel/include/linux/mmc/card.h
4.2 mmc_csd
CSD (Device-Specific Data Register ,器件特征数据寄存器)寄存器提供了如何对器件进行访问的信息 。寄存器定义了数据格式、校验类型、最大数据访问时间、数据传输速度、 DSR 寄存器是否可用等信息。
目录:kernel/include/linux/mmc/card.h
4.3 mmc_csr
CSR 是 Card Status Register(卡状态寄存器)的缩写,在 SD/MMC 存储卡系统中是最核心的状态寄存器。当主机控制器发送命令给存储卡时,卡会通过 CSR 返回命令执行结果和当前状态。
五、MMC控制命令
由于 SD/MMC 卡的操作命令不一致,在模块中并没有对命令作译码, 而是通过软件来设置命令的类型。单块(signal block data)读数据命令(CMD17),写数据命令(CMD24);多块(multi-block data)读数据命令(CMD18 ),写数据命令(CMD25 )等需要控制模块根据 SD_CMD_INDEX 寄存器的内容来发布相应的命令并作不同的状态转换。
文件目录:kernel/include/linux/mmc/mmc.h

文件目录:kernel\drivers\mmc\host\dw_mmc.h
这是 DesignWare MMC/SD 主机控制器驱动的状态机枚举,用于管理 SD/MMC 卡操作的状态流程。每个状态代表主机控制器在处理命令或数据传输时的特定阶段。
core/mmc_ops.c中完成cmd的发送
在识别和初始化 SD 卡的过程中,主机控制器会按顺序发送一系列命令(CMD)来配置和准备卡以进行数据传输
以下是典型的 SD 卡识别过程中使用的命令:
六、SD卡枚举CMD的过程
-
CMD0 (GO_IDLE_STATE):将卡复位到空闲状态。这是识别过程的第一步,用于复位卡的状态机。
-
CMD8 (SEND_IF_COND):检查卡是否支持电压范围,并确认卡是 SD 2.0 及以上版本。主机发送电压和检查模式信息,卡返回相同信息以确认。
-
CMD55 (APP_CMD) + ACMD41 (SD_SEND_OP_COND):
组合使用以初始化卡并获取其操作条件。
- CMD2 (ALL_SEND_CID):
请求卡发送其唯一的卡标识符(CID)。所有卡都会回应此命令。
- CMD3 (SEND_RELATIVE_ADDR):
分配一个相对地址(RCA)给卡。卡使用这个地址进行后续的命令通信。
- CMD9 (SEND_CSD):
请求卡发送其卡特定数据(CSD),以获取卡的特性信息,如最大传输速度、块长度等。
- CMD7 (SELECT/DESELECT_CARD):
选择卡以进入传输状态,准备进行数据传输。
https://cloud.tencent.com/developer/article/2161824
https://blog.csdn.net/yangguoyu8023/article/details/122820765
七、FTL层
学习链接:https://zhuanlan.zhihu.com/p/26944064

LBA — Logical Block Address(逻辑块地址)
-
定义:LBA 是主机侧看到的地址。操作系统或文件系统通过 LBA 读写数据,它是“逻辑编号”,和实际物理位置无关。
-
作用:隐藏了底层闪存的复杂性,让主机像操作传统硬盘一样访问数据。
-
单位:通常每块 512B 或 4KB(依文件系统/块设备而定)。
PBA — Physical Block Address(物理块地址)
-
定义:PBA 是闪存控制器内部使用的物理地址,指向 NAND 的实际页/块。
-
作用:真实存储数据的地方,FTL 根据 LBA → PBA 映射来决定数据存放在哪里。
-
特点:
-
不可原地覆盖:NAND Flash 写入只能写空页,覆盖必须先擦除整个块;
-
动态映射:FTL 可以把同一个 LBA 的数据写到不同 PBA;
-
物理不连续:为了磨损均衡和垃圾回收,连续 LBA 可能映射到离散的 PBA。
-
FTL 核心就是维护一张 映射表:
-
顺序写:FTL 尽量把连续 LBA 映射到连续 PBA,顺序读/写速度高。
-
随机写:FTL 分配空闲 PBA,原 LBA → PBA 连续性破坏,顺序读速度下降。
-
垃圾回收:旧 PBA 失效,FTL 搬移有效页到新 PBA,再更新映射表。
