5.1.2. 参数配置

5.1.2.1. 内核配置

参考快速入门 - 编译概述 - Kernel配置,进入kernel的功能配置,按如下选择:

Linux
    Device Drivers
        <*> MMC/SD/SDIO card support
            <*>   MMC block device driver
            <*>   ZX Memory Card Interface

5.1.2.2. DTS 参数配置

5.1.2.2.1. SDMC 的扩展 DTS 参数

SDMC驱动基于Linux内核的MMC子系统,MMC子系统中提供了很多常用的参数,如下表:

参数名称

类型

取值范围

功能说明

max-frequenc

正整数

> 0

控制器可输出的最大频率

bus-width

正整数

1, 4, 8

控制器的数据位宽

sd-uhs-sdr50

boolean

有 - 1,无 - 0

配置SDCard的SDR50模式

no-sd

boolean

有 - 1,无 - 0

关闭SDCard的功能支持

no-sdio

boolean

有 - 1,无 - 0

关闭SDIO的功能支持

no-mmc

boolean

有 - 1,无 - 0

关闭eMMC的功能支持

详见代码 drivers/mmc/core/host.c中的函数 mmc_of_parse()。

SDMC驱动在此基础上扩展了两个关于FIFO设置的参数,如下表:

参数名称

类型

取值范围

功能说明

aic,fifo-depth

正整数

[1, 128]

控制器的FIFO深度

aic,fifo-watermark-aligned

boolean

有 - 1,无 - 0

FIFO水位是按2的整数次幂对齐

5.1.2.2.2. M4 配置

SDMC V1.0有三个接口:SDMC0、SDMC1、SDMC2,所以在DTS中体现为三个独立的设备节点。

common/m4.dtsi中的参数配置:

sdmc0: sdmc@10440000 {
    compatible = "zx,aic-sdmc-v1.0";
    reg = <0x0 0x10440000 0x0 0x1000>;
    interrupts-extended = <&plic0 46 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&cmu CLK_SDMMC0>;
    clock-names = "ciu";
    resets = <&rst RESET_SDMMC0>;
    reset-names = "reset";
    #address-cells = <1>;
    #size-cells = <0>;
    max-frequency = <24000000>;
    clock-frequency = <48000000>;
    bus-width = <4>;
    fifo-depth = <128>;
};

sdmc1: sdmc@10450000 {
    compatible = "zx,aic-sdmc-v1.0";
    reg = <0x0 0x10450000 0x0 0x1000>;
    interrupts-extended = <&plic0 47 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&cmu CLK_SDMMC1>;
    clock-names = "ciu";
    resets = <&rst RESET_SDMMC1>;
    reset-names = "reset";
    #address-cells = <1>;
    #size-cells = <0>;
    max-frequency = <24000000>;
    clock-frequency = <48000000>;
    bus-width = <4>;
    fifo-depth = <128>;
};

sdmc2: sdmc@10460000 {
    compatible = "zx,aic-sdmc-v1.0";
    reg = <0x0 0x10460000 0x0 0x1000>;
    interrupts-extended = <&plic0 48 IRQ_TYPE_LEVEL_HIGH>;
    clocks = <&cmu CLK_SDMMC2>;
    clock-names = "ciu";
    resets = <&rst RESET_SDMMC2>;
    reset-names = "reset";
    #address-cells = <1>;
    #size-cells = <0>;
};

5.1.2.2.3. Board 中的配置

如果按以下功能定义三个控制器:

  1. SDMC0 - eMMC

  2. SDMC1 - SDCard

  3. SDMC2 - SDIO

xxx-board.dts中的配置参数如下:

&sdmc0 {
    pinctrl-names = "default";
    pinctrl-0 = <&sdmc0_pins>;
    no-sd;
    no-sdio;
    status = "okay";
};

&sdmc1 {
    pinctrl-names = "default";
    pinctrl-0 = <&sdmc1_pins>;
    no-mmc;
    no-sdio;
    status = "okay";
};

&sdmc2 {
    pinctrl-names = "default";
    pinctrl-0 = <&sdmc2_pins>;
    no-mmc;
    no-sd;
    status = "disabled";
};

5.1.2.2.4. 热插拔配置

小技巧

SDMC1控制器硬件支持热插拔中断,SDMC驱动中默认已使能,无需另外配置,下文主要是针对SDMC0/2控制器。

SDMC热插拔功能基于Linux内核的MMC子系统,MMC子系统提供了两种方式实现热插拔:

  1. 轮询监控:主要实现每隔一段时间(一般是HZ,1s)扫描一下mmc硬件总线。

  2. 中断监控:通过card detect(简称为cd)引脚电平变化触发中断,从而告知CPU说sdcard插入状态发生变化。

MMC子系统中提供了以下关于热插拔的参数,如下表:

参数名称

类型

取值范围

功能说明

cd-inverted

boolean

有 - 1,无 - 0

gpio检测电平翻转

cd-debounce-delay-ms

正整数

> 0

gpio消抖(默认200ms)

broken-cd

boolean

有 - 1,无 - 0

配置为轮询监控功能

cd-gpios

array

同普通gpio配置

配置中断监控的gpio值

下面为SDMC0控制器轮询监控方式配置热插拔:

xxx-board.dts中的配置参数如下:

&sdmc0 {
    pinctrl-names = "default";
    pinctrl-0 = <&sdmc0_pins>;
    broken-cd;
    status = "okay";
};

下面为SDMC2控制器中断监控方式配置热插拔:

xxx-board.dts中的配置参数如下:

&sdmc2 {
    pinctrl-names = "default";
    pinctrl-0 = <&sdmc2_pins>;
    cd-inverted;//根据硬件设计配置
    cd-gpios = <&gpio_c 8 GPIO_ACTIVE_HIGH>;//根据硬件设计配置
    cd-debounce-delay-ms = <250>;
    status = "okay";
};