SD/MMC使用参考

Version 1.0


1. 概述

本文档主要介绍在uboot以及用户空间下如何使用SD/EMMC。


2. 规格

外设 最高时钟
一路SDIO总线,可接SD卡或者eMMC SDIO总线时钟最高48Mhz

3. UBOOT使用SD/MMC


3.1. UBOOT下打开SD/MMC驱动

由于硬件平台只有一路SDIO总线接口,所以要么接SD卡,要么接eMMC。

menuconfig中使能SD驱动:

Device Drivers

-> [*] MStar drivers
    -> [*] MSTAR SDMMC      
    -> [ ] MSTAR eMMC

menuconfig中使能eMMC驱动:

Device Drivers
-> [*] MStar drivers
    -> [ ] MSTAR SDMMC                                  
    -> [*] MSTAR eMMC
        -> [ ] Support eMMC BOOT
        -> [ ] Save environment to eMMC

3.2. uboot下SD/MMC驱动介绍

uboot下SD驱动代码详见boot/drivers/mmc/mmc.cboot/drivers/mstar/sdmmc/ms_sdmmc_ub.c

部分函数介绍如下:

函数名 描述
mmc_core_init 初始化sdmmc
mmc_bread 读block
mmc_bwrite 写block
mmc_berase 擦除block
mmc_send_cmd 发送命令

uboot下eMMC驱动代码详见boot/drivers/mstar/emmc/src/api/eMMC_prg.c

主要函数介绍如下:

函数名 描述
eMMC_mmc_Init 初始化eMMC
eMMC_bread 读block
eMMC_bwrite 写block
eMMC_berase 擦除block
eMMC_send_cmd 发送命令

3.3. uboot下测试SD/MMC

uboot下提供了SD/eMMC测试命令,详见boot/common/cmd_mmc.cboot/common/cmd_mstar.c

用户可参考上述文件编写应用代码。

测试SD卡可用下述命令:

mmc - MMC sub system

Usage:

mmc info - display info of the current MMC device
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmc setdsr <value> - set DSR register value

测试eMMC可用下述命令:

emmc - EMMC function on NVRAM base partition

Usage:

emmc emmc create [name] [size] - create mmc partition [name]
emmc remove [name] - remove mmc partition [name]
emmc rmgpt - clean all mmc partition table
emmc part - list partitions 
emmc slc size relwr - set slc in the front of user area,  0xffffffff means max slc size
emmc unlzo Src_Address Src_Length Partition_Name [empty_skip:0-disable,1-enable]- decompress lzo file and write to mmc partition 
emmc read.p addr partition_name size
emmc read.p.continue addr partition_name offset size
emmc write.p addr partition_name size [empty_skip:0-disable,1-enable]
emmc write.p.continue addr partition_name offset size [empty_skip:0-disable,1-enable]
emmc erase.p partition_name

在shell中敲如下命令,可列出SD/eMMC信息:

# mmcinfo

如果接SD卡打印类似如下:

如果接eMMC打印类似如下:


4. 用户空间使用SD/MMC

推荐使用如下脚位与mode作为SDIO总线。

Group Mode CLK CMD DATA0 DATA1 DATA2 DATA3
SDIO 1 PAD_SD_CLK PAD_SD_CMD PAD_SD_D0 PAD_SD_D1 PAD_SD_D2 PAD_SD_D3

4.1. kernel中配置SD/MMC的DTS

打开kernel/arch/arm/boot/dts/pioneer3.dtsi,配置SD/eMMC设备树属性。

eMMC需要根据实际电路调整复位脚,也可更改时钟调整eMMC速度,如下图标记处所示:


4.2. kernel中配置sdio脚位padmux

打开Kernel/arch/arm/boot/dts/pioneer3-ssc020a-s01a-demo-padmux.dtsi,配置引脚padmux。

将PIN脚配置为PINMUX_FOR_SDIO_MODE_1,如图:


4.3. kernel中打开SD/MMC功能

menuconfig中配置支持SD卡。

Device Drivers
    -> <*> MMC/SD/SDIO card support
    -> [*] SStar SoC platform drivers
        -> < > EMMC driver  
        -> <*> SStar SD/MMC Card Interface Support

menuconfig中配置支持eMMC:

Device Drivers
    -> <*> MMC/SD/SDIO card support
    -> [*] SStar SoC platform drivers
    -> <*> EMMC driver 
        -> [*] UNIFY EMMC DRIVER 
    -> < > SStar SD/MMC Card Interface Support

kernel起来后可以通过命令# cat /proc/partitions查看SD/eMMC是否有加载成功。

如果列表中有mmcblk0分区则表示SD/eMMC加载成功,如下图所示:

可使用linux命令挂载mmcblk0分区,用户就可访问SD/eMMC卡中的文件了。

# mount -t vfat -o iocharset=utf8 /dev/mmcblk0 /mnt

4.4. 通过寄存器查看padmux是否配置正确

打开kernel/drivers/sstar/gpio/pioneer3/mhal_pinmux.c,找到SDIO脚位。

当SDIO配置为PINMUX_FOR_SDIO_MODE_1时,对应的寄存器信息如图:

基地址 PADTOP_BANK 0x103C
偏移地址 REG_SDIO_MODE 0x67
有效位 BIT8 0x0100

如上表bank基地址为0x103C,偏移地址为0x67,BIT3使能。开发板中运行/customer/riu_r 0x103C 0x67读寄存器的值,如果读出的值为0x0100则表明SDIO PADMUX寄存器配置正确。