树莓派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
相关产品推荐
相关产品推荐

