SD/MMC/eMMC 驱动
1. 概述
1.1 功能简介
SD/MMC(Secure Digital / MultiMediaCard)和 eMMC(embedded MultiMediaCard)是嵌入式系统中最常用的存储接口。RK3576 内置多个 SDMMC 控制器,支持 SD 3.0(UHS-I,104Mbps)、eMMC 5.1(HS400,400MB/s)标准,可用于系统启动、数据存储、SD 卡扩展等场景。
1.2 应用场景
- eMMC 存储:系统启动、根文件系统存储
- SD 卡扩展:数据存储、系统备份
- SDIO WiFi/蓝牙:通过 SDIO 接口连接无线模块
- TF 卡:便携式数据存储
- 启动介质:eMMC/SD 卡作为系统启动介质
1.3 工作原理
RK3576 的 SDMMC 控制器支持以下特性:
| 特性 | 说明 |
|---|---|
| SD 3.0 | UHS-I,最高 104Mbps |
| eMMC 5.1 | HS400,最高 400MB/s |
| SDIO | 支持 SDIO 3.0 接口 |
| DMA | 支持 ADMA2 DMA 传输 |
| 总线宽度 | 1/4/8 位总线宽度 |
详见 RK 官方文档:[《Rockchip_Developer_Guide_Linux_Software_CN.pdf》]
2. 硬件准备
2.1 硬件清单
| 组件 | 型号/规格 | 数量 | 备注 |
|---|---|---|---|
| 主控板 | C-3576BQ 核心板 + M4-R2 底板 | 1 | 核心板内置 eMMC |
| 调试串口线 | USB 转 TTL(3.3V) | 1 | 波特率 1500000 |
| Micro SD 卡 | 16GB+ Class 10 | 1 | 用于 SD 卡测试 |
| SD 卡读卡器(可选) | USB 读卡器 | 1 | 用于卡烧录 |
2.2 引脚连接
eMMC 已焊接在核心板上,无需额外连接。SD 卡槽通常已集成在底板上。
eMMC 型号和规格详见核心板硬件规格书。SD 卡槽在底板原理图中有标注,具体接口位置以实际物料为准(待板上验证)。
2.3 硬件确认
# 查看 eMMC 设备
ls /dev/mmcblk*
# 输出示例:/dev/mmcblk0(eMMC) /dev/mmcblk1(SD 卡)
# 查看存储设备信息
cat /sys/block/mmcblk0/device/name
cat /sys/block/mmcblk0/device/cid
cat /sys/block/mmcblk0/device/csd
# 查看分区
fdisk -l /dev/mmcblk0
lsblk3. 软件准备
3.1 内核配置
确认以下内核配置已启用:
CONFIG_MMC=y
CONFIG_MMC_BLOCK=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_DW=y
CONFIG_MMC_DW_ROCKCHIP=y
CONFIG_OF=y
CONFIG_OF_MMC=y3.2 设备树
RK3576 的 SDMMC 控制器在设备树中定义(以下为 RK 平台通用结构示例):
sdhci: sdhci@fe2e0000 {
compatible = "rockchip,dwcmshc-sdhci", "snps,dwcmshc-sdhci";
reg = <0x0 0xfe2e0000 0x0 0x10000>;
interrupts = <GIC_SPI 126 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru CLK_EMMC>, <&cru PCLK_EMMC>,
<&cru CCLK_SRC_EMMC>, <&cru SCLK_SFC_EMMC>,
<&cru HCLK_EMMC>;
clock-names = "core", "axi", "block", "fio", "ahb";
resets = <&cru SRST_EMMC>;
reset-names = "emmc";
status = "disabled";
};
sdmmc: dwmmc@fe2b0000 {
compatible = "rockchip,rk3576-dw-mshc", "rockchip,rk3288-dw-mshc";
reg = <0x0 0xfe2b0000 0x0 0x4000>;
interrupts = <GIC_SPI 124 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_SDMMC>, <&cru CLK_SDMMC>,
<&cru SCLK_SDMMC>;
clock-names = "ciu", "biu", "ciu-div";
fifo-depth = <0x100>;
max-frequency = <150000000>;
status = "disabled";
};
sdio0: dwmc@fe310000 {
compatible = "rockchip,rk3576-dw-mshc";
reg = <0x0 0xfe310000 0x0 0x4000>;
interrupts = <GIC_SPI 127 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&cru HCLK_SDIO0>, <&cru CLK_SDIO0>,
<&cru SCLK_SDIO0>;
clock-names = "ciu", "biu", "ciu-div";
fifo-depth = <0x100>;
max-frequency = <150000000>;
status = "disabled";
};以上寄存器基地址、中断号与时钟标识为 RK 平台通用结构示例,具体数值以实际发布的 RK3576 SDK 设备树为准(待板上确认)。
4. 操作步骤
4.1 查看 eMMC 信息
# 查看 eMMC 型号和容量
cat /sys/block/mmcblk0/device/name
cat /sys/block/mmcblk0/device/cid
# 查看 eMMC 分区
fdisk -l /dev/mmcblk0
# 查看 eMMC 速度模式
cat /sys/block/mmcblk0/device/ppr_cap4.2 SD 卡操作
# 查看 SD 卡信息
cat /sys/block/mmcblk1/device/name
cat /sys/block/mmcblk1/size # 扇区数
# 格式化 SD 卡(ext4)
mkfs.ext4 /dev/mmcblk1p1
# 挂载 SD 卡
mkdir -p /mnt/sdcard
mount /dev/mmcblk1p1 /mnt/sdcard
# 卸载 SD 卡
umount /mnt/sdcard
# 安全移除 SD 卡
echo 0 > /sys/block/mmcblk1/device/power/runtime_autosuspend_delay4.3 eMMC 分区管理
# 查看 eMMC 分区表
parted /dev/mmcblk0 print
# 使用 dd 烧录镜像到 eMMC
dd if=/path/to/image.img of=/dev/mmcblk0 bs=4M status=progress
# 使用 fastboot 烧录(通过 USB)
fastboot flash mmc0 image.img4.4 通过 debugfs 查看存储信息
# 查看 eMMC 寄存器信息
cat /sys/kernel/debug/mmc0/ios
cat /sys/kernel/debug/mmc0/caps
# 查看 SD 卡状态
cat /sys/kernel/debug/mmc1/ios5. 代码详解
5.1 内核中 SDMMC 驱动的注册
// RK3576 eMMC 控制器驱动(简化)
// drivers/mmc/host/dw-mshc-rockchip.c
static struct platform_driver rockchip_dwcmshc_driver = {
.probe = rockchip_dwcmshc_probe,
.remove = rockchip_dwcmshc_remove,
.driver = {
.name = "rockchip-dwcmshc",
.of_match_table = rockchip_dwcmshc_match,
},
};
static const struct of_device_id rockchip_dwcmshc_match[] = {
{ .compatible = "rockchip,dwcmshc-sdhci" },
{ /* sentinel */ }
};5.2 用户空间存储操作的内核调用链
用户空间 mount /dev/mmcblk0p1 /mnt
→ vfs_mount()
→ ext4_fill_super()
→ mmc_blk_read_single()
→ mmc_read_single()
→ dw_mci_send_cmd()
→ 设置 SDMMC 寄存器,发起读操作6. 常见问题
6.1 eMMC 无法识别
现象: ls /dev/mmcblk* 无 eMMC 设备
解决方案:
# 检查 eMMC 控制器时钟
cat /sys/kernel/debug/clk/clk_emmc/clk_rate
# 检查设备树中 eMMC 节点状态
# 具体节点路径以实际 DTB 反编译结果为准
dtc -I dtb -O dts /sys/firmware/fdt | grep -A3 "sdhci@"确认设备树中 eMMC 节点 status = "okay",检查核心板与底板连接。
6.2 SD 卡读写速度慢
现象: SD 卡读写速度远低于标称值
解决方案:
# 检查 SD 卡速度模式
cat /sys/kernel/debug/mmc1/ios
# 使用 dd 测试读写速度
dd if=/dev/mmcblk1 of=/dev/null bs=1M count=100
dd if=/dev/zero of=/dev/mmcblk1 bs=1M count=100确认 SD 卡支持 UHS-I 模式,检查总线宽度配置(1bit/4bit)。
6.3 eMMC 坏块
现象: eMMC 读写错误增多,系统不稳定
解决方案:
# 查看 eMMC 错误计数
cat /sys/block/mmcblk0/device/pre_eol_info
cat /sys/block/mmcblk0/device/life_time_est_typ_a
# 使用 badblocks 检测坏块
badblocks -v /dev/mmcblk0eMMC 有内置坏块管理机制,但寿命耗尽时需要更换核心板。
