在嵌入式linux中EMMC和SD Card是比较常用的存储设备,我们记录一下使能一个MMC/SD控制器驱动的过程,基本可以在大多数soc上作为配置参考。
第一步:menuconfig
老规矩,想使能一个驱动先把配置项搞定,使用命令make menuconfig:
make menuconfig
如下图,在图中指明的路径下,进行MMC/SD的配置项选择,这些配置项是什么意思大家可以在自己的配置项上输入 ? 可以获取帮助信息,配置项最后是跟SOC相关的,根据自己使用的芯片对应选择。
这就完了吗?no no no!
MMC/SD设备都是有文件系统的,在linux中使用我们一般格式化为ext4格式,在win下使用的时候一般使用fat,ntfs格式。所以我们要让linux支持这些文件系统:
在如图路径中使能ext4文件系统,其他系统根据需要使能:
在如图路径中使能fat,ntfs文件系统,其中的配置项根据需要进行选择:
使用fat,ntfs文件系统的时候还要关注语言包的选择,否则在挂载相应文件系统的时候会报错:
在如下路径,fat一般要选择code 437 和 ISO 8859-1,可以根据需要去查看配置项的帮助信息,帮助信息会告诉你这些语言都支持哪些文件系统,或者先不选,直接编译下载测试,去挂载设备,根据报错信息提示缺少的语言支持去选择。
至此,配置项完成!
第二步:设备树
一般情况下,原厂会给我们做好MMC/SD控制器的节点并包含在dtsi文件中,我们只需在所使用的dts设备树文件中使能status:
dtsi节点中的内容:
但是好巧不巧,因为我使用的内核是打过openwrt补丁的,所以经过测试以上节点不能用,如果大家把所有配置项都配了,但是驱动仍然不工作,可以合理怀疑设备树节点。参考openwrt换成如下信息:
然后在dts中:
第三步:编译、下载、测试
下载完成后,在kernel的log中我们可以看到如下信息:
不错,看来驱动已经正常工作,并且都把SD卡的大小都打印了出来,进入系统查看/dev下是否产生了设备节点:
成功产生节点,那我们使用fdisk命令看一下设备的详细信息:
那我们再使用df命令来看一下设备有没有挂载,去访问一下存储设备的文件:
可以看到,mmc设备并没有挂载,那我们自己来手动挂载一下:
ls /mnt/ //查看是否有挂载点,结果没有
mkdir -p /mnt/sdcard //递归创建挂载点
mount /dev/mmcblk0p3 /mnt/sdcard/ //将分区挂载到刚创建的挂载点
ls /mnt/sdcard //查看分区内容
可以看到我们挂载的分区3中包含的文件,我的SD之前做了overlay分区,并且是ext4格式的,所以比较顺利,挂载的时候也没有指定文件系统类型,至此,MMC/SD驱动使能完成!