高通 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 驱动适配打下基础。