嘉楠科技
直播中

旧念

10年用户 911经验值
擅长:可编程逻辑 电源/新能源 光电显示
私信 关注
[问答]

emmc烧录完成后,将BOOT引脚切换到emmc模式,识别不到设备,怎么解决?

软硬件版本信息

错误日志
U-Boot SPL 2022.10-00008-gd20cb609 (Feb 13 2025 - 20:49:08 -0500)
ddr 1866
00000000: PMU Major Msg: End of CA training                                         
00000000: PMU Major Msg: End of initialization                                      
00000000: PMU Major Msg: End of read enable training                                
00000000: PMU Major Msg: End of fine write leveling                                 
00000000: PMU Major Msg: End of read dq deskew training                             
00000000: PMU Major Msg: End of MPR read delay center optimization                  
00000000: PMU Major Msg: End of Write leveling coarse delay                        
00000000: PMU Major Msg: End of write delay center optimization                     
00000000: PMU Major Msg: End of read delay center optimization                     
00000000: PMU Major Msg: End of max read latency training                           
00000000: PMU Major Msg: Firmware run has completed                                 
image: uboot load to 1000000 compress =1 src 2aaaacff len=49c48
U-Boot 2022.10-00008-gd20cb609 (Feb 13 2025 - 20:49:08 -0500)
CPU:   rv64imafdcvsu
Model: kendryte k230 canmv dongshanpi 512MiB
DRAM:  1 GiB
Core:  25 devices, 13 uclasses, devicetree: embed
MMC:   mmc0@91580000: 0, mmc1@91581000: 1
Loading Environment from MMC... OK
In:    serial@91400000
Out:   serial@91400000
Err:   serial@91400000
Net:   No ethernet found.
Hit any key to stop autoboot:  0
image: rtt load to 0 compress =1 src 2aaaad07 len=13cc24
Jump to big hart
OpenSBI v1.2.2
heap: [0x0043dc40 - 0x0443dc40], size 65536 KB
page: [0x0443dc48 - 0x1fffec00], size 454403 KB
lwIP-2.1.2 initialized!
尝试解决过程
补充材料
        你好,这个是因为你的硬件没有接INT0或者INT4,然后代码里使用了硬件rtc,执行make rtsmart-menuconfig去关掉RTC_PMU驱动,
        
检查你的板子这部分的原理图。
        


回帖(1)

王辉

2025-6-26 17:51:29

根据您提供的信息(U-Boot SPL启动日志片段及无法从eMMC启动的问题),这是一个典型的启动流程卡在SPL阶段的故障。以下是详细分析和解决步骤:


核心问题分析:




  1. SPL成功执行但未加载主U-Boot: 日志显示SPL(2022.10版本)已初始化成功,包括DDR内存(ddr 1866...)和PMU相关操作(End of CA training, End of initialization)。这说明硬件初始化(CPU、DDR、PMU)基本通过。卡点在于SPL未能成功从eMMC加载主U-Boot程序




  2. “识别不到设备”: 这里的“设备”指的是主U-Boot以及后续的内核等。系统无法启动,根本原因是主U-Boot没有被加载执行。




可能原因及排查步骤:


? 1. eMMC硬件/连接/电源问题



  • BOOT引脚配置错误 (首要检查!):

    • 仔细查阅你硬件平台的官方文档或原理图,确认eMMC启动模式需要哪几个BOOT引脚处于何种状态(拉高/拉低)。

    • 再次确认: 烧录完成后,BOOT引脚是否已物理切换到eMMC启动所需的模式?切换是否可靠?是否接触不良?是否有电阻配置不正确?


  • eMMC 焊接/连接问题:

    • 检查eMMC芯片焊点是否有虚焊、短路(尤其与SPI flash共存时易混淆)、冷焊。

    • 确认eMMC的CMDCLKDAT0-DAT7 (取决于总线宽度) 等关键信号线连接良好,无断线或干扰。


  • eMMC 供电问题:

    • 测量eMMC芯片的供电电压(通常是VCCVCCQ)是否在规格范围内(如3.3V或1.8V)并且足够稳定。在启动瞬间用示波器看是否有明显跌落。使用劣质电源或连接器可能导致启动失败。


  • eMMC 硬件损坏: 烧录过程异常或ESD等因素造成芯片物理损坏(作为最后考虑项)。


? 2. eMMC烧录问题 (关键!)



  • 烧录是否真正成功?

    • 确认烧录软件报告了“成功完成”❓ 并且没有警告或错误❌。

    • 烧录工具是否正确识别并选择了目标eMMC设备?烧录对象是否正确?

    • 数据验证: 烧录后是否进行了完整的read backverify?强烈建议在烧录流程中启用验证功能?。


  • 烧录内容是否正确?

    • 你烧录的镜像文件是否适配于你的具体硬件平台?SPL/U-Boot版本虽为2022.10,但配置、驱动和硬件参数可能不匹配。

    • 镜像是否包含了正确的eMMC分区信息(如GPT或MBR)以及必要的分区(如BOOT, RPMB, USER等)?


  • SPL位置错误:

    • 很多SoC要求SPL必须放置在eMMC的特定扇区偏移量(如SD卡模式下的LBA 0x40 / 64, eMMC boot0/boot1分区等),而非普通分区内。确认你的烧录工具是否将SPL写入了正确位置。例如:
      # 示例命令:将SPL写入eMMC boot0分区起始位置(具体偏移需查文档)
      mmc dev 0 0  # 切换到eMMC boot0分区
      mmc write $loadaddr 0x0 0x100  # 将内存中的SPL写入boot0分区的起始块


  • U-Boot位置错误:

    • 主U-Boot程序(通常包含环境变量)需要存储在主存储区USER分区)的特定位置(例如某个FAT或ext4文件系统分区中名为u-boot.itbu-boot.bin的文件,或在原始分区上)。SPL配置是否正确指向了该位置?你的烧录是否将U-Boot镜像写入到了SPL所期望的位置?


  • 启动分区激活:

    • 如果你的eMMC有多个Boot分区(boot0/boot1),烧录后是否设置正确的分区为激活状态?例如使用命令:mmc partconf 0 0 1 1(具体参数视SoC和mmc driver而定)。



⚙ 3. SPL/U-Boot配置问题



  • 驱动/配置不匹配:

    • 你使用的SPL(2022.10版本)是否正确配置并编译了对你板子上这颗特定eMMC控制器的驱动支持?CONFIG_MMC, CONFIG_DM_MMC, CONFIG__MMC 等选项是否在编译SPL时启用了?检查SPL的defconfigconfig.h

    • 设备树错误: SPL或U-Boot主程序使用的设备树(dtb)中,eMMC节点(mmc节点)的配置是否正确?这包括管脚复用(Pinmux)、时钟频率、总线宽度(4bit or 8bit)、电压、分区位置等。

    • 错误的读取逻辑: SPL尝试从eMMC读取数据的地址、偏移量、块数是否与烧录进去的位置完全一致?这往往由设备树定义。



? 4. 串口调试(获取更多信息 - 最重要!)



  • 连接开发板的串口调试终端(通常是UART0),确保波特率(115200是最常见)设置正确。

  • 仔细观察完整启动日志: 你的日志是在“卡死”前的一小段。卡死后是否还有任何输出? 哪怕是非常短暂的错误信息(如MMC read failed, Timeout, CRC error, Card not responding等)都至关重要。

  • 在SPL阶段,可以尝试启用更详细的调试信息:

    • 修改源码:在SPL中启用CONFIG_LOG_MAX_LEVEL=DEBUGCONFIG_MMC_DEBUG等选项,重新编译SPL并烧录。这将打印eMMC初始化、识别的详细信息。

    • 已有环境变量:如果之前有配置verbosity环境变量,串口可能会有更多调试输出。



解决步骤总结 (按照优先级):



  1. 强制串口输出: 连接串口调试终端,捕获完整的启动日志,尤其注意SPL加载eMMC和尝试加载主U-Boot时的任何错误信息。这将是最直接的线索?。

  2. 三重确认BOOT引脚: 对照硬件手册或原理图,手动确认每个BOOT引脚的电压状态(用万用表测量)是否符合eMMC启动的要求。检查跳线帽、开关或电阻设置。

  3. 验证烧录结果:

    • 如果可能,通过其他方式(如从SD卡或USB启动到U-Boot)挂载eMMC,检查分区信息和烧录进去的文件(u-boot.itb, u-boot.bin等)是否存在且大小正确。

    • 使用烧录工具的校验功能或者手动read back对比原始镜像。


  4. 确认SPL/U-Boot烧录位置:

    • 仔细阅读SoC手册和U-Boot文档,确定SPL必须烧录到的确切位置(eMMC boot分区?主存储区特定偏移?)

    • 确认烧录工具配置是否将该地址写入对应位置。


  5. 检查软件适配性:

    • 确认使用的U-Boot/SPL源码版本是否明确支持你的目标硬件平台。如果是不常见的板卡或自研板,需要重点检查eMMC控制器驱动和DTS配置。

    • 尝试使用SD卡启动进入U-Boot命令行环境,手动测试eMMC访问(mmc list, mmc dev, mmc read, fatls mmc 0:1等)是否能成功识别和操作eMMC。如果能,说明硬件基本没问题,软件(烧录位置、配置)是主因;如果不能,硬件问题可能性大。例如:
      # 从SD卡启动后尝试操作eMMC
      mmc dev 1  # 假设eMMC是设备1
      mmc info   # 查看eMMC信息
      mmc read $loadaddr 0x10000 0x100  # 尝试从USER分区读取一段数据
      md $loadaddr # 查看读取的内容是否如预期


  6. 检查供电: 用示波器观察eMMC供电电压(VCC/VCCQ)在启动瞬间的波形,确保稳定且无跌落。

  7. 考虑硬件故障: 如果上述软件和配置问题都排查无误,且串口日志明确指示设备无响应或初始化失败(No card, Communication error等),则可能是eMMC硬件损坏或焊接不良(如虚焊导致数据线断路)。


? 基于你当前日志的推测 (需进一步验证):



  • 最可能的原因: 烧录的SPL未放置在eMMC的正确启动区域(如boot0分区开头),或者主U-Boot镜像未被放置在SPL配置指向的位置(USER分区特定偏移或文件路径)。SPL成功初始化了DDR和PMU后,尝试从eMMC读取主U-Boot失败,导致直接“死机”。

  • 其次可能: BOOT引脚配置实际并未正确切换到eMMC模式,SPL仍试图从其他介质(如SPI NOR)启动,或者eMMC在启动时无法正常工作(连接、供电、损坏)。


请优先收集完整的串口日志! 这是诊断此类启动问题的金钥匙?。一旦看到详细的错误信息,就能更精准地定位问题所在。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分