衡山派D21x平台SDMC驱动与文件系统参数配置详解
衡山派D21x平台SDMC驱动与文件系统参数配置详解最近在衡山派D21x平台上做项目要用到SD卡存储数据发现很多朋友在配置SDMC驱动和挂载文件系统时容易卡住。今天我就把自己在实际项目中配置SD/MMC控制器SDMC的完整流程分享出来手把手教你如何在Luban-Lite系统下搞定驱动配置、文件系统挂载还有实用的热插拔功能。无论你是用RT-Thread内核还是Baremetal裸机模式这篇教程都能帮你快速上手。咱们从最基础的menuconfig配置开始一步步深入到文件系统挂载最后还会讲讲热插拔怎么设置。1. 驱动配置让系统认识你的SD卡要让D21x芯片能读写SD卡首先得告诉系统“我这里有个SD卡控制器要用”。这个配置过程都在menuconfig里完成相当于给系统做“硬件登记”。1.1 进入配置界面打开你的Luban-Lite项目根目录在终端里输入scons --menuconfig这个命令会打开一个图形化的配置界面用方向键和回车键就能操作很像老式的BIOS设置界面。1.2 选择SDMC控制器D21x芯片内置了3个SDMC控制器SDMC0、SDMC1、SDMC2你需要根据硬件设计选择实际连接SD卡的那个。大多数开发板默认用SDMC1。在menuconfig里按这个路径找到配置项Board options --- [ ] Using SDMC0 [*] Using SDMC1 # 按空格键选中出现*号表示启用 [ ] Using SDMC2 [*] Enable the interrupt of SDMC # 建议开启中断性能更好注意这里有个小技巧当你选中Using SDMC1时系统会自动帮你打开RT-Thread的SDIO设备驱动框架省去了后面单独配置的步骤。1.3 配置SDMC1详细参数选中SDMC1后下面会出现SDMC1 Parameter子菜单按回车进入SDMC1 Parameter --- Select SDMC1 BUSWIDTH (sdmc 4-bit mode) --- # 总线宽度一般选4-bit [ ] Using SDcard hotplug detection # 热插拔检测后面会讲 [ ] SDMC1 connect to a SDIO device # 如果不是接SDIO设备就别选 (3) SDMC1 driver phase # 驱动相位默认3 (0) SDMC1 sample phase # 采样相位默认0 (100000000) SDMC1 CMU clock frequency # 时钟频率默认100MHz这里有几个参数需要解释一下BUSWIDTHSD卡通信的数据线宽度。1-bit模式最兼容4-bit模式速度最快。如果你的SD卡座和芯片引脚连接了4根数据线就选4-bit。driver phase和sample phase这两个是信号相位调整参数主要影响SD卡兼容性。Luban-Lite已经提供了优化后的默认值3和0除非遇到特殊SD卡识别问题否则不要改动。CMU clock frequencySDMC控制器的时钟频率默认100MHz。这个值会影响SD卡的读写速度但也不是越高越好要参考SD卡本身的规格。1.4 RT-Thread内核的特殊配置如果你用的是RT-Thread内核不是裸机还需要额外配置SDIO框架。在menuconfig里找到Rt-Thread options --- RT-Thread Components --- Device Drivers --- [*] Using SD/MMC device driver # 启用SD/MMC设备驱动 (512) The stack size for sdio irq thread # 中断线程栈大小 (15) The priority level value of sdio irq thread # 中断线程优先级 (8192) The stack size for mmcsd thread # mmcsd线程栈大小 (22) The priority level value of mmcsd thread # mmcsd线程优先级 (16) mmcsd max partition # 最大分区数这些参数保持默认一般就够用了。唯一要注意的是栈大小如果你的应用比较复杂SD卡操作频繁可以把mmcsd thread的栈大小从8192适当调大避免栈溢出。2. 文件系统配置让SD卡能存文件驱动配置好了系统能识别SD卡了但还不能像U盘那样存文件。我们需要给SD卡“穿上”文件系统这件“外衣”。2.1 RT-Thread文件系统配置RT-Thread下最常用的文件系统是FatFS在配置里叫elm也就是我们电脑上U盘用的FAT32/exFAT格式。在menuconfig里按这个路径配置Rt-Thread options --- RT-Thread Components --- [*] DFS: device virtual file system --- # 启用虚拟文件系统 [*] Using posix-like functions, open/read/write/close # 启用类POSIX函数 [*] Using working directory # 启用工作目录 (4) The maximal number of mounted file system # 最大挂载文件系统数 (4) The maximal number of file system type # 支持的文件系统类型数 (16) The maximal number of opened files # 同时打开的最大文件数 [*] Using mount table for file system # 重要启用挂载表 [*] Enable elm-chan fatfs # 启用FatFS elm-chans FatFs, Generic FAT Filesystem Module --- # FatFS详细配置 [ ] Using devfs for device objects # 设备文件系统按需启用 [*] Enable ReadOnly file system on flash # 启用Flash只读文件系统 [ ] Enable RAM file system # RAM文件系统按需启用关键配置项说明Using mount table for file system这个一定要打开它允许系统启动时自动挂载文件系统不用我们手动写代码挂载。elm-chan fatfs这就是FatFS文件系统SD卡格式化时一般就格式化成FAT32。其他参数如最大打开文件数、最大挂载数等根据你的应用需求调整。普通应用默认值就够用。2.2 配置自动挂载表打开了Using mount table for file system后需要在代码里定义挂载表。这个表告诉系统“SD卡设备名叫sd0要挂载到/sdcard目录用elm文件系统”。打开你的板级支持包里的board.c文件找到或添加以下代码#ifdef RT_USING_DFS_MNTTABLE #include dfs_fs.h const struct dfs_mount_tbl mount_table[] { #ifdef AIC_USING_SDMC1 {sd0, /sdcard, elm, 0, 0, 0}, // 设备名, 挂载点, 文件系统类型, 标志, 数据 #endif {0} // 结束标记 }; #endif这段代码的意思是如果定义了SDMC1AIC_USING_SDMC1就把名为sd0的SD卡设备用elmFatFS文件系统挂载到/sdcard目录。最后三个0是标志位和私有数据一般填0就行。系统启动后你就能在/sdcard目录下访问SD卡的文件了。2.3 Baremetal模式的文件系统配置如果你用的是裸机模式Baremetal配置会更简单一些Local packages options --- Third-party packages options --- [*] DFS: device virtual file system for baremetal mode --- # 裸机文件系统 [*] Using posix-like functions, open/read/write/close (4) The maximal number of mounted file system (4) The maximal number of file system type (16) The maximal number of opened files [ ] Using mount table for file system # 裸机一般不用挂载表 [*] Enable elm-chan fatfs elm-chans FatFs, Generic FAT Filesystem Module --- [ ] Enable ReadOnly file system on flash [ ] Enable RAM file system裸机模式下文件系统挂载通常在main.c里手动完成#if defined(LPKG_USING_DFS_ELMFAT) defined(AIC_SDMC_DRV) if (dfs_mount(sdmc, /, elm, 0, 0) 0) pr_err(Failed to mount sdmc with FatFS\n); #endif注意这里设备名是sdmc不是sd0而且直接挂载到根目录/。这是因为裸机模式通常只有一个存储设备。3. 热插拔配置像U盘一样即插即用热插拔是个很实用的功能允许你在系统运行中插入或拔出SD卡系统会自动检测并挂载/卸载。这个功能在数据采集、日志导出等场景特别有用。3.1 热插拔支持现状目前Luban-Lite只实现了SDMC1的热插拔功能。如果你需要用SDMC0或SDMC2的热插拔需要自己参考源码扩展。热插拔的源码位置RT-Threadbsp/artinchip/drv/sdmc/drv_sdcard.cBaremetalbsp/artinchip/drv_bare/sdmc/sdcard.c3.2 启用热插拔检测配置很简单在menuconfig里打开一个选项就行Board options --- [*] Using SDMC1 SDMC1 Parameter --- [*] Using SDcard hotplug detection # 启用SD卡热插拔检测这个配置对RT-Thread和Baremetal都适用。启用后系统会监测SD卡座的检测引脚如果有的话或者通过软件方式检测SD卡状态变化。3.3 热插拔使用注意事项实际使用中有几点需要注意硬件支持热插拔需要硬件支持检测引脚。检查你的开发板原理图看SD卡座的CD/DAT3引脚是否接到了芯片的GPIO上。软件处理热插拔事件发生后系统会回调注册的函数。你需要在这个回调函数里处理挂载或卸载卡插入调用dfs_mount()挂载文件系统卡拔出调用dfs_unmount()卸载文件系统文件安全热插拔时如果有文件正在读写一定要先关闭文件。否则可能导致文件损坏或数据丢失。在实际项目中我一般会加个状态标志检测到卡拔出时先等待所有文件操作完成。多次插拔测试热插拔功能一定要充分测试。我遇到过的情况是快速连续插拔SD卡有时系统反应不过来。好的做法是加个防抖延时避免误触发。4. 实际配置经验分享最后分享几个我在实际项目中踩过的坑和总结的经验时钟频率不要盲目调高SDMC的CMU时钟默认是100MHz但并不是所有SD卡都能跑这么高。特别是老款或低速卡时钟太快反而会导致读写错误。如果遇到SD卡识别不稳定可以尝试把频率降到50MHz试试。相位参数慎改driver phase和sample phase这两个参数Luban-Lite给的默认值3和0是经过测试的。除非你确定是相位问题导致SD卡不识别否则不要随便改。改了之后可能这张卡能用了另一张卡又不行了。文件系统挂载失败排查如果SD卡驱动正常但文件系统挂载失败按这个顺序排查检查SD卡是否格式化FatFS支持FAT16/FAT32/exFAT检查挂载点目录是否存在RT-Thread下可能需要手动创建检查设备名是否正确RT-Thread用sd0Baremetal用sdmc查看系统日志通常会有错误信息提示热插拔的实时性热插拔检测不是瞬间完成的从物理插拔到系统响应有个过程。在要求严格实时性的应用里不要依赖热插拔事件作为关键操作的触发条件。多分区支持RT-Thread的SDIO驱动支持多分区最多16个配置里的mmcsd max partition就是设置这个的。如果你的SD卡有多个分区每个分区会被识别为sd0、sd1、sd2...挂载时设备名要相应调整。按照上面的步骤配置完编译下载到衡山派D21x开发板你的SD卡应该就能正常使用了。如果还有问题多看系统启动时的串口日志里面通常会有详细的错误信息对照着排查就行。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2412887.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!