我在 RK3576 上踩坑了SD 卡 CD 检测与初始化问题按照经验SD 卡通常是“信号直连 SoC、驱动成熟”的模块似乎不需要太多调试。但这次在 RK3576 上却遇到了两个问题SD 卡拔插无反应以及更换 CD 检测脚后初始化失败。先给结论RK3576 不能使用普通 I/O 口替代 CD 检测脚必须正确使用SDMMC0_DETN否则可能导致 SD 卡无法完成初始化。1. 硬件连接与 CD 检测系统通过 SDMMC0_CD 引脚的电平状态判断是否插入 SD 卡插入 Micro SD 卡时卡座检测弹片与外壳接触CD 引脚接地变为低电平系统检测到低电平后判断 SD 卡已插入拔出 SD 卡后CD 引脚恢复高电平系统判断 SD 卡已移除。因此CD 检测脚并不是一个可以随意替换的普通 GPIO。SD 卡识别过程可以把识别过程简单理解为主控向 SD 卡发送带有 48 bit 数据的 48 个时钟SD 卡返回 48 个时钟和 48 bit 响应数据控制器根据响应继续完成初始化和电压切换。2. 基础软件配置SDMMC 节点的配置示例sdmmc { max-frequency 200000000; no-sdio; no-mmc; bus-width 4; cap-mmc-highspeed; cap-sd-highspeed; disable-wp; sd-uhs-sdr104; vqmmc-supply vccio_sd_s0; status okay; };3. 问题一SD 卡拔插无反应现象配置 DTS 后插入 SD 卡系统没有识别反应。查看引脚加载正常说明驱动侧暂时没有明显问题接下来应重点排查硬件连接和 CD 检测信号。可以先查看 pinctrl 的加载情况cat/sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins|grepsdmmc原因分析系统依赖 SDMMC0_CD 引脚的电平变化判断插拔。如果插拔都没有反应说明 CD 检测脚可能没有产生电平变化。进一步排查发现硬件使用的不是SDMMC0_DETN而是普通 I/O 口GPIO2_D6。解决方式参考 RK 官方文档使用正确的 CD 检测配置。例如sdmmc { pinctrl-0 sdmmc0_clk sdmmc0_cmd sdmmc0_bus4; max-frequency 200000000; no-sdio; no-mmc; bus-width 4; cap-mmc-highspeed; cap-sd-highspeed; disable-wp; sd-uhs-sdr104; cd-gpios gpio2 RK_PD6 GPIO_ACTIVE_LOW; vqmmc-supply vccio_sd_s0; status okay; };实际设计时仍应以芯片手册、原理图和板级连接为准确认 CD 检测脚没有被其他功能占用。4. 问题二SD 卡初始化失败现象重新配置 CD 检测脚后插拔 SD 卡已经能够输出日志但初始化仍然失败mmc_host mmc1: Timeout sending command mmc1: Skipping voltage switch mmc1: error -110 whilst initialising SD card dwmmc_rockchip 2a310000.mmc: Busy; trying anyway mmc_host mmc1: Timeout sending command原因分析初步怀疑 SD 卡无法从 3.3 V 切换到 1.8 V导致初始化失败。进一步分析发现系统复位后SoC 会根据SDMMC0_DETN的输入电平决定使用 SDMMC0 还是 JTAG 功能该引脚被 Wi-Fi 复用为唤醒脚因此 SD 卡初始化阶段无法正确完成功能切换。定位结论必须使用SDMMC0_DETN作为 CD 检测脚不能用普通 I/O 替代也不能把它作为其他普通功能使用。RK3576 的 JTAG 与 SDMMC0 功能存在复用关系。系统复位结束后芯片会根据SDMMC0_DETN管脚的电平切换 IOMUX 功能这也是问题的关键。5. 调试经验总结这次问题表面上像是 SD 卡驱动异常实际涉及CD 检测脚选择SoC 管脚复用SDMMC0 与 JTAG 的功能复用3.3 V 到 1.8 V 的电压切换Wi-Fi 对相关引脚的复用硬件连接与设备树配置的一致性。排查这类问题时建议按下面的清单执行对照原理图确认 CD 检测脚对照芯片手册确认管脚复用限制检查 DTS 中的pinctrl、cd-gpios和供电配置查看插拔时 CD 引脚是否真的发生电平变化检查 3.3 V/1.8 V 电压切换结合内核日志确认超时发生在哪个阶段检查 Wi-Fi 等其他模块是否占用了复用引脚。6. 小结调试驱动不仅要懂代码、Linux 系统和通信机制也必须理解硬件原理。知道“软件哪里可能有问题”还不够还要能通过电平、波形、复用关系和日志找到证据。RK3576 这个案例再次说明当硬件功能与 JTAG、Wi-Fi 等功能复用时管脚选择本身就是功能正确性的前提。