1. Linux MMC/SD驱动子系统概述
在嵌入式Linux开发中,MMC(MultiMediaCard)子系统负责管理各类存储卡设备的驱动,包括标准SD卡、eMMC芯片等存储介质。作为Linux内核的核心组件之一,MMC子系统通过分层架构实现了对不同协议标准的兼容支持。
我曾在多个嵌入式项目中处理过SD卡初始化失败的问题,发现许多开发者对这个看似简单的子系统存在认知盲区。比如在基于i.MX6UL的平台调试时,SD卡频繁出现CRC校验错误,最终排查发现是时钟相位配置不当导致。这类问题往往需要深入理解MMC子系统的运作机制才能高效解决。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MMC子系统架构解析
2.1 核心组件构成
Linux内核中的MMC子系统采用典型的三层架构设计:
-
主机控制器驱动层(Host Controller):
- 直接操作硬件寄存器
- 处理DMA传输和时钟控制
- 例如:sdhci-esdhc-imx.c(i.MX系列驱动)
-
核心层(Core):
- 提供总线注册、设备探测等基础设施
- 实现CMD/DATA线状态机
- 位于drivers/mmc/core目录
-
协议层(Protocol):
- 处理不同规格卡片的初始化流程
- 包含SD/MMC/eMMC协议实现
- 例如mmc_sd.c专门处理SD卡规范
c复制// 典型SD卡探测流程(简化版)
mmc_rescan() → mmc_sd_init_card() → mmc_sd_setup_card()
→ mmc_add_card() → create sysfs entries
2.2 关键数据结构
在include/linux/mmc目录下,有几个重要的数据结构需要特别关注:
-
struct mmc_host:
- 描述主机控制器特性
- 包含ops指针指向硬件操作函数集
- 记录电压范围、时钟频率等参数
-
struct mmc_card:
- 存储卡属性(CID/CSD寄存器内容)
- 维护当前操作电压和时序模式
- 包含块设备指针
-
**struct mmc_com
