Rockchip RK3399 - MMC&SD&SDIO基础

本文详细介绍了Rockchip RK3399平台中MMC、SD和SDIO的基础知识,包括它们的发展历史、版本阶段、总线引脚定义、信号时序以及配置步骤。从卡的多媒体卡起源到SD卡的安全数字存储卡演进,再到SDIO的外设接口,文章深入剖析了各个阶段的关键技术和规格变化,为理解Rockchip RK3399的存储和通信协议提供了全面的指导。

----------------------------------------------------------------------------------------------------------------------------

开发板 :NanoPC-T4开发板eMMC16GBLPDDR34GB
显示屏 :15.6英寸HDMI接口显示屏u-boot2023.04linux6.3
----------------------------------------------------------------------------------------------------------------------------

MMCMultiMedia Card的简称,从本质上看,它是一种用于固态非易失性存储的内存卡规范,定义了诸如卡的形态、尺寸、容量、电气信号、和主机之间的通信协议等方方面面的内容。

1997MMC规范发布至今,基于不同的考量(物理尺寸、电压范围、管脚数量、最大容量、数据位宽、clock频率、安全特性、是否支持SPI mode、是否支持DDR mode等等),进化出了MMCSDmicro SDSDIOeMMC等不同的规范;

需要注意的是:这张图只供参考,2012年之后的规范并没有绘制。

SD卡基于MMC发展而来,二者最初的外观尺寸也很类似,SD卡比MMC卡厚0.7mm

早期SD卡对MMC卡的兼容性较强,多数支持SD卡插槽的设备都可以同时支持MMC卡,反之只有MMC卡插槽的设备不能够支持SD卡。

随着MMC卡和 SD卡的发展竞争,二者之间的差异越来越大,走向了截然不同的发展方向。

发展到今天, MMC卡基本退出了历史舞台,转而走向了嵌入式领域,推出了eMMC(embedded MMC) 标准,在嵌入式存储方面应用广泛。

SD卡在移动存储卡领域的地位越发稳固,不断向大容量和高速度方向发展,推出了一系列接口标准,目前最新的理论传输速率已达 985MB/s

从二者目前的发展趋势看,eMMC正在被更先进的UFS技术标准取代,SD的发展前景似乎更为广阔。

一、MMC发展历史

MMC卡的全称是MultiMedia Card,中文翻译为“多媒体卡”。

MMC卡的设计目标是提供一种“广泛应用于电子玩具、pda、照相机、智能手机、数字录音机、MP3播放器、寻呼机等等领域”的通用低成本数据存储和通信媒体。

1.1 MMC 1.x/2.x版本阶段

从目前可检索到的MMC技术文档来看,MMC初始1.0版本的Spec1996年就已经制定完成,1997年推出相关产品。

1.02.0版本的发展阶段在1996-2000年,该阶段MMC卡的形态及技术规格没有大的变化,主要是一些内部功能性的演进。

这个阶段MMC卡的主要特性:

  • Size24mm x 32mm x 1.4mm
  • Pins7pins
  • Bus Width1bit
  • Bus ModeMMC mode& SPI mode
  • Voltage2.7 - 3.6V
  • Clock0 – 20MHz
1.2 MMC v3.x版本阶段

v3.0版本是MMC发展历史上一个重要的版本,该版本相对于1.0/2.0版本有重大变化。

但是由于v3.0版本在内部寄存器定义中有严重错误,v3.0版本很快被更新为v3.1,并且v3.0版本被废弃。

v3.1版本新增了两个重要特性:

  • 引入Low Voltage规格,支持1.65 - 1.95V工作电压;
  • 增加multiple block read/write特性,提升Performance

v3.3版本也是一个重要的版本,该版本新增RS-MMC(Reduced Size MMC)规格,制定24mm x 18mm x 1.4mm尺寸规格,将MMC 卡的大小减少近一半。

RS-MMC只是物理尺寸的定义,硬件接口没有变化。

1.3 MMC v4.x版本阶段

v4.x系列版本从2004年开始发布,v4.xMMC最为流行的版本,也是目前为止持续时间最长的版本,从2004年v4.1发布到2013 v5.0 发布共持续了9年。

其间,JEDEC (Joint Electron Device Engineering Council电子元件工业联合会)采用MMC4.1标准作为JEDEC的闪存卡标准;

随后MMCA(Multi Media Card Association快闪记忆卡标准组织)正式并入 JEDECMMC标准由JEDEC主导推进。

目前,从JEDEC官方站点可以下载到的MMC最早版本为v4.1,其直接继承自MMCAMMC v4.1版本。

1.3.1 MMC v4.1版本

鉴于之前版本的MMC卡性能较差,v4.1版本增加了以下重要的特性以提升性能并做到向后兼容:

  • 工作频率支持三种模式:0-20MHz0-26MHz0-52MHz
  • Bus Width支持三种模式:1/4/8bits
  • 定义了最低Performance标准:2.4MB/s
  • 向后兼容v3.x版本MMC(1 bit data busmulticard systems);
  • MMC mode只支持one card per MMC bus;
  • SPI mode支持MMC Chip Select Signal,可实现multiple cards per MMC bus
  • 提升MMC卡的存储容量;

符合v4.1版本规格的MMC卡称为HS MMC(High Speed MMC),由于bus width变化,所以HS MMC卡的接口增加了6pins,变成 13pins

v4.1版本对市场上的MMC产品进行了明确的划分,定义了两种MMC卡类型:MMC plusMMC mobile,只有符合相应规格的卡片才能使用 MMC plusMMC mobile logo

MMC plusMMC mobile应用于不同的使用场景,均向后兼容v3.x 20MHz clock的工作模式.

(1 )MMC plus规格:

  • size24mm x 32mm x 1.4mm,全尺寸;
  • Voltage2.7 - 3.6V
  • Pins13pins
  • bus width1/4/8bits
  • Bus ModeMMC mode & SPI mode
  • Clock26MHz(52MHz可选);
  • Performance:不低于2.4MB/s

(2) MMC mobile规格:

  • size24mm x 18mm x 1.4mm,符合RS-MMC标准;
  • Voltage2.7 - 3.6V/1.65 - 1.95V,支持Low Voltage模式;
  • Pins13pins
  • bus width1/4/8bits
  • Bus ModeMMC mode & SPI mode
  • Clock26MHz(52MHz可选);
  • Performance:不低于2.4MB/s

(3) MMC mirco规格:

Samsung2004年底发布了一款MMC mirco卡,该卡不同于MMC Spec中定义的MMC plusMMC mobile规格,其尺寸降低至:12mm x 14mm x 1.1mm,大概为RS-MMC1/3

MMC microSamsung发布的第三方规格,初期并没有收录到MMC标准中,依靠Samsung自身的影响力及其轻巧的尺寸占有一定的市场地位。

随后,MMCA协会也正式发布了MMCmicro的技术规范。在20056月底于瑞士苏黎世举行的MMCA夏季大会上,MMCA全体参会成员一致同意将MMC micro卡确立为MMCA新一代标准。

2004年底MMCA发布MMC plus卡和MMC mobile卡之后,全新的微小尺寸的MMC micro卡可谓是MMC技术的新一代标准。

1.3.2 MMC v4.2版本

v4.1版本定义的寻址方式为Byte寻址,理论上可以支持最大容量为4GB

v4.2版本增加了sector寻址模式,每个sector512Byte,小于2GB容量的卡采用Byte寻址模式,大于2GB容量的卡采用sector 寻址模式。

同时v4.2版本将Low Voltage工作电压范围修改为1.7 - 1.95V

1.3.3 MM
你提供的设备树片段配置了 SDMMC 控制器(`&sdmmc`),用于支持 TF 卡(SD卡)功能。但存在一些**重复配置、潜在冲突和未启用关键参数**的问题。下面我将详细分析你当前的设备树配置,指出问题,并给出优化建议。 --- ## ✅ 当前设备树配置分析 ### 1. **引脚配置部分(pinctrl)** ```dts &sdmmc0_bus4 { rockchip,pins = ...; }; &sdmmc0_clk { rockchip,pins = ...; }; &sdmmc0_cmd { rockchip,pins = ...; }; ``` - 这些节点定义了 SDMMC 的数据线(D0-D3)、时钟线(CLK)和命令线(CMD)的引脚复用。 - 配置看起来是正确的,使用了 `RK_PA4~PA7` 作为数据线,`RK_PB0` 为时钟,`RK_PB1` 为命令线。 ### 2. **SDMMC 控制器配置** ```dts &sdmmc { bus-width = <4>; cap-mmc-highspeed; cap-sd-highspeed; card-detect-delay = <200>; rockchip,default-sample-phase = <90>; supports-sd; status = "okay"; vmmc-supply = <&vcc_sd>; }; ``` - **基本功能已启用**:`bus-width = 4` 表示使用 4 线宽模式(SDMMC 默认配置) - **供电配置正确**:`vmmc-supply = <&vcc_sd>` 表示使用指定电源 - **采样相位设置**:`rockchip,default-sample-phase = <90>` 可以尝试优化 SD 读写稳定性 ### 3. **注释掉的 SDMMC 配置** ```dts /* //&sdio { &sdmmc { ... */ ``` - 注释掉的代码中包含 `max-frequency`、`cap-sdio-irq`、`rockchip,default-sample-phase` 等参数,可能用于 SDIO 或更高速度设置。 - 如果你使用的是 SD 卡(TF卡),这部分配置可以忽略,但如果是 SDIO WiFi 模块,则需要启用。 --- ## ❗常见问题分析 ### ❌ 1. 没有配置卡检测(card detect)引脚 ```dts cd-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>; ``` - 如果你的硬件设计中使用了卡检测引脚(CD),必须配置该项,否则系统无法检测卡是否插入。 ### ❌ 2. 没有配置写保护(Write Protect)引脚 ```dts wp-gpios = <&gpio0 RK_PB3 GPIO_ACTIVE_LOW>; ``` - 如果你的硬件支持写保护,建议配置该项。 ### ❌ 3. 没有启用 `non-removable`(非移除设备) ```dts non-removable; ``` - 如果 TF 卡是固定插入的(如嵌入式 eMMC),可以加上该属性,避免系统频繁检测卡插拔。 ### ❌ 4. 采样相位可能不合适 ```dts rockchip,default-sample-phase = <90>; ``` - 该值是时钟采样点的相位,不同卡可能需要不同值(如 0, 45, 90, 135, 180, 225, 270, 315)。 - 如果 TF 卡读写不稳定,可尝试修改此值。 --- ## ✅ 推荐优化后的完整配置 ```dts &sdmmc { status = "okay"; bus-width = <4>; cap-sd-highspeed; card-detect-delay = <200>; vmmc-supply = <&vcc_sd>; non-removable; // 如果是固定插入卡 cd-gpios = <&gpio0 RK_PB2 GPIO_ACTIVE_LOW>; // 卡检测引脚 wp-gpios = <&gpio0 RK_PB3 GPIO_ACTIVE_LOW>; // 写保护引脚 rockchip,default-sample-phase = <135>; // 可根据实际测试调整 supports-sd; }; ``` > ⚠️ 注意:`cd-gpios` 和 `wp-gpios` 的 GPIO 引脚请根据你硬件设计修改。 --- ## ✅ 示例代码(C语言):检查 TF 卡是否插入(通过卡检测 GPIO) ```c #include <stdio.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #define GPIO_PATH "/sys/class/gpio/gpio" // 假设卡检测引脚是 gpio0 RK_PB2 -> gpio 2 int check_sd_card_inserted(int gpio_pin) { char path[128]; char value; // 导出 GPIO int fd = open("/sys/class/gpio/export", O_WRONLY); if (fd >= 0) { char buf[8]; sprintf(buf, "%d", gpio_pin); write(fd, buf, strlen(buf)); close(fd); } // 设置方向为输入 sprintf(path, "/sys/class/gpio/gpio%d/direction", gpio_pin); fd = open(path, O_WRONLY); if (fd >= 0) { write(fd, "in", 2); close(fd); } // 读取值 sprintf(path, "/sys/class/gpio/gpio%d/value", gpio_pin); fd = open(path, O_RDONLY); if (fd < 0) { perror("无法打开 GPIO value"); return -1; } read(fd, &value, 1); close(fd); return (value == '0') ? 1 : 0; // 低电平表示插入(取决于硬件设计) } int main() { int gpio_pin = 2; // gpio0 RK_PB2 -> gpio2 if (check_sd_card_inserted(gpio_pin) == 1) { printf("TF卡已插入\n"); } else { printf("TF卡未插入\n"); } return 0; } ``` --- ## ✅ 常见问题排查步骤 | 步骤 | 操作 | 目的 | |------|------|------| | 1 | 检查设备树中 `cd-gpios` 是否配置 | 判断是否启用卡检测 | | 2 | `dmesg \| grep -i mmc` | 查看内核是否识别 SD 控制器 | | 3 | `ls /dev/block/mmcblk*` | 查看设备节点是否生成 | | 4 | 使用 `cat /sys/class/gpio/gpioX/value` | 手动查看卡检测 GPIO 值 | | 5 | 使用 `mount` 挂载 TF 卡 | 验证是否可正常读写 | --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Graceful_scenery

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值