SD/MMC使用参考
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.c
和boot/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.c
和boot/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寄存器配置正确。