在嵌入式linux中EMMC和SD Card是比较常用的存储设备,我们记录一下使能一个MMC/SD控制器驱动的过程,基本可以在大多数soc上作为配置参考。

第一步:menuconfig

        老规矩,想使能一个驱动先把配置项搞定,使用命令make menuconfig:

make menuconfig

        如下图,在图中指明的路径下,进行MMC/SD的配置项选择,这些配置项是什么意思大家可以在自己的配置项上输入 ? 可以获取帮助信息,配置项最后是跟SOC相关的,根据自己使用的芯片对应选择。

linux emmc 设备 emmc linux驱动_文件系统

         这就完了吗?no no no!

        MMC/SD设备都是有文件系统的,在linux中使用我们一般格式化为ext4格式,在win下使用的时候一般使用fat,ntfs格式。所以我们要让linux支持这些文件系统:

        在如图路径中使能ext4文件系统,其他系统根据需要使能:

linux emmc 设备 emmc linux驱动_linux emmc 设备_02

         在如图路径中使能fat,ntfs文件系统,其中的配置项根据需要进行选择:

linux emmc 设备 emmc linux驱动_配置项_03

         使用fat,ntfs文件系统的时候还要关注语言包的选择,否则在挂载相应文件系统的时候会报错:

        在如下路径,fat一般要选择code 437 和 ISO 8859-1,可以根据需要去查看配置项的帮助信息,帮助信息会告诉你这些语言都支持哪些文件系统,或者先不选,直接编译下载测试,去挂载设备,根据报错信息提示缺少的语言支持去选择。

linux emmc 设备 emmc linux驱动_配置项_04

         至此,配置项完成!

 第二步:设备树

        一般情况下,原厂会给我们做好MMC/SD控制器的节点并包含在dtsi文件中,我们只需在所使用的dts设备树文件中使能status:

        dtsi节点中的内容:

linux emmc 设备 emmc linux驱动_arm_05

         但是好巧不巧,因为我使用的内核是打过openwrt补丁的,所以经过测试以上节点不能用,如果大家把所有配置项都配了,但是驱动仍然不工作,可以合理怀疑设备树节点。参考openwrt换成如下信息:

linux emmc 设备 emmc linux驱动_linux_06

         然后在dts中:

linux emmc 设备 emmc linux驱动_文件系统_07

 第三步:编译、下载、测试

        下载完成后,在kernel的log中我们可以看到如下信息:

linux emmc 设备 emmc linux驱动_linux emmc 设备_08

         不错,看来驱动已经正常工作,并且都把SD卡的大小都打印了出来,进入系统查看/dev下是否产生了设备节点:

linux emmc 设备 emmc linux驱动_linux_09

         成功产生节点,那我们使用fdisk命令看一下设备的详细信息:

linux emmc 设备 emmc linux驱动_linux_10

         那我们再使用df命令来看一下设备有没有挂载,去访问一下存储设备的文件:

linux emmc 设备 emmc linux驱动_文件系统_11

         可以看到,mmc设备并没有挂载,那我们自己来手动挂载一下:

ls /mnt/    //查看是否有挂载点,结果没有
    mkdir -p /mnt/sdcard    //递归创建挂载点
    mount    /dev/mmcblk0p3 /mnt/sdcard/    //将分区挂载到刚创建的挂载点
    ls /mnt/sdcard    //查看分区内容

linux emmc 设备 emmc linux驱动_linux_12

         可以看到我们挂载的分区3中包含的文件,我的SD之前做了overlay分区,并且是ext4格式的,所以比较顺利,挂载的时候也没有指定文件系统类型,至此,MMC/SD驱动使能完成!