AM335X 识别SD卡错误:MMC: no card present

本文解决了一个在移植OpenWrt的U-Boot过程中遇到的问题:明明配置了mmc管脚却无法识别MMC设备。通过配置设备树解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

移植OpenWrt的uboot的时候,发现明明配置好了mmc的管脚(board/ti/am335x/mux.c),能读取到MLO,通过MLO也能读取到u-boot.img。但是进入到uboot的命令模式下却发现怎么都找不到mmc,如下所示:

U-Boot SPL 2017.01 (Apr 08 2018 - 07:27:14)
Trying to boot from MMC2Card did not respond to voltage select!
** Bad device mmc 0 **
Using default environment


reading u-boot.img
reading u-boot.img
reading u-boot.img
reading u-boot.img




U-Boot 2017.01 (Apr 08 2018 - 07:27:14 +0000)


CPU  : AM335X-GP rev 2.1
Model: TI AM335x EVM
DRAM:  256 MiB
NAND:  0 MiB
MMC:   OMAP SD/MMC: 0, OMAP SD/MMC: 1
MMC: no card present
** Bad device mmc 0 **
Using default environment


<ethaddr> not set. Validating first E-fuse MAC
Net:   Could not get PHY for ethernet@4a100000: addr 0
eth0: ethernet@4a100000
Hit any key to stop autoboot:  0 
=> 
=> mmc info
MMC: no card present 
=> 
=> mmc dev 0
MMC: no card present
=> mmc dev 1
MMC: no card present
=> 
=> 
 

原来是没有u-boot-2017.01已经用上了设备树,所以需要配置设备树。在网上发现u-boot-2016.05也有这个问题,所以要重也要在设备树下配置管脚。

arch/arm/dts/am335x-evm.dts:

      mmc2_pins_default: pinmux_mmc2_pins {
                pinctrl-single,pins = <
                        0x000 (PIN_INPUT_PULLUP | MUX_MODE1)    /* gpmc_ad0.mmc1_dat0 */
                        0x004 (PIN_INPUT_PULLUP | MUX_MODE1)    /* gpmc_ad1.mmc1_dat1 */
                        0x008 (PIN_INPUT_PULLUP | MUX_MODE1)    /* gpmc_ad2.mmc1_dat2 */
                        0x00c (PIN_INPUT_PULLUP | MUX_MODE1)    /* gpmc_ad3.mmc1_dat3 */
                        0x010 (PIN_INPUT_PULLUP | MUX_MODE1)    /* gpmc_ad4.mmc1_dat4 */
                        0x014 (PIN_INPUT_PULLUP | MUX_MODE1)    /* gpmc_ad5.mmc1_dat5 */
                        0x018 (PIN_INPUT_PULLUP | MUX_MODE1)    /* gpmc_ad6.mmc1_dat6 */
                        0x01c (PIN_INPUT_PULLUP | MUX_MODE1)    /* gpmc_ad7.mmc1_dat7 */
                >;      
        };              
                        
        mmc2_pins_sleep: pinmux_mmc2_pins_sleep { 
                pinctrl-single,pins = <
                        0x000 (PIN_INPUT_PULLDOWN | MUX_MODE1)    /* gpmc_ad0.mmc1_dat0 */
                        0x004 (PIN_INPUT_PULLDOWN | MUX_MODE1)    /* gpmc_ad1.mmc1_dat1 */
                        0x008 (PIN_INPUT_PULLDOWN | MUX_MODE1)    /* gpmc_ad2.mmc1_dat2 */
                        0x00c (PIN_INPUT_PULLDOWN | MUX_MODE1)    /* gpmc_ad3.mmc1_dat3 */
                        0x010 (PIN_INPUT_PULLDOWN | MUX_MODE1)    /* gpmc_ad4.mmc1_dat4 */
                        0x014 (PIN_INPUT_PULLDOWN | MUX_MODE1)    /* gpmc_ad5.mmc1_dat5 */
                        0x018 (PIN_INPUT_PULLDOWN | MUX_MODE1)    /* gpmc_ad6.mmc1_dat6 */
                        0x01c (PIN_INPUT_PULLDOWN | MUX_MODE1)    /* gpmc_ad7.mmc1_dat7 */
                >; 
        };      

......
&mmc2 {
        status = "okay";
        vmmc-supply = <&vmmcsd_fixed>;
        bus-width = <8>;
        pinctrl-names = "default", "sleep";
        pinctrl-0 = <&mmc2_pins_default>;
        pinctrl-1 = <&mmc2_pins_sleep>;
        ti,non-removable;
};

问题解决。


<think>我们正在解决U-Boot环境下执行MMC相关命令时出现“no mmc device available”错误的问题。根据提供的引用内容,我们可以分析出几个可能的原因和解决方案: 引用[1]中出现了“mmc no card present”和“Bad device mmc 0”的错误,这表示MMC设备(如SD或eMMC)没有被正确检测到。可能的原因包括: - 物理连接问题(如未插入或接触不良) - 硬件配置问题(如电源、时钟或引脚配置) - 驱动问题(U-Boot中没有正确初始化MMC控制器) 引用[2]提到了Linux内核中MMC子系统的初始化过程,包括上电和检测的过程。虽然这是在Linux内核中的过程,但U-Boot中MMC的初始化也有类似步骤。如果U-Boot中MMC控制器驱动没有正确初始化,或者没有正确进行上电和检测,就会导致无法找到MMC设备。 引用[3]和[4]分别提到了蓝牙设备找不到和NAND设备找不到的问题,虽然设备不同,但思路类似,都是驱动或设备树配置问题。 因此,我们可以按照以下步骤排查: 步骤1:检查物理连接 - 确保SD或eMMC模块已正确插入,并且接触良好。 - 如果是SD,尝试更换一张已知良好的SD。 步骤2:检查硬件配置 - 确认开发板的电源供应稳定,特别是MMC设备的供电。 - 检查开发板的原理图,确认MMC相关的引脚配置是否正确(如时钟、命令、数据线等)。 步骤3:检查U-Boot中的MMC驱动支持 - 确认使用的U-Boot版本是否支持当前开发板的MMC控制器。 - 在U-Boot命令行中,输入`mmc list`查看可用的MMC设备。如果没有任何输出,说明MMC控制器没有被初始化。 步骤4:检查设备树配置 - 在U-Boot中,设备树(Device Tree)用于描述硬件。如果设备树中关于MMC控制器的节点配置不正确,也会导致无法识别设备。 - 在U-Boot源码中,检查设备树文件(.dts或.dtsi)中是否有MMC控制器的节点,并且状态(status)是否为"okay"。 - 检查引脚复用(pinctrl)配置是否正确。 步骤5:检查U-Boot的配置选项 - 确认U-Boot配置(.config)中已经启用了MMC驱动和对应的控制器驱动。例如,对于全志平台,可能需要配置`CONFIG_MMC_SUNXI`。 步骤6:在U-Boot中手动初始化MMC - 尝试在U-Boot命令行中手动初始化MMC设备: => mmc rescan - 或者指定设备号进行初始化: => mmc dev 0 # 尝试切换到设备0 步骤7:查看U-Boot启动日志 - 在启动U-Boot时,观察串口输出日志,看是否有MMC初始化的相关信息,以及是否有错误提示。 步骤8:更新U-Boot或打补丁 - 如果确认是U-Boot的驱动问题,可以尝试更新到最新版本的U-Boot,或者寻找针对该问题的补丁。 根据引用[4]中解决NAND设备找不到的方法,我们可以类比:检查设备树中MMC控制器节点的配置。在U-Boot中,设备树可能被编译进U-Boot镜像中,因此需要修改设备树源文件并重新编译U-Boot。 具体操作示例(以全志D1为例): - 在U-Boot源码目录中找到设备树文件,例如:`arch/riscv/dts/neza-d1.dts` - 确保MMC控制器节点(如mmc0)包含以下内容: mmc0: mmc@4020000 { compatible = "allwinner,sun20i-d1-mmc"; ... // 其他属性 status = "okay"; }; - 重新编译U-Boot并烧写到开发板。 如果问题仍然存在,可能需要进一步调试驱动代码,或者检查硬件时序等。 相关问题: 1. U-Boot中如何查看当前支持的MMC设备? 2. 如何修改U-Boot的设备树并重新编译? 3. U-Boot中MMC驱动初始化失败的可能原因有哪些? 4. 如何通过U-Boot命令手动初始化MMC设备?</think>### 解决 U-Boot 中 "no mmc device available" 错误的完整指南 #### 问题分析 当执行 `mmc` 相关命令时出现 **"no mmc device available"** 错误,通常表明以下问题之一: 1. **物理连接问题**:SD/MMC 未正确插入或接触不良 2. **驱动未加载**:MMC 控制器驱动未初始化 3. **设备树配置错误**:硬件描述缺失或错误 4. **电源/时钟问题**:MMC 控制器未正确供电或时钟未启用 ```mermaid graph TD A[no mmc device available] --> B[检查物理连接] A --> C[检查驱动状态] A --> D[验证设备树配置] A --> E[检查电源/时钟] ``` #### 解决方案步骤 ##### 1. 检查物理连接(硬件层) - 重新插拔 SD/MMC ,确保金手指清洁 - 使用万用表检测供电电压(通常 3.3V): ```shell # 测量开发板 MMC 接口 VCC 引脚 => mmc dev 0 # 执行后测量电压 ``` - 更换已知正常的 SD 测试 ##### 2. 验证驱动状态(U-Boot 层) ```shell # 查看 MMC 设备列表 => mmc list # 若无输出,表示驱动未加载 # 手动初始化 MMC 控制器 => mmc rescan => mmc dev 0 # 尝试切换到设备0 # 检查控制器状态 => mmc info ``` 若仍失败,继续下一步: ##### 3. 检查设备树配置(关键步骤) 这是最常见原因,需确认: 1. MMC 控制器节点是否启用 2. 引脚复用配置是否正确 3. 时钟配置是否正常 **修复示例**(基于引用[4]): ```dts // 在设备树文件 system-usr.dtsi 中添加 &amp;mmc0 { status = "okay"; // 确保控制器启用 pinctrl-names = "default"; pinctrl-0 = <&amp;mmc0_pins>; // 确认引脚组正确 bus-width = <4>; // 数据线宽度 max-frequency = <50000000>; // 时钟频率 }; ``` 修改后**重新编译 U-Boot** 并烧写。 ##### 4. 检查电源和时钟(硬件/驱动层) ```shell # 手动上电(参考引用[2]) => mmc claim_host 0 # 占用控制器 => mmc power_up 0 # 电源使能 => mmc release_host 0 # 释放控制器 => mmc rescan # 重新扫描 # 查看时钟配置 => mmc clk 0 # 显示当前时钟 => mmc setclk 0 400000 # 设置时钟频率(示例) ``` ##### 5. 诊断驱动兼容性 ```shell # 检查驱动版本 => mmc version # 输出示例:MMC version 5.1 # 验证控制器支持 => mmc capabilities # 确认输出包含 "High Speed" 等特性 ``` 若版本不匹配,需**更新 U-Boot** 或添加补丁(参考引用[3]中蓝牙驱动解决方案)。 #### 高级调试技巧 ```shell # 启用详细调试信息(需重新编译U-Boot) => setenv mmcdebug 1 => mmc dev 0 # 查看硬件寄存器(需适配具体平台) => md.l 0x01C0F000 4 # 查看全志平台MMC寄存器 ``` 典型寄存器检查点: 1. `CLKCR` - 时钟控制寄存器 2. `PWRREG` - 电源控制寄存器 3. `CMDREG` - 命令状态寄存器 #### 常见错误处理 | 错误现象 | 解决方案 | |---------|---------| | `CMD timeout` | 降低时钟频率 `mmc setclk 0 250000` | | `Voltage switch failed` | 检查电压支持 `mmc ocr` | | `Invalid card` | 更换SD或检查检测引脚 | | `Controller not found` | 验证设备树节点地址正确性 | #### 永久修复流程 1. 修改设备树添加 MMC 节点 2. 配置引脚控制组(pinctrl) 3. 重新编译 U-Boot: ```bash make menuconfig # 启用 CONFIG_MMC_SUNXI(全志平台示例) make ``` 4. 烧写新 U-Boot 到开发板 5. 启动后验证: ```shell => mmc dev 0 Device: SUNXI SD/MMC Manufacturer ID: 3 OEM: 5344 ``` ### 相关问题 1. 如何为新的开发板添加 MMC 控制器支持? 2. 设备树中 MMC 节点需要配置哪些关键参数? 3. U-Boot 中如何调试 MMC 初始化失败问题? 4. SD 不同速度模式(HS200/HS400)如何启用? 5. 如何通过 JTAG 调试 MMC 控制器的信号完整性?[^4] > 提示:若问题仍未解决,请提供以下信息: > - U-Boot 版本 `=> version` > - 完整启动日志 > - 设备树中 MMC 节点内容 > - `mmc debug` 的输出信息 [^1]: MMC 初始化流程参考 [^2]: 电源控制关键操作 [^3]: 驱动兼容性解决方案 [^4]: 硬件级调试方法
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酣楼驻海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值