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