mmc/eMMC/SD-card接口异同

本文深入探讨了SD卡和eMMC存储技术的区别与联系,解释了它们如何将闪存控制器和NAND Flash封装在一起,以及在Linux系统中设备名称的命名规则。同时,文章还对比了SD卡与TF卡的管脚定义,揭示了SDIO协议与MMC协议的兼容性。

MMC(multiMedia card)是一种通信协议,支持两种模式SPI和MMC

eMMC是一种支持MMC协议的芯片

MMC/e •MMC communication is based on  an advanced 10-signal bus. The communication protocol is
defined as a part of this standard and  referred to as the  MultiMediaCard mode.

eMMC和SD卡都是将闪存控制器和NAND Flash封装在一起,只是接口不同,eMMC一般是BGA封装,焊接在PCB上

SD卡单独封装,使用SDIO接口通讯, SD卡是在MMC基础上发展起来,且兼容MMC,所以在Linux系统下,SD卡设备名称是mmcblk(mmcblk0p1代表第一个分区, 问题mmcblk0和mmcblk1是分别代表sd卡和eMMC设备还是二者谁先挂上谁就是mmcblk0?)

SDIO可以使用与MMC兼容的模式

那么是否可以理解,eMMC芯片接口支持MMC协议,而MMC协议支持SPI和MMC两种模式,所以eMMC支持SPI和MMC,而SD卡支持SDIO和SPI。而SDIO和MMC又兼容。

SD卡的管脚定义和Micro SD(TF)卡的管脚定义是不一样的。
TF卡
  • SD卡:1-data3,2-cmd,3-vss,4-vdd,5-clk,6-vss,7-data0,8-data1,9-data2.
  • TF卡(SD模式):1-data2,2-data3,3-cmd,4-vdd,5-clk,6-vss,7-data0,8-data1
  • TF卡(SPI模式):1-rsv,2-cs,3-di,4-vdd,5-sclk,6-vss,7-do,8-rsv
 SDTF(SD)TF(SPI)
1 data3 data2 rsv 2 cmd data3 cs 3 vss cmd di 4 vdd vdd vdd 5 clk clk sclk 6 vss vss vss 7 data0 data0 do 8 data1 data1 rsv 9 data2    

也就是说SDIO协议兼容MMC协议,SD和MMC都支持SPI模式。

你遇到的错误: ```text mkdir: can't create directory '/mnt/emmc': Read-only file system ``` 意思是:**`/mnt` 所在的文件系统是只读的(read-only)**,无法创建新目录。 这个问题在 OpenWrt 或嵌入式 Linux 系统中很常见。下面我们来 **详细分析原因并提供解决方案**。 --- ## 🔍 一、问题本质 你在尝试执行: ```bash mkdir -p /mnt/emmc ``` 但失败了,提示 “Read-only file system”。 说明: - `/mnt` 目录所在的根文件系统(即 `/`)目前是 **只读挂载** - 所以你不能在这个目录下新建任何东西 📌 注意:这不是权限问题(比如 `Permission denied`),而是整个文件系统被设计为不可写! --- ## 🧩 二、为什么 OpenWrt 的根文件系统是只读的? OpenWrt 默认将根文件系统(通常是 `squashfs`)设为 **只读**,原因如下: | 原因 | 说明 | |------|------| | ✅ 防止意外修改 | 避免配置损坏导致系统无法启动 | | ✅ 提高稳定性 | 尤其适用于路由器/NVR等长期运行设备 | | ✅ 支持固件升级 | squashfs 是压缩只读镜像,配合 overlayfs 实现“可写假象” | 🔍 查看你的根文件系统类型: ```bash mount | grep "on / " ``` 输出可能是: ```text /dev/root on / type squashfs (ro,noatime) ``` 👉 `(ro)` 表示 **read-only** —— 正常现象! --- ## ✅ 三、正确解决方案:使用可写区域创建挂载点 虽然 `/` 是只读的,但 OpenWrt 提供了一个 **可写的 overlay 文件系统**,通常位于: ```text /tmp /var /overlay ``` 这些目录是可以写的! ### ✔️ 推荐做法:把挂载点建在 `/tmp` 或 `/var` 下 #### 方法 1:使用 `/tmp/mnt`(推荐) ```bash mkdir -p /tmp/mnt/emmc mount /dev/mmcblk0p1 /tmp/mnt/emmc ``` ✅ 解释: - `/tmp` 是 tmpfs,内存中的可写文件系统 - 挂载后你可以通过 `/tmp/mnt/emmc` 访问 EMMC 内容 📌 缺点:重启后 `/tmp` 会清空,你需要重新挂载 --- #### 方法 2:使用 `/var/mnt`(持久性稍好) ```bash mkdir -p /var/mnt/emmc mount /dev/mmcblk0p1 /var/mnt/emmc ``` > `/var` 通常也是可写的(链接到 `/overlay`) --- ### 🔄 创建符号链接(方便访问) 为了让路径更直观,可以加个软链接: ```bash ln -sf /tmp/mnt/emmc /mnt/emmc ``` 这样你就可以用 `/mnt/emmc` 来访问了(它其实是指向 `/tmp/mnt/emmc` 的快捷方式)。 ⚠️ 注意: - 这个符号链接本身不会报错,因为只是创建一个“指针” - 但你要确保目标目录(如 `/tmp/mnt/emmc`)存在且已挂载 --- ## 🔧 四、如何永久解决?让 `/mnt` 可写(高级) 如果你希望真正拥有一个可写的 `/mnt`,可以这样做: ### 方案:在 overlay 中创建真实目录,并 bind mount ```bash # 创建实际可写的目录 mkdir -p /var/mnt # 把它绑定到 /mnt(需要先有 /mnt) mount --bind /var/mnt /mnt ``` 现在 `/mnt` 就是可写的了!后续你可以: ```bash mkdir /mnt/emmc # 成功! ``` 💡 要开机自动生效,在 `/etc/rc.local` 加入: ```bash mkdir -p /var/mnt mount --bind /var/mnt /mnt exit 0 ``` --- ## 🛠️ 五、补充:确认你要挂载的设备是否存在 你说要挂载 eMMC,先确认设备名是否正确: ```bash ls /dev/mmc* ``` 可能输出: ```text /dev/mmcblk0 # 整块 eMMC 设备 /dev/mmcblk0p1 # 第一个分区(常用) /dev/mmcblk0p2 ``` 然后格式化并挂载: ```bash # 格式化为 ext4(首次使用才需要) mkfs.ext4 /dev/mmcblk0p1 # 创建挂载点 mkdir -p /tmp/mnt/emmc # 挂载 mount /dev/mmcblk0p1 /tmp/mnt/emmc ``` 验证: ```bash df -h /tmp/mnt/emmc ``` --- ## 📋 总结:你现在应该怎么做? | 步骤 | 命令 | |------|------| | 1. 创建可写挂载点 | `mkdir -p /tmp/mnt/emmc` | | 2. 挂载 eMMC 分区 | `mount /dev/mmcblk0p1 /tmp/mnt/emmc` | | 3. (可选)建软链接 | `ln -sf /tmp/mnt/emmc /mnt/emmc` | | 4. 验证成功 | `df -h /tmp/mnt/emmc` | --- ## 💡 小贴士:OpenWrt 文件系统结构简图 ```text / → squashfs (ro) ├── tmp → tmpfs (rw) ✅ 可写 ├── var → tmpfs + overlay (rw) ✅ 可写 ├── overlay → jffs2 或 ubifs (rw) ✅ 可写 └── mnt → 在 squashfs 上,所以默认不可写 ❌ ``` 👉 所以永远不要试图直接往 `/` 下写数据! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值