Linux 下 SD 卡调试指南(基于 QCS8550 平台)
- 一、平台简介
- 二、QCS8550 的 SD 卡硬件框图简述
- 三、设备树配置关键项(以 sdhc_1 为例)
- 四、调试日志关键点(使用 dmesg)
- 五、驱动模块确认
- 六、平台特有问题与解决方案
- 七、性能测试建议(基于 QCS8550)
- 八、补充 QCS8550 平台 SD 卡热插拔检测、SDIO 模式调试、或 eMMC 与 SD 卡共存处理方案
- 九、验证 checklist(建议烧录前检查)
- 十、总结
一、平台简介
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 的认知。
-
通过对设备树、电源、驱动和内核日志的协同分析,可以快速定位问题并完成调试。