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

树莓派3B+如何在U-boot中切换使用SDHCI作为SD卡控制器?

问题解答

1. 让SD卡驱动在U-boot下运行的最佳方式及操作指引

是的,你必须重新编译U-boot,将SDHCI配置为主SD卡控制器(同时放弃WiFi功能),具体操作步骤如下:

  • 修改设备树文件:找到对应RPi 3B+的DTS文件(通常路径为arch/arm/dts/bcm2837-rpi-3-b-plus.dts),调整&sdhci节点:
    • 删除non-removable;与mmc-pwrseq = <&wifi_pwrseq>;两行配置
    • 删除子节点brcmf: wifi@1 { ... };
    • 保留bus-width = <4>;,最终节点示例:
      &sdhci {
          #address-cells = <1>;
          #size-cells = <0>;
          pinctrl-names = "default";
          pinctrl-0 = <&emmc_gpio34>;
          status = "okay";
          bus-width = <4>;
      };
      
    • 确认&sdhost节点的status = "disabled";,确保旧控制器不会被启用
  • 调整U-boot配置:在configs/rpi_3_b_plus_defconfig中:
    • 保留CONFIG_MMC_BCM2835=n(禁用sdhost驱动)
    • 确保CONFIG_MMC_SDHCI=y和CONFIG_MMC_SDHCI_BCM2835=y(启用SDHCI驱动)
  • 重新编译U-boot:
    make rpi_3_b_plus_defconfig
    make CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
    
  • 刷入定制U-boot:将编译生成的u-boot.bin替换SD卡boot分区内的同名文件(注意备份原文件)

完成后U-boot会将SDHCI控制器识别为标准MMC/SD卡控制器,你的裸机驱动即可正常初始化该硬件。

2. 是否有U-boot shell命令提供裸机未修改运行环境?

没有直接的U-boot命令能完全还原裸机的硬件初始状态。U-boot启动时会初始化大部分硬件(包括GPIO、时钟、MMC控制器等),这些初始化操作的寄存器修改是不可逆的——即使禁用相关驱动,硬件状态也无法回到上电时的原始状态。

若要接近裸机环境,只能修改U-boot源码,移除对SDHCI控制器的初始化逻辑,本质上还是定制编译U-boot。

3. 排查问题原因的步骤

  • 检查硬件寄存器状态:在U-boot shell中用md命令读取SDHCI控制器的寄存器(基地址0x7e300000),对比裸机上电后的寄存器值,定位被U-boot修改的关键位(如时钟使能、GPIO复用、电源控制位等)
  • 验证U-boot的MMC驱动状态:执行mmc info命令,查看SDHCI控制器的识别信息,若显示为SDIO设备而非MMC卡,说明U-boot仍将其配置为WiFi模式
  • 测试控制器重置:在U-boot中手动重置SDHCI控制器(写入寄存器0x7e300000 + 0x0C的重置位),再运行你的驱动,观察是否能恢复正常
  • 开启U-boot调试日志:开启CONFIG_DEBUG_MMC=y配置,重新编译U-boot后查看启动日志,观察SDHCI控制器的初始化流程,确认是否加载了WiFi相关配置
  • 对比硬件状态差异:编写极简裸机程序,仅读取SDHCI和GPIO的关键寄存器值,分别在裸机启动、U-boot启动后用go命令执行,对比两者的寄存器差异,定位核心问题点

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:55:29