当前位置: 首页 > 工具软件 > SD-MMC > 使用案例 >

Rockchip RK3588 kernel dts解析之MMC

史默
2023-12-01

Rockchip RK3588 kernel dts解析之MMC

RK3588的MMC分为3中模式:

  • SDMMC
  • SDIO
  • SDHCI

下面针对每种模式的DTS配置进行说明

SDMMC

SDMMC用于SD卡通信
DTS配置参考rk3588s.dtsirk3588-evb2-lp4.dtsi
SDMMC的主要配置在rk3588s.dtsi 中,如下:

sdmmc: mmc@fe2c0000 {
                compatible = "rockchip,rk3588-dw-mshc", "rockchip,rk3288-dw-mshc";
                reg = <0x0 0xfe2c0000 0x0 0x4000>;
                interrupts = <GIC_SPI 203 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&scmi_clk SCMI_HCLK_SD>, <&scmi_clk SCMI_CCLK_SD>,
                         <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
                clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
                fifo-depth = <0x100>;
                max-frequency = <200000000>; //设置 SD 卡的运行频率,虽然设置为 150M,但是还要根据 SD 卡的不同模式进行调整
                pinctrl-names = "default";
                pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_det &sdmmc_bus4>;
                power-domains = <&power RK3588_PD_SDMMC>;
                status = "disabled";
        };

rk3588s.dtsi默认的sdmmc节点默认是disabled状态,需要在需要使用的产品dts中去enable,比如rk3588-evb2-lp4.dtsi,如下:

&sdmmc {
        status = "okay";
        vmmc-supply = <&vcc_3v3_sd_s0>; \\配置 SD 卡设备的 3V3 电源
};

sdmmc其他dts配置说明:

  1. vmmc-supply = <&vcc_3v3_sd_s0>; 配置 SD 卡设备的 3V3 电源,rk3588-evb2-lp4.dtsi中SD卡的3v3电源是直接从PMIC RK806的LDO4提供。如果是有GPIO来控制这路电源可以参考rk3588-evb7-lp4.dtsi增加一个gpio模拟regulator的配置:
vcc_3v3_sd_s0: vcc-3v3-sd-s0-regulator {
                compatible = "regulator-fixed";
                gpio = <&gpio0 RK_PB7 GPIO_ACTIVE_HIGH>;
                pinctrl-names = "default";
                pinctrl-0 = <&sd_s0_pwr>;
                regulator-name = "vcc_3v3_sd_s0";
                enable-active-high;
        };
  1. cap-mmc-highspeed; cap-sd-highspeed; 此配置为标识此卡槽支持 highspeed 的 SD 卡。 如果不配置,表示不支持 highspeed 的 SD 卡。
  2. 配置使用 SD3.0
sd-uhs-sdr12: 时钟频率不超过24M
sd-uhs-sdr25: 时钟频率不超过50M
sd-uhs-sdr50: 时钟频率不超过100M
sd-uhs-ddr50: 时钟频率不超过50M,并且采用双沿采样
sd-uhs-sdr104: 时钟频率不超过208M
  1. 配置 SD 卡热拔插检测脚
    如果检测脚是直接连接到芯片的 SDMMC 控制器的 sdmmc_cd 脚,则请直接将该脚位配置为功能脚,并在 sdmmc 节点的 default 的 pinctrl 内进行引用即可。

如果检测脚是使用其他 GPIO,则需要在 sdmmc 节点内使用 cd-gpios 来进配置,例如

cd-gpios = <&gpio4 24 GPIO_ACTIVE_LOW>;

如果使用 GPIO 的检测脚,但是又要求反向检测方式(即 SD 卡插入时检测脚为高电平),则需要追加

cd-inverted;

SDIO

sdio用于wifi等外设通信
sdio的DTS配置参考rk3588s.dtsirk3588-evb2-lp4.dtsi
rk3588s.dtsi中是芯片级的配置,无需修改

sdio: mmc@fe2d0000 {
                compatible = "rockchip,rk3588-dw-mshc", "rockchip,rk3288-dw-mshc";
                reg = <0x0 0xfe2d0000 0x0 0x4000>;
                interrupts = <GIC_SPI 204 IRQ_TYPE_LEVEL_HIGH>;
                clocks = <&cru HCLK_SDIO>, <&cru CCLK_SRC_SDIO>,
                         <&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>;
                clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
                fifo-depth = <0x100>;
                max-frequency = <200000000>;
                pinctrl-names = "default";
                pinctrl-0 = <&sdiom1_pins>;
                power-domains = <&power RK3588_PD_SDIO>;
                status = "disabled";
        };

rk3588-evb2-lp4.dtsi中主要是板级相关的配置,可以根据实际需求修改

&sdio {
        max-frequency = <150000000>; //设置最大的频率,可以根据硬件设计改小
        no-sd;
        no-mmc;
        bus-width = <4>; 
        disable-wp;
        cap-sd-highspeed; //此配置同 SD 卡功能,作为 SDIO 外设,也有区分是否为 highspeed 的 SDIO 外设
        cap-sdio-irq; //此配置标识该 SDIO 外设(通常是 Wifi)是否支持 sdio 中断,如果你的外设是 OOB 中断,请不要加入此项。支持哪种类型的中断请联系 Wifi 原厂确定。
        keep-power-in-suspend; //此配置表示是否支持睡眠不断电,请默认加入该选项。Wifi 一般都有深度唤醒的要求。
        mmc-pwrseq = <&sdio_pwrseq>; //此项是 SDIO 外设(一般是 Wifi)的电源控制。为必须项,否则 Wifi 无法上电工作。请参考下面的例子,晶振时钟和复位-使能的 GPIO 的选择按照实际板级硬件要求进行配置。
        non-removable; //此项表示该插槽为不可移动设备且此项为 SDIO 设备必须添加项。
        pinctrl-names = "default";
        pinctrl-0 = <&sdiom0_pins>;
        sd-uhs-sdr104; //此项配置决定该 SDIO 设备是否支持 SDIO3.0 模式。前提是需要 Wifi 的 IO 电压为 1.8v。同SDMMC配置
        status = "okay";
}

SDHCI

sdhci用于EMMC通信
sdhci的dts配置参考:rk3588s.dtsirk3588-evb.dtsi
其中rk3588s.dtsi 主要是芯片级的配置无需修改,如下

sdhci: mmc@fe2e0000 {
                compatible = "rockchip,rk3588-dwcmshc", "rockchip,dwcmshc-sdhci";
                reg = <0x0 0xfe2e0000 0x0 0x10000>;
                interrupts = <GIC_SPI 205 IRQ_TYPE_LEVEL_HIGH>;
                assigned-clocks = <&cru BCLK_EMMC>, <&cru TMCLK_EMMC>, <&cru CCLK_EMMC>;
                assigned-clock-rates = <200000000>, <24000000>, <200000000>;
                clocks = <&cru CCLK_EMMC>, <&cru HCLK_EMMC>,
                         <&cru ACLK_EMMC>, <&cru BCLK_EMMC>,
                         <&cru TMCLK_EMMC>;
                clock-names = "core", "bus", "axi", "block", "timer";
                resets = <&cru SRST_C_EMMC>, <&cru SRST_H_EMMC>,
                         <&cru SRST_A_EMMC>, <&cru SRST_B_EMMC>,
                         <&cru SRST_T_EMMC>;
                reset-names = "core", "bus", "axi", "block", "timer";
                max-frequency = <200000000>;
                status = "disabled";
        };

rk3588-evb.dtsi是板级相关配置,可以根据实际需求进行配置

&sdhci {
        bus-width = <8>;
        no-sdio;
        no-sd;
        non-removable;
        max-frequency = <200000000>;//配置最大频率,根据实际需求可以减少
        mmc-hs400-1_8v;   //此两项配置表示支持 HS400 模式以及 HS400ES 模式
        mmc-hs400-enhanced-strobe; //此两项配置表示支持 HS400 模式以及 HS400ES 模式
        status = "okay";
};

SDHCI还支持:

  • 50MDDR 模式:mmc-ddr-1_8v;
  • HS200 模式:mmc-hs200-1_8v;
 类似资料: