You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

技术问询:如何实现从eMMC用户数据分区启动U-boot并指定地址加载

实现从eMMC用户数据分区启动U-boot的完整实操指南

看起来你已经搞定了最关键的SPL修改——让FSBL能从eMMC用户数据分区加载U-boot到指定DRAM地址0x60000000,接下来只要把剩下的步骤落地,就能顺利进入U-boot命令行。下面是具体的操作步骤和验证细节:

一、先搞定eMMC用户数据分区的初始化

首先得确保eMMC的用户数据分区是干净且可正常读写的,这里提供两种常用方法:

  • 通过临时U-boot初始化:如果你的开发板能从SD卡/串口临时启动U-boot,执行以下命令:
    1. 先切换到eMMC设备:mmc dev 0(设备编号0根据你的硬件调整,不确定的话用mmc list查看)
    2. 查看现有分区表:mmc part,找到用户数据分区的起始扇区(比如通常是mmcblk0p2对应的起始地址)
    3. 如果分区未格式化,执行擦除(注意:这会清空分区所有数据!):mmc erase <起始扇区> <扇区数>,或者直接用mmc erase all擦除整个eMMC后重新分区(如果允许的话)
  • 通过Linux系统格式化:把eMMC挂载到PC或开发板的Linux系统中,找到用户数据分区的节点(比如/dev/mmcblk0p2),用mkfs.ext4 /dev/mmcblk0p2格式化为ext4(或者你需要的文件系统,只要SPL能识别即可)

二、将U-boot镜像烧录到eMMC用户数据分区

你提到已经有烧录工具,这里要注意必须把镜像写到SPL能找到的位置,两种烧录方式供你选:

  • U-boot命令行烧录
    1. 先把U-boot镜像加载到DRAM的临时地址(比如0x61000000,别和0x60000000冲突):比如用tftpboot 0x61000000 u-boot.bin或者load mmc 1:1 0x61000000 u-boot.bin(从SD卡加载)
    2. 写入到eMMC用户数据分区:mmc write 0x61000000 <用户分区起始扇区> <镜像占用扇区数>
      • 镜像占用扇区数计算:镜像字节数 ÷ 512,如果有余数就向上取整,比如镜像大小是1.2MB,就是1.2*1024*1024 /512 = 2458扇区
  • 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卡,重启开发板,盯着串口输出:

  1. 先看FSBL是否正常启动SPL
  2. 然后SPL会输出eMMC初始化、镜像加载的日志,确认加载地址是0x60000000
  3. 最后如果看到熟悉的U-boot命令行提示符(比如=>),就说明整个流程完全成功了!

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

火山引擎 最新活动