4. SD/MMC 卡操作指南

4.1. 操作准备

  1. 使用SDK 发布的 U-boot 和 kernel。

  2. 文件系统:
    对于SD/MMC卡来说,SDK仅支持FAT文件系统,支持可读可写。
    启动至kernel后需挂载至/mnt/sd目录或根据项目需求的目录即可。
  3. 可透过fdisk工具实现分区的工作。

  4. CV184x SD 支持 2.0与3.0:

目前 CV184x SD/MMC卡仅支持3.3V VDDIO,使用者需注意。

4.2. 操作过程

  • 默认 SD/MMC 相关驱动模块已全部编入内核,不需再额外执行加载命令。

  • 插入卡片上电启动,可以在 U-Boot 下,通过 fat 相关指令查看卡片内容。 启动平台至 kernel 后,会自动扫描 SD 卡识别产生相应节点:/dev/mmcblk0/dev/mmcblk0p1

  • U-Boot 下卡片不支持热插拔操作,kernel 下支持热插拔。在 kernel 下插入 SD 卡,就可以对 SD 卡进行相关的操作。具体操作请参见下文”操作示例”。

4.3. 操作示例

4.3.1. U-Boot 下操作 SD 卡

SD/MMC 在 U-Boot 下仅支持 FAT 文件系统,且不支持热插拔,须在启动 U-Boot 前插入 SD 卡。

步骤1:扫描 SD/MMC 总线

mmc rescan

步骤2:确认 SD 卡是否被正确识别

mmc rescan 成功后,需逐一确认设备是否存在以及分区表是否正确,否则后续 fatls 会报 Couldn't find partition mmc 0:1

a. 查看已识别的 MMC 设备列表

mmc list

输出示例:

mmc@04300000: 0 (SD)
mmc@04310000: 1

确认 SD 卡所在设备号(上例中设备 0 为 SD 卡)。

b. 设置当前设备并查看分区表

mmc dev 0            # 切换到 SD 卡设备(设备号以 mmc list 输出为准)
mmc info             # 查看设备信息(容量、速率等)
mmc part             # 列出分区表,确认分区号是否存在

输出示例:

Partition Map for MMC device 0  --   Partition Type: DOS

Part    Start Sector    Num Sectors     UUID            Type
  1     2048            61407232        00000000-01     0c Boot

上例中分区号为 1(Part 列),类型 0c 表示 FAT32(LBA)。如果 mmc part 无输出,表示 SD 卡尚未分区,需要先在 Linux 或 Windows 下分区并格式化为 FAT32。

c. 根据分区表中的实际分区号确认操作对象

如果 mmc part 输出显示分区号为 1,则后续命令使用 mmc 0:1;若为其他编号(如 2),则需相应替换为 mmc 0:2

步骤3:查看 SD 卡内的文件(FAT)

fatls mmc 0:1 /

其中 0mmc list 确认的设备号,1mmc part 确认的分区号。

步骤4:将文件读入内存

fatload mmc 0:1 0x82000000 filename.bin

步骤5:从内存写入文件到 SD 卡

fatwrite mmc 0:1 0x82000000 newfile.bin 0x100000

其中 0x82000000 为加载地址,0x100000 为写入字节数,请按实际环境修改。

4.3.2. Linux 下操作 SD 卡

步骤1:检查分区

插入 SD 卡后,检查是否产生设备节点:

ls /dev/mmcblk0*
  • 若显示 /dev/mmcblk0 但没有对应分区(如 mmcblk0p1),表示 SD 卡尚未分区或格式化。

  • 若有 /dev/mmcblk0p1,表示已分区,可跳过步骤 2 直接挂载。

步骤2:分区与格式化(若 SD 卡尚未分区)

# 创建分区(按提示操作)
fdisk /dev/mmcblk0

# 格式化为 FAT32
mkdosfs -F 32 /dev/mmcblk0p1

步骤3:挂载

mount /dev/mmcblk0p1 /mnt/sd

步骤4:读写文件

# 查看 SD 卡内容
ls /mnt/sd

# 从 SD 卡复制文件到本地(读)
cp /mnt/sd/data.bin ./

# 从本地复制文件到 SD 卡(写)
cp ./data.bin /mnt/sd/

# 同步写入并卸载
sync
umount /mnt/sd

4.4. 操作中需要注意的问题

  1. 需确保SD卡与卡槽硬件脚位接触良好,如若接触不良,有可能会出现检测错误或读写数据错误相关错误信息,并导致读写失败。

  2. 每次插入 SD 卡后,都需要做一次挂载操作,才能读写 SD 卡;如果SD 卡已经挂载到文件系统,拔卡前则必须做一次卸载(umount)操作,否则有可能在下次插入SD卡后看不到SD卡分区。另,异常拔卡亦需要进行卸载动作。

  3. 必须确保 SD 卡已经创建分区,并将该分区格式化为 FAT或FAT32文件系统(LINUX下通过 fdisk命令,Windows下使用磁盘管理工具)。

  4. 在正常操作过程中不能进行的操作:

    • 读写 SD 卡时不要拔卡,否则会打印一些异常信息,并且可能会导致卡中文件或文件系统被破坏。

    • 若当前目录是处于挂载目录之下如/mnt/sd 时,则无法进行卸载操作,必须离开当前目录如/mnt/sd,才能进行卸载操作。

    • 系统中读写挂载目录的进程没有完全结束前,不能进行卸载操作,必须完全结束操作挂载目录的任务才能正常卸载。

    • 在操作过程中出现异常时的操作:

      1. 如果因为读写数据或其它不明原因导致文件系统被破坏,读写SD卡时可能会出现文件系统错误信息,这时需要进行卸载操作,拔卡,再次插卡并挂载,才能再次正常读写 SD 卡。

      2. 因为SD卡的注册,检测/注销过程需要一定的时间,因此拔卡后若再快速地插入卡,有可能会出现检测不到SD卡的现象。

      3. 如果在测试过程中异常拔卡,使用者需要按 ctrl+c 以回退出到kernel shell 下,否则会一直不停地打印异常信息。

      4. SD 卡上有一个以上的分区时,可以通过挂载操作切换挂载不同的分区,但最后需确认挂载操作的次数与卸载操作次数相等,才能确保完全卸载所有的挂载分区。