RK3588的MMC分为3中模式:
下面针对每种模式的DTS配置进行说明
SDMMC用于SD卡通信
DTS配置参考rk3588s.dtsi
和rk3588-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配置说明:
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;
};
cap-mmc-highspeed; cap-sd-highspeed;
此配置为标识此卡槽支持 highspeed 的 SD 卡。 如果不配置,表示不支持 highspeed 的 SD 卡。sd-uhs-sdr12: 时钟频率不超过24M
sd-uhs-sdr25: 时钟频率不超过50M
sd-uhs-sdr50: 时钟频率不超过100M
sd-uhs-ddr50: 时钟频率不超过50M,并且采用双沿采样
sd-uhs-sdr104: 时钟频率不超过208M
如果检测脚是使用其他 GPIO,则需要在 sdmmc 节点内使用 cd-gpios 来进配置,例如
cd-gpios = <&gpio4 24 GPIO_ACTIVE_LOW>;
如果使用 GPIO 的检测脚,但是又要求反向检测方式(即 SD 卡插入时检测脚为高电平),则需要追加
cd-inverted;
sdio用于wifi等外设通信
sdio的DTS配置参考rk3588s.dtsi
和rk3588-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用于EMMC通信
sdhci的dts配置参考:rk3588s.dtsi
和rk3588-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还支持:
mmc-ddr-1_8v;
mmc-hs200-1_8v;