Skip to main content

MMC

概述

MMC(MultiMediaCard)是一种存储卡标准,涵盖多种产品形态:

  • eMMC:嵌入式存储,直接焊接在电路板上,常用于手机、平板等设备,具有集成控制器和闪存。
  • SD 卡:可移动存储卡,广泛应用于数码相机、笔记本等,分为标准、mini、micro 等尺寸。
  • SDIO:基于 SD 卡接口扩展的设备,不仅用于存储,还能实现无线网卡、蓝牙模块等功能。

关键特性

MTT E300 板级支持 MMC(MultiMediaCard)存储卡标准。

  • 支持两路 mmc 控制器
  • mmc0 支持 emmc,电压为 1.8V
  • mmc1 支持 sd 卡和 sdio 设备,默认电压为 3.3V,可以切换为 1.8V
  • 支持 emmc legacy speed、high speed、ddr、hs200、hs400、hs400es 速度模式
  • 支持 sd 卡和 sdio legacy speed、high speed、uhs sdr50、sdr104、ddr50 等速度模式
  • 支持 amda 传输方式
  • 寄存器接口兼容 SDHCI 6.00 标准
  • 兼容 SD Specifications - Part 1 Physical Layer Specification 6.10 标准
  • 兼容 SD Specifications - Part E1 SDIO Specification 4.10 标准
  • 兼容 Embedded Multi-Media Card (eMMC) Electrical Standard 5.1 标准

配置流程

步骤 1:配置 U-Boot 设备树

MTT E300 的设备树文件路径为:arch/arm/dts/。下面以 MTT E300 配置作为板级设备树文件示例。

  1. 打开 mthreads-m1000-aimodule.dts,找到 emmc 节点。
  2. mmc-hs400-enhanced-strobe; 表示支持 hs400es 速度模式
  3. mmc-hs400-1_8v; 表示支持 hs400 速度模式
  4. mmc-hs200-1_8v; 表示支持 hs200 速度模式
  5. mmc-ddr-1_8v; 表示支持 ddr 速度模式
  6. sdhci-caps = <0x0 0x40000>; 表示支持 8 线模式。如果使用 4 线或 1 线模式,可以屏蔽掉这一行。
  7. 默认使用 8 线模式。若使用 4 线模式,配置 bus-width = <4>;若使用 1 线模式,配置 bus-width = <1>
  8. 在同一文件中找到 sd 节点:
    • sd; 表示 sd 卡或 sdio。
    • 默认使用 4 线模式,如果想使用 1 线模式,配置 bus-width = <1>

步骤 2:配置 Linux 设备树

linuxMTT E300 的设备树文件路径为:arch/arm64/boot/dts/m1000/。下面以 t021 配置作为板级设备树文件示例。 打开 m1000-t021.dtsi 文件:

  1. 找到 mmc0 节点,mmc0 支持 emmc

    • no-sdio; 表示不支持 sdio

    • no-sd; 表示不支持 sd 卡。

    • bus-width = <8>; 表示使用 8 线模式。 如果想使用 4 线模式,配置 bus-width = <4>; 如果想使用 1 线模式,配置 bus-width = <1>;

    • cap-mmc-highspeed; 表示支持 high speed 速度模式。

    • mmc-ddr-1_8v; 表示支持 ddr 速度模式。

    • mmc-hs200-1_8v; 表示支持 hs200 速度模式。

    • mmc-hs400-1_8v; 表示支持 hs400 速度模式。

    • mmc-hs400-enhanced-strobe; 表示支持 hs400es 速度模式。

  2. 找到 mmc1 节点,mmc1 支持 sd 卡和 sdio

    • sd-uhs-sdr12; 表示支持 uhs sdr12 速度模式。
    • sd-uhs-sdr25; 表示支持 uhs sdr25 速度模式。
    • sd-uhs-sdr50; 表示支持 uhs sdr50 速度模式。
    • sd-uhs-ddr50; 表示支持 uhs ddr50 速度模式。
    • sd-uhs-sdr104; 表示支持 uhs sdr104 速度模式。
    • disable-wp; 表示禁止写保护功能。
    • bus-width = <4>; 表示支持 4 线模式。 如果想使用 1 线模式,配置 bus-width = <1>;
    • sdhci-caps-mask = <0x0 0x0>; 表示不禁止 sd 的多种速度模式。
    • power-gpios 用于配置 sd 卡和 sdio 的电源使能管脚。
    • vol-switch-gpios 用于配置 sd 卡和 sdio 的电压切换管脚。

打开 m1000-t021.dts 文件,找到 mmc0mmc1 节点,如下图所示:

E300 078 图示

以上管脚分别是 mmc0mmc1 所用管脚,保持默认配置即可正常使用。


步骤 3:配置内核

Linux 内核的配置菜单中要选中 MTT E300 mmc 的驱动,路径如下:

E300 079 图示

MMC/SD/SDIO card support 菜单中,需要选中以下多个选项:

  • HW reset support for eMMC:支持 eMMC 复位。
  • MMC block device driver:支持 MMC 驱动模型。
  • Secure Digital Host Controller Interface support:支持兼容 SDHCI 标准的 MMC。
  • SDHCI support for ACPI enumerated SDHCI controllers:支持使用 ACPI 的 MMC 驱动。
  • SDHCI platform and OF driver helper:支持使用设备树的 MMC 驱动。
  • SDHCI support for the Cadence SD/SDIO/eMMC controller:支持 MTT E300 的 MMC 驱动。

调试方法说明

MMC 常用调试工具包括 ddfio 等。

  • dd 是 Linux 系统中一个功能强大且低级别的命令行工具,主要用于复制和转换文件数据(尤其是块设备或原始数据)。基本用法:

    dd if=输入文件 of=输出文件 [选项]

    常用选项:

    if=FILE 输入文件(Input File)
    of=FILE 输出文件(Output File)
    bs=BYTES 单次读写块的大小(Block Size),如 bs=4M(默认 512B)
    count=N 仅复制 N 个块(按 bs 指定的大小)
    skip=N 跳过输入文件的前 N 个块
    seek=N 跳过输出文件的前 N 个块
    status=LEVEL 输出状态信息,如 status=progress(显示进度)
  • fio(Flexible I/O Tester)是一个功能强大的 I/O 性能测试工具。

    常用选项:

    --rw=模式
    --bs=块大小
    --iodepth=N I/O 队列深度(控制并发请求数)
    --numjobs=N 并发线程/进程数
    --runtime=秒 测试时长
    --size=大小 每个线程处理的数据总量(如 1G, 500M)
    --filename=路径 试文件或设备路径(如 /dev/sdb, /mnt/testfile)
    --direct=1 绕过系统缓存(直接访问磁盘)
    group_reporting 合并所有线程的结果报告

常见问题

Q:为什么 mmc1 支持 3.3V 电压,但是又支持 1.8V 电压切换?

A: mmc1 支持 SD 卡和 SDIO 设备。当运行在 Legacy SpeedHigh Speed 模式时,使用 3.3V 电压 即可。 但若使用较高速度模式(如 UHS SDR50SDR104 等),则需切换到 1.8V 模式。

tip

一旦电压从 3.3V 切换至 1.8V,若需再切回 3.3V,必须先给 SD 卡或 SDIO 设备断电,否则可能导致设备无法正常识别或工作。