RK3399 系列 SD driver

/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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RK3399平台是一款高性能的处理器平台,广泛应用于智能设备和嵌入式系统开发中。对于想要了解和学习RK3399平台开发的人来说,PDF格式的讲解资料可以提供全面的指导和资料,以帮助他们更好地进行开发工作。 RK3399平台开发系列讲解PDF是一套专门针对RK3399平台的开发指南和教程,涵盖了该平台的基本知识、开发环境搭建、开发工具使用、应用开发等内容。这些讲解资料通常由RK3399的官方或相关技术专家编写,经过系统的整理和组织,以便开发者快速入门和深入学习。 这些PDF资料通常会从RK3399平台的硬件架构、编程接口、开发流程等方面进行详细介绍,并提供具体的实例和代码供开发者参考。讲解资料中可能包含一些典型的应用场景和案例,以帮助开发者理解和应用RK3399平台的开发能力。 通过阅读RK3399平台开发系列讲解PDF,开发者可以更好地了解RK3399平台的特点和性能,掌握平台开发的基本流程和方法,并能够借助这些指南和教程进行项目开发、调试和优化工作。这样的开发讲解资料对于新手入门和有经验的开发者来说都具有较高的实用性和参考价值。 总的来说,RK3399平台开发系列讲解PDF对于想要学习和应用这一平台的开发者来说是非常有用的资源,通过系统的学习和实践,开发者可以通过这些讲解资料获得对RK3399平台开发的全面理解和掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值