高通QCS8550平台SD卡调试全攻略

一、平台简介

QCS8550 是 Qualcomm 针对边缘 AI 和 IoT 场景推出的一款高性能处理平台,采用高通 QRB 系列芯片,支持高速 SDIO 接口。在该平台上使用 SD 卡通常用于系统启动、数据存储或临时日志缓存。

二、QCS8550 的 SD 卡硬件框图简述

QCS8550 平台中 SD 控制器通常绑定在 sdhc_1 或 sdhc_2 设备上,使用的是 SDHCI(Secure Digital Host Controller Interface)驱动。接口速率可支持 SD High Speed / UHS-I,根据硬件设计决定。

三、设备树配置关键项(以 sdhc_1 为例)

3.1、路径示例(基于 AOSP 或 Yocto BSP):

&sdhc_1 {
    status = "okay";
    bus-width = <4>;
    cd-gpios = <&tlmm 104 GPIO_ACTIVE_LOW>;  // 卡检测引脚
    vmmc-supply = <&pm8350l_l7>;             // 电源控制
    vqmmc-supply = <&pm8350l_l6>;            // IO 电压控制
    mmc-ddr-1_8v;
    mmc-hs400-1_8v;
    cap-sd-highspeed;
    no-sdio;
    no-mmc;
};

3.2、说明:

  • bus-width:必须为 4,SD 卡要求;

  • cd-gpios:卡检测引脚(如果无该引脚需省略);

  • vmmc-supply / vqmmc-supply:对应 PMIC 电源 rail;

  • no-sdio / no-mmc:显式禁用 eMMC 和 SDIO 设备,仅保留 SD 卡;

  • cap-sd-highspeed:启用 SD 高速模式;

  • mmc-* 系列属性:与速率和信号电压有关,根据硬件支持添加。

3.3、注意事项:

  • 若无 cd-gpios,需通过 software polling 方式检测;

  • 需确保 PMIC 电源域配置无误,常见为 pm8350l 系列;

  • 若设备树未生效,建议在 sdhc_1 节点加 status = “disabled” 再重新启用测试是否生效。

四、调试日志关键点(使用 dmesg)

4.1、插入 SD 卡时可观察如下日志(成功情况):

[    2.456123] mmc0: SDHCI controller on 8804000.sdhci [8804000.sdhci] using ADMA
[    2.467891] mmc0: new high speed SDHC card at address 0001
[    2.473541] mmcblk0: mmc0:0001 SD16G 14.8 GiB
[    2.476381] mmcblk0: p1
若无任何响应,需排查设备树配置、供电控制、时钟源。

五、驱动模块确认

QCS8550 的 SD 控制器驱动位于:

drivers/mmc/host/sdhci-msm.c

内核配置需确保以下项启用:

CONFIG_MMC=y
CONFIG_MMC_BLOCK=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_MSM=y

可通过以下命令确认驱动已加载:

lsmod | grep sdhci

或者使用 zcat /proc/config.gz | grep MMC_SDHCI_MSM 检查内核配置。

六、平台特有问题与解决方案

问题表现原因分析解决建议
无法识别 SD 卡dmesg 无任何输出电压未使能或 GPIO 未配置检查 vmmc-supply 与 cd-gpios 配置
识别失败报错 -110初始化失败SD 时钟源异常、VIO 电压不匹配检查 vqmmc 电压是否正确为 1.8V
文件系统只读写入失败报错文件系统损坏或写保护使用 fsck 修复或更换 SD 卡
性能极低(低于 5MB/s)写入耗时没有启用 cap-sd-highspeed添加该属性并启用 mmc-hs200-* 等模式

七、性能测试建议(基于 QCS8550)

7.1、只在用户态进行测试,避免干扰系统任务;

7.2、使用 ionice 降低优先级:

ionice -c3 dd if=/dev/zero of=/mnt/sd/test bs=10M count=20 conv=fsync

7.3、可在 kernel 中添加 mmc debug log:

在 sdhci-msm.c 添加调试打印,例如:

dev_dbg(mmc_dev(host->mmc), "SDHCI irq: 0x%x\n", irq);

并启用调试等级:

echo 'file sdhci-msm.c +p' > /sys/kernel/debug/dynamic_debug/control

八、补充 QCS8550 平台 SD 卡热插拔检测、SDIO 模式调试、或 eMMC 与 SD 卡共存处理方案

🔄8.1、SD 卡热插拔检测机制(QCS8550)

8.1.1 支持条件

热插拔依赖卡检测引脚(Card Detect GPIO),或者使用 polling 方式。QCS8550 平台的 sdhc_1 支持 GPIO-based 热插拔检测。

8.1.2 设备树配置(带 cd-gpios)
&sdhc_1 {
    status = "okay";
    cd-gpios = <&tlmm 104 GPIO_ACTIVE_LOW>; // 假设 GPIO104 为 SD 卡 CD 引脚
    disable-wp;
    bus-width = <4>;
    vmmc-supply = <&pm8350l_l7>;
    vqmmc-supply = <&pm8350l_l6>;
    cap-sd-highspeed;
    no-mmc;
    no-sdio;
};
8.1.3 驱动响应机制

驱动会监听 GPIO 中断,在 drivers/mmc/core/slot-gpio.c 中处理:

mmc_gpio_request_cd()

内核 log 示例:

mmc0: card inserted
mmc0: card removed
8.1.4 无 GPIO 时 fallback

若无 cd-gpios,应使用 polling 检测方式:

broken-cd;

并在用户态使用 udevadm 或轮询脚本配合检测 /dev/mmcblk0 的出现/消失。

📶 8.2、SDIO 模式调试(如用于 WiFi/BT 模块)

8.2.1 设备树配置(启用 SDIO)
&sdhc_2 {
    status = "okay";
    bus-width = <4>;
    no-mmc;
    no-sd;
    vmmc-supply = <&pm8350l_l7>;
    vqmmc-supply = <&pm8350l_l6>;
};
8.2.2 驱动确认

确认以下驱动模块存在:

  • CONFIG_MMC_SDHCI_MSM
  • CONFIG_MMC_SDHCI
  • SDIO 客户端设备(如 brcmfmac 或 qca9377 等)

插入 WiFi 模块后应有日志:

mmc1: new SDIO card at address 0001

随后通过 modprobe brcmfmac 或 qca9377 加载驱动。

8.2.3 调试建议

使用 mmc debug 接口查看状态:

cat /sys/kernel/debug/mmc1/ios
cat /sys/kernel/debug/mmc1/status

查看 dmesg 是否识别 SDIO 功能函数块(Function 0 ~ N)。

🔁 8.3、eMMC 与 SD 卡共存方案(如 sdhc_1 和 sdhc_2 同时启用)

8.3.1 共存原则
  • eMMC 通常挂在 sdhc_2,并为 non-removable;
  • SD 卡使用 sdhc_1,并为 removable。
8.3.2 eMMC 设备树配置(sdhc_2)
&sdhc_2 {
    status = "okay";
    bus-width = <8>;
    non-removable;
    vmmc-supply = <&pm8350l_l9>;
    vqmmc-supply = <&pm8350l_l10>;
    mmc-hs400-1_8v;
    mmc-hs200-1_8v;
    mmc-ddr-1_8v;
    cap-mmc-highspeed;
    no-sd;
    no-sdio;
};
8.3.3 SD 卡设备树配置(sdhc_1)

如前述 cd-gpios 示例。

8.3.4 驱动加载顺序确认

使用如下命令查看卡槽状态:

ls /sys/class/mmc_host/
# 输出可能为 mmc0 mmc1

进一步查看每个槽的卡类型:

cat /sys/class/mmc_host/mmc0/mmc0:*/type
# 或
cat /sys/class/mmc_host/mmc1/mmc1:*/type

结果可能为:

MMC         <-- eMMC
SD          <-- SD 卡
8.3.5 文件系统挂载建议

使用 UUID 或 PARTUUID 避免设备名变化造成挂载错误:

UUID=xxx-xxxx /mnt/emmc  ext4 defaults 0 2
UUID=yyy-yyyy /mnt/sdcard  vfat defaults 0 2

可通过 blkid 获取各分区的 UUID。

8.4、🧪 附录:热插拔检测测试脚本

#!/bin/bash
while true; do
    if [ -b /dev/mmcblk0 ]; then
        echo "[OK] SD card present"
    else
        echo "[WARN] SD card not present"
    fi
    sleep 1
done

8.5、✅ 总结补充

模块QCS8550 平台行为说明
SD 卡热插拔支持 GPIO 触发中断或使用 polling 方式检测
SDIO 模式默认支持,但需手动启用驱动并匹配相应模块
eMMC 共存推荐配置为 sdhc_2 绑定 eMMC,sdhc_1 用于 SD 卡
电源与 IO 电压需通过 PM8350L 系列 LDO 或 Switch 正确供电与电平配置
内核调试工具可通过 /sys/kernel/debug/mmc*dmesg 查看调试信息

九、验证 checklist(建议烧录前检查)

  • 检查设备树中是否使能 &sdhc_1;

  • PMIC 电压是否配置正确(vmmc, vqmmc);

  • 是否添加 cap-sd-highspeed;

  • 是否能在 dmesg 中看到设备注册日志;

  • 使用 lsblk 是否可见 mmcblk0p1;

  • 使用 mount 是否可以正常读写。

十、总结

在 QCS8550 平台上调试 SD 卡,核心在于掌握以下几点:

  • 设备树正确配置;

  • 驱动模块与电源域的联动;

  • 内核日志分析经验;

  • 针对平台特有硬件信号和电源 rail 的认知。

  • 通过对设备树、电源、驱动和内核日志的协同分析,可以快速定位问题并完成调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值