技术问询:如何实现从eMMC用户数据分区启动U-boot并指定地址加载
实现从eMMC用户数据分区启动U-boot的完整实操指南
看起来你已经搞定了最关键的SPL修改——让FSBL能从eMMC用户数据分区加载U-boot到指定DRAM地址0x60000000,接下来只要把剩下的步骤落地,就能顺利进入U-boot命令行。下面是具体的操作步骤和验证细节:
一、先搞定eMMC用户数据分区的初始化
首先得确保eMMC的用户数据分区是干净且可正常读写的,这里提供两种常用方法:
- 通过临时U-boot初始化:如果你的开发板能从SD卡/串口临时启动U-boot,执行以下命令:
- 先切换到eMMC设备:
mmc dev 0(设备编号0根据你的硬件调整,不确定的话用mmc list查看) - 查看现有分区表:
mmc part,找到用户数据分区的起始扇区(比如通常是mmcblk0p2对应的起始地址) - 如果分区未格式化,执行擦除(注意:这会清空分区所有数据!):
mmc erase <起始扇区> <扇区数>,或者直接用mmc erase all擦除整个eMMC后重新分区(如果允许的话)
- 先切换到eMMC设备:
- 通过Linux系统格式化:把eMMC挂载到PC或开发板的Linux系统中,找到用户数据分区的节点(比如
/dev/mmcblk0p2),用mkfs.ext4 /dev/mmcblk0p2格式化为ext4(或者你需要的文件系统,只要SPL能识别即可)
二、将U-boot镜像烧录到eMMC用户数据分区
你提到已经有烧录工具,这里要注意必须把镜像写到SPL能找到的位置,两种烧录方式供你选:
- U-boot命令行烧录:
- 先把U-boot镜像加载到DRAM的临时地址(比如
0x61000000,别和0x60000000冲突):比如用tftpboot 0x61000000 u-boot.bin或者load mmc 1:1 0x61000000 u-boot.bin(从SD卡加载) - 写入到eMMC用户数据分区:
mmc write 0x61000000 <用户分区起始扇区> <镜像占用扇区数>- 镜像占用扇区数计算:
镜像字节数 ÷ 512,如果有余数就向上取整,比如镜像大小是1.2MB,就是1.2*1024*1024 /512 = 2458扇区
- 镜像占用扇区数计算:
- 先把U-boot镜像加载到DRAM的临时地址(比如
- PC端工具烧录(比如dd命令):
把eMMC通过读卡器连接到PC,找到用户数据分区的设备节点(比如/dev/sdb2),执行:
这里的dd if=u-boot.bin of=/dev/sdb2 bs=512 seek=<偏移扇区数><偏移扇区数>要和你SPL中配置的读取偏移完全一致,默认可以设为0(直接从分区起始位置写入)
三、最后验证SPL的加载逻辑
再检查一遍你修改的SPL是否满足这几个关键点:
- SPL初始化eMMC控制器的代码没有问题,能正确识别eMMC设备
- SPL读取U-boot镜像的地址是eMMC用户数据分区的正确位置(起始扇区+偏移)
- SPL把镜像完整加载到了
CONFIG_SYS_TEXT_BASE = 0x60000000这个DRAM地址,且没有覆盖SPL自身的运行空间 - 加载完成后,SPL正确跳转到
0x60000000地址执行
四、启动测试
拔掉临时启动的SD卡,重启开发板,盯着串口输出:
- 先看FSBL是否正常启动SPL
- 然后SPL会输出eMMC初始化、镜像加载的日志,确认加载地址是
0x60000000 - 最后如果看到熟悉的U-boot命令行提示符(比如
=>),就说明整个流程完全成功了!
内容的提问来源于stack exchange,提问作者shaikh kamal




