/kernel-rockchip/arch/arm64/boot/dts/rockchip/vim rk3399.dtsi
sdmmc: dwmmc@fe320000 {
compatible = "rockchip,rk3399-dw-mshc",
"rockchip,rk3288-dw-mshc";
reg = <0x0 0xfe320000 0x0 0x4000>;
interrupts = <GIC_SPI 65 IRQ_TYPE_LEVEL_HIGH 0>;
max-frequency = <150000000>;
assigned-clocks = <&cru HCLK_SD>;
assigned-clock-rates = <200000000>;
clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
<&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
fifo-depth = <0x100>;
power-domains = <&power RK3399_PD_SD>;
resets = <&cru SRST_SDMMC>;
reset-names = "reset";
status = "disabled";
};
pinctrl: pinctrl {
sdmmc_bus1: sdmmc-bus1 { ?????
rockchip,pins = <4 8 RK_FUNC_1 &pcfg_pull_up>;
};
sdmmc_bus4: sdmmc-bus4 {
rockchip,pins =
<4 8 RK_FUNC_1 &pcfg_pull_up>, //GPIO4_B0/SDMMC0_D0
<4 9 RK_FUNC_1 &pcfg_pull_up>, //GPIO4_B1/SDMMC0_D1
<4 10 RK_FUNC_1 &pcfg_pull_up>, //GPIO4_B2/SDMMC0_D2
<4 11 RK_FUNC_1 &pcfg_pull_up>; //GPIO4_B3/SDMMC0_D3
};
sdmmc_clk: sdmmc-clk {
rockchip,pins =
<4 12 RK_FUNC_1 &pcfg_pull_none>; //GPIO4_B4/SDMMC0_CLKOUT
};
sdmmc_cmd: sdmmc-cmd {
rockchip,pins =
<4 13 RK_FUNC_1 &pcfg_pull_up>; //GPIO4_B5/SDMMC0_CMD
};
sdmmc_cd: sdmcc-cd {
rockchip,pins = //SDMMC0_DET_L
<0 7 RK_FUNC_1 &pcfg_pull_up>; //GPIO0_A7/SDMMC0_DET_u
};
sdmmc_wp: sdmmc-wp {
rockchip,pins =
<0 8 RK_FUNC_1 &pcfg_pull_up>; //MIPI_CSI1_RST
};
----------------------------------------------------------------------------------------------------------------
/kernel-rockchip/arch/arm64/boot/dts/rockchip/rk3399-nanopi4-common.dtsi
&sdmmc {
clock-frequency = <150000000>;//sd卡控制器的工作时钟大小
clock-freq-min-max = <100000 150000000>;//最大最小值
supports-sd; //支持sd卡标记
bus-width = <4>; //sd卡总线(sdio)传输一个word的大小--4B
cap-mmc-highspeed; //sd卡控制器支持mmc高速卡标记
cap-sd-highspeed;
disable-wp; //禁用写保护标记
num-slots = <1>; //在主板上接入sd卡控制器的sd卡卡槽数目
sd-uhs-sdr104;
vmmc-supply = <&vcc_sd>;//电源管理芯片(rk808)到sd卡控制器的电源regulator
vqmmc-supply = <&vccio_sd>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>; 對應上方
status = "okay";
};
/vcc_sd: vcc-sd {
compatible = "regulator-fixed";
enable-active-high;
gpio = <&gpio0 1 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&vcc_sd_h>;
regulator-name = "vcc_sd";
regulator-min-microvolt = <3000000>;
regulator-max-microvolt = <3000000>;
};
&pinctrl {
vcc_sd {
vcc_sd_h: vcc-sd-h {
rockchip,pins = <0 1 RK_FUNC_GPIO &pcfg_pull_up>;
};
};
(1) clock-frequency = <150000000>;
此配置设置 SD 卡的运行频率,虽然设置为 150M,但是还要根据 SD 卡的不同模式进行调整。 这部分不需要用户关心,实际运行频率和模块的关系软件会关联。最大不超过 150MHz。
(2) clock-freq-min-max = <400000 150000000>;
此配置设置 SD 卡的运行频率范围。默认不需要调整。
(3) supports-sd;
此配置标识此插槽为 SD 卡功能,为必须添加项。否则无法初始化 SD 卡。
(4) bus-width = <4>;
此配置标识需要使用 SD 卡的线宽。SD 卡最大支持 4 线模式,如果不配置就模式使用 1 线模 式。另外,这个位只支持的数值为 1,4,配置其他数值会认为是非法数值,强制按照 1 线模式进行使用。
(5) (cap-mmc-highspeed; cap-sd-highspeed;
此配置为标识此卡槽支持 highspeed 的 SD 卡。 如果不配置,表示不支持 highspeed 的 SD卡。
(6) sd-uhs-sdr104;
此配置为标识此卡槽支持 UHS-I 的 SD 卡。如果不配置,表示不支持 UHS-I 的 SD 卡。 但需要注意,如果要支持这种模式的卡,需要 SD 卡的 IO 电压供电可以在 3.3V 和 1.8v 进行切换。并且需要引用 vqmmc-supply 到实际板级的控制电源,例如 vqmmc-supply = <&vccio_sd>;
(7) pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
配置 SD 卡电路的 IOMUX 功能,为必须配置项。
歸類爲塊設備,sd卡塊設備在Linux中被規劃爲card level <--> core level <--> host level。
文件系統直接訪問的是card level,card level通過請求隊列來緩存
core level封裝存儲卡的識別、設置、掛載、讀寫通用api。
host level則對應於主板上mmc卡控制器。
而card level、core level是由Linux社區維護的,我們不需要修改。只有host level纔是我們關心的。host level和具體soc平臺相關,soc原廠會提供可用的驅動源碼配合相應設備樹節點實現sd卡熱插拔、讀寫操作。
也就是說,如果主板上的sd卡的sdio電路、卡檢測電路、供電電路和原廠一致的話,我們需要做的是“配置內核、編譯驅動“就可以實現任意sd卡的正常掛載、讀寫了。
card level:代碼位於:drivers/mmc/card/
core level:代碼位於:drivers/mmc/core/
host level:代碼位於:drivers/mmc/host/rk_sdmmc.*、dw_mmc-rockchip.*
SDMMC0_PWR_H
----------------------------------------------------------------------------------------------------------
測試
生成塊設備節點:/dev/mmcblk0p1
將sd卡掛載到/sdcard目錄
# mkdir /run/sdcard
# mount /dev/mmcblk0p1 /run/sdcard/
# df -h
/dev/mmcblk0p1 118.7M 2.0K 118.7M 0% /run/sdcard
進入/run/sdcard/目錄下
# echo 123 > 123.txt
取消掛載,再掛載。
# umount /run/sdcard/
# mount /dev/mmcblk0p1 /run/sdcard/
# cat sdcard/123.txt
123