高通SD驱动适配:QRB5165源码深入解析

高通 QRB5165 SD 驱动适配的细节:深入分析平台驱动源码

平台:QRB5165(Qualcomm Robotics RB5)
关键词:SDHCI、QRB5165、MMC、平台驱动、设备树、SD卡、调试


一、前言

在高通 QRB5165 平台上,SD 卡作为一种常见的存储扩展方式,其驱动适配涉及 设备树配置平台总线绑定、以及 高通 SoC 特有的 SDHCI 控制器实现。本篇博客将深入分析 QRB5165 SD 驱动的架构,并结合实际调试经验,梳理适配过程中关键的技术细节。


二、整体架构概览

Linux 下 SD 卡驱动遵循 MMC 框架,主要分为三层:

应用层
   ↓
内核 MMC 核心框架(drivers/mmc/core)
   ↓
控制器驱动(如:sdhci-msm)
   ↓
底层寄存器访问(通过 platform_driver)

对于 QRB5165,使用的是 高通 MSM SDHCI 控制器(sdhci-msm),平台设备通过 platform_device 绑定至 sdhci_msm_probe() 进行初始化。


三、设备树配置(DTS)

QRB5165 的设备树配置一般位于:

arch/arm64/boot/dts/qcom/qrb5165-rb5.dts

SD 控制器节点(例如 sdhc_1)的配置示例如下:

&sdhc_1 {
    status = "okay";
    vdd-supply = <&pmx_sdc1_vreg>;
    vdd-io-supply = <&pmx_sdc1_io_vreg>;
    pinctrl-names = "default", "sleep";
    pinctrl-0 = <&sdc1_default>;
    pinctrl-1 = <&sdc1_sleep>;
    bus-width = <4>;
    non-removable;
    mmc-ddr-1_8v;
    mmc-hs400-1_8v;
    qcom,nonremovable;
    qcom,dll-config = <0x1>;
    qcom,clk-rates = <400000 200000000>;
};

关键属性说明:

属性含义
vdd-supply / vdd-io-supply控制器供电
bus-width总线宽度(1/4/8 位)
non-removable表示卡槽内为 eMMC
qcom,xxx高通平台专有属性
pinctrl引脚复用配置

四、驱动源码分析

源码目录:drivers/mmc/host/sdhci-msm.c

1. platform_driver 定义

static struct platform_driver sdhci_msm_driver = {
    .probe  = sdhci_msm_probe,
    .remove = sdhci_msm_remove,
    .driver = {
        .name = "sdhci_msm",
        .of_match_table = sdhci_msm_dt_match,
    },
};
  • 通过 of_match_table 绑定设备树节点的 compatible = "qcom,sdhci-msm-v5"

2. probe 函数核心逻辑

static int sdhci_msm_probe(struct platform_device *pdev)
{
    struct sdhci_msm_host *msm_host;
    struct sdhci_host *host;
    struct resource *res;

    // 分配 sdhci_host 和 sdhci_msm_host
    host = sdhci_alloc_host(&pdev->dev, sizeof(struct sdhci_msm_host));
    msm_host = sdhci_priv(host);

    // 获取寄存器地址
    res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "core_mem");
    msm_host->core_mem = devm_ioremap_resource(&pdev->dev, res);

    // 初始化电源资源、时钟
    sdhci_msm_init_clocks(msm_host);
    sdhci_msm_init_vreg(msm_host);

    // 设置寄存器操作接口
    host->ops = &sdhci_msm_ops;

    // 注册到 mmc 核心
    return sdhci_add_host(host);
}

3. 控制器操作集 sdhci_msm_ops

static const struct sdhci_ops sdhci_msm_ops = {
    .platform_execute_tuning = sdhci_msm_execute_tuning,
    .write_l = sdhci_msm_write,
    .read_l = sdhci_msm_read,
};

其中 platform_execute_tuning 实现高速模式下的 DLL 校准。


五、调试技巧与常见问题

1. 查看 SD 卡识别日志

dmesg | grep mmc

常见输出:

mmc0: new high speed SDHC card at address 1234
mmcblk0: mmc0:1234 SD16G 14.4 GiB

2. 无法识别卡的原因排查:

问题原因分析
SD 无法识别电压配置错误、时钟未开启、pinctrl 配置错误
I/O Error可能为 DLL 校准失败,可调整 qcom,dll-config
频繁掉卡电源管理配置问题,建议使用 keep-power-in-suspend

六、寄存器层级理解(可选深入)

控制器寄存器位于 core_mem 区域,通过 devm_ioremap_resource() 映射后操作:

例如:

#define CORE_HC_MCI_RESET        0x000
#define CORE_PWRCTL_MASK         0x004

writel(CORE_SW_RST, msm_host->core_mem + CORE_HC_MCI_RESET);

DLL 校准相关寄存器位于 DLL_CFG、DLL_STATUS 等位置。


七、总结

高通 QRB5165 平台上的 SD 卡驱动适配虽依赖标准 MMC 框架,但又通过 sdhci-msm 结合了其特有的电源管理与 DLL 校准逻辑,调试过程中需注意 供电电压、时钟设置、pinctrl 配置和设备树专有属性

通过深入分析源码,我们不仅能掌握适配技巧,还能为后续 eMMC/UFS 驱动适配打下基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值