You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linux设备树中强制SD卡识别为SDR50并禁用SDR104

强制SD卡协商为SDR50模式的设备树配置方案

当然可以通过设备树配置来禁用SDR104支持,从而让你的SD卡 fallback到SDR50模式。针对Xilinx ZynqMP的SDHCI控制器(xlnx,zynqmp-8.9a兼容节点),这里有两种可靠的方法:

方法1:限制控制器最大工作频率(推荐)

SDR104模式需要200MHz的总线时钟,而SDR50只需要100MHz。通过在设备树节点中设置xlnx,max-frequency属性,将控制器的最高可用时钟限制为100MHz,就能直接阻断SDR104的协商(因为它达不到所需的时钟速率),驱动会自动选择下一个支持的最高模式——也就是SDR50。

修改你的SDHCI设备树节点:

sdhci@ff160000 {
    compatible = "xlnx,zynqmp-8.9a", "xlnx,zynqmp-sdhci-8.9a";
    /* 保留原有其他属性,比如reg, interrupts等 */
    xlnx,max-frequency = <100000000>; /* 100MHz,对应SDR50的时钟要求 */
};

方法2:禁用SDR104能力位(需确认驱动支持)

部分SDHCI平台驱动支持通过设备树属性直接禁用特定UHS模式。你可以尝试在节点中添加no-sdr104属性(如果内核驱动支持的话):

sdhci@ff160000 {
    compatible = "xlnx,zynqmp-8.9a", "xlnx,zynqmp-sdhci-8.9a";
    /* 保留原有其他属性 */
    no-sdr104;
};

注:这个属性的支持取决于你的内核版本和zynqmp sdhci驱动的实现,如果方法1生效的话,优先用方法1更稳妥。

验证配置是否生效

修改完成后,重新编译设备树并烧写到板子上,重启后通过以下命令查看SD卡的工作模式:

# 替换mmcX:XXXX为你的SD卡节点,比如mmc0:0001
cat /sys/class/mmc_host/mmc0/mmc0:0001/ios

在输出中找到timing字段,如果显示UHS_SDR50,就说明配置成功了。同时clock字段应该接近100000000(100MHz)。

注意事项

  • 确保你的SD卡确实支持SDR50模式(你已经确认过,这步可以忽略)。
  • 确认ZynqMP的时钟树能提供100MHz的时钟给SDHCI控制器,否则可能会 fallback到更低速率的模式(比如SDR25)。
  • 如果上述方法都不生效,可能需要临时修改内核驱动:在sdhci-zynqmp.c的probe函数中,清除SDHCI_CTRL_UHS_SDR104位,但这需要重新编译内核,是备选方案。

内容的提问来源于stack exchange,提问作者Thale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:40:10