4. SD/MMC 卡操作指南¶
4.1. 操作准备¶
使用SDK 发布的 U-boot 和 kernel。
- 文件系统:对于SD/MMC卡来说,SDK仅支持FAT文件系统,支持可读可写。启动至kernel后需挂载至/mnt/sd目录或根据项目需求的目录即可。
可透过fdisk工具实现分区的工作。
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 /
其中 0 为 mmc list 确认的设备号,1 为 mmc 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. 操作中需要注意的问题¶
需确保SD卡与卡槽硬件脚位接触良好,如若接触不良,有可能会出现检测错误或读写数据错误相关错误信息,并导致读写失败。
每次插入 SD 卡后,都需要做一次挂载操作,才能读写 SD 卡;如果SD 卡已经挂载到文件系统,拔卡前则必须做一次卸载(umount)操作,否则有可能在下次插入SD卡后看不到SD卡分区。另,异常拔卡亦需要进行卸载动作。
必须确保 SD 卡已经创建分区,并将该分区格式化为 FAT或FAT32文件系统(LINUX下通过 fdisk命令,Windows下使用磁盘管理工具)。
在正常操作过程中不能进行的操作:
读写 SD 卡时不要拔卡,否则会打印一些异常信息,并且可能会导致卡中文件或文件系统被破坏。
若当前目录是处于挂载目录之下如/mnt/sd 时,则无法进行卸载操作,必须离开当前目录如/mnt/sd,才能进行卸载操作。
系统中读写挂载目录的进程没有完全结束前,不能进行卸载操作,必须完全结束操作挂载目录的任务才能正常卸载。
在操作过程中出现异常时的操作:
如果因为读写数据或其它不明原因导致文件系统被破坏,读写SD卡时可能会出现文件系统错误信息,这时需要进行卸载操作,拔卡,再次插卡并挂载,才能再次正常读写 SD 卡。
因为SD卡的注册,检测/注销过程需要一定的时间,因此拔卡后若再快速地插入卡,有可能会出现检测不到SD卡的现象。
如果在测试过程中异常拔卡,使用者需要按 ctrl+c 以回退出到kernel shell 下,否则会一直不停地打印异常信息。
SD 卡上有一个以上的分区时,可以通过挂载操作切换挂载不同的分区,但最后需确认挂载操作的次数与卸载操作次数相等,才能确保完全卸载所有的挂载分区。