平台: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()
进行初始化。
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
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"
。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);
}
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 校准。
dmesg | grep mmc
常见输出:
mmc0: new high speed SDHC card at address 1234
mmcblk0: mmc0:1234 SD16G 14.4 GiB
问题 | 原因分析 |
---|---|
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 驱动适配打下基础。