eMMC使用参考


1. 概述

Kernel下MMC采用标准的LINUX框架,能够使用标准接口驱动mmc device(emmc card,sd card或sdio device)。

Mmc子系统由card层,core层和host层构成。Card层将整个mmc device注册成mmc block device,可支持上层的数据请求工作;Core层实现mmc协议中初始化流程和读写等工作。Host层可以调动硬件,把core层传下来的cmd或data request通过sdio engine与sd card device进行数据通信。

2. LINUX配置使用MMC device

2.1. 编译MMC相关driver

Card层(mmc_block.ko)与Core层(mmc_host.ko)使用linux标准code,Host层(kdrv_emmc.ko)由我们自己维护,在menuconfig可将它们选择编译进kernel或编译为模块。

1.  make menuconfig
2.  # Device Drivers -->
3.  #    <*> MMC/SD/SDIO card support -->                   (mmc_core.ko)
4.  #        <*> MMC block device driver                    (mmc_block.ko)
5.  #    [*] SStar SoC platform drivers -->
6.  #        <*> EMMC driver                                 (kdrv_emmc.ko)
7.  #        [*]     UNIFY EMMC DRIVER

2.2. dts配置

可以通过配置dts中emmc项设定host层driver的基本参数。适配ssc027b的dts参数展示如下:

1.  emmc {
2.      compatible = "sstar_mci";
3.      clocks = <&CLK_fcie>,<&CLK_sd>;
4.      slot-num = <2>;
5.      adma-mode = <1>,<1>;
6.      ip-select = <1>,<0>;
7.      pad-select = <0>,<1>;
8.      bus-width = <4>,<4>;
9.      max-clks = <48000000>,<48000000>;
10.     status = "ok";
11. };

如上图展示,emmc节点下几乎所有的属性都有两组value,分别代表最多两个emmc slot口的属性参数。释义分别为:

参数 释义 备注
slotnum 当前board正在使用的SD/SDIO IP个数,driver根据该值读取相应列的参数。 根据实际使用情况配置该项。
adma-mode 配置对应的卡槽的data传输模式 0 – dma / 1 – adma
ip-select 配置对应卡槽的IP编号
pad-select 配置对应卡槽的padmux mode编号
bus-width 配置对应卡槽的buswidth 4 – 4bit mode
max-clks 配置对应卡槽支持的最大时钟频率

2.3. Linux下使用mmc device

开发板启动进入到kernel命令行后,会生成emmc card的设备分区节点/dev/mmcblk*。使用fdisk、mkfs、mount、dd等工具操作该节点即可实现访问mmc block device,这与其他linux是没有差异的。

另外我们也提供sysfs进行debug,进入kernel命令行后,在/sys/device/platform/soc/soc:emmc目录下可以查看到所有支持的sysfs。

1.  cd /sys/device/platform/soc/soc:emmc
2.  
3.  # 关闭/【开启或重置】读写监控
4.  echo [0/1] > eMMC_monitor_count_enable
5.  # 查看从【开启或重置】起的读写监控信息。
6.  cat eMMC_monitor_count_enable
7.  
8.  # 写操作log打印开关。
9.  echo [0/1] > eMMC_write_log_enable
10. # 查看写打印开关状态。
11. cat eMMC_write_log_enable
12. 
13. # 读操作log打印开关。
14. echo [0/1] > eMMC_read_log_enable
15. # 查看读打印开关状态。
16. cat eMMC_read_log_enable
17. 
18. # 设置[slotNo] emmc的bootbus值
19. echo [slotNo] [bootbus] > eMMC_bootbus
20. # 查看所有slot的emmc的bootbus值。
21. cat eMMC_bootbus
22. 
23. #设置[slotNo] emmc的partconf值
24. echo [slotNo] [bootbus] > eMMC_partconf 
25. # 查看所有slot的emmc的partconf值。
26. cat eMMC_ partconf
27. 
28. # 查看所有slot的emmc的工作clock频率。
29. cat eMMC_get_clock
30. 
31. # 启动对[slotNo] emmc的ipverify测试,包括1/4/8 bit、cifd/dma/bdma、signle/muilt、imi/miu rw、error status int、power save mode测试验证。
32. echo [slotNo] > eMMC_run_ipverify 
33.