eMMC使用参考


1. 概述

Kernel下eMMC采用标准的LINUX MMC框架,能够使用标准接口驱动mmc device(emmc card)。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. 编译eMMC相关driver

Card层(mmc_block.ko)与Core层(mmc_host.ko)使用linux标准code,Host层(kdrv_emmc.ko)由我们自己维护,在menuconfig可将它们选择编译进kernel或编译为模块,一般做storage时选择编译成模块,而作为启动介质时选择built-in。

Device Drivers --->
    <M> MMC/SD/SDIO card support --->
        <M> MMC block device driver
    [*] SStar SoC platform drivers --->
        <M> EMMC driver
            [*] UNIFY EMMC DRIVER

make menuconfig中的设置与生成的ko对应关系如下表:

menuconfig option module name
MMC/SD/SDIO card support mmc_core.ko
MMC block device driver mmc_block.ko
EMMC driver kdrv_emmc.ko

2.2. 设备树配置

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

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

如上图展示,emmc节点下几乎所有的属性都有三组value,分别代表最多三个emmc slot口的属性参数。eMMC驱动中支持配置的属性如下表:

属性 描述 备注
compatible 用于匹配驱动进行驱动注册,需与代码中一致 禁止修改
clocks 用于指定使用的时钟源 不需要修改
slot-num 当前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 / 8 – 8bit mode
max-clks 配置对应卡槽支持的最大时钟频率

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