RK3399 系列 SD driver惠阳保姆13825404095

文章正文
发布时间:2025-06-29 06:47

/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

參考
https://www.twblogs.net/a/5c43435dbd9eee35b3a6f53c

首页
评论
分享
Top