You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为i.MX6自定义开发板编译U-Boot SPL的问题与解决

i.MX6自定义板U-Boot SPL疑问解答与实战经验

刚搞定同款i.MX6自定义板的SPL编译和SD卡镜像制作,刚好能解答你的问题,分享下我的实战经验~

一、先搞懂SYS_TEXT_BASE和SPL_TEXT_BASE

你的理解基本是对的,再给你补全细节:

  • SPL_TEXT_BASE:确实是SPL在内部IRAM的驻留执行地址,i.MX6的IRAM起始地址就是0x0907000,而IRAM总大小68KB,刚好能放下精简后的SPL(负责初始化DDR、串口等基础外设)。
  • SYS_TEXT_BASE:是主U-Boot在外部DDR3的运行地址,i.MX6的DDR默认映射到0x80000000起始的区域,你设的0x87800000是合理的,只要避开内核、设备树等后续加载的地址区间就行。

另外你的defconfig里重复写了CONFIG_SPL=y,可以删掉其中一行,不影响编译但更整洁。

二、如何编译出独立的SPL二进制文件

你之前只得到u-boot.bin是因为编译流程没正确触发SPL生成,正确步骤应该是这样:

  1. 彻底清理之前的编译产物:make mrproper
  2. 加载你的自定义板配置:如果你的defconfig文件名是eval1a_defconfig(对应CONFIG_TARGET_EVAL1A=y),就执行make eval1a_defconfig;如果是自定义命名的myBoard_defconfig,就用make myBoard_defconfig
  3. 执行编译:make

编译完成后,你会在spl/目录下找到独立的u-boot-spl.bin,同时在根目录会生成u-boot.imx——这个是整合了SPL和主U-Boot的镜像,包含i.MX6启动所需的头部信息,直接烧录到SD卡就能用。

三、分享适配i.MX6的SD卡镜像生成脚本

自己编译完U-Boot、内核、rootfs后,手动分区烧录太麻烦,我写了个脚本一键生成可直接烧录的SD卡镜像,分享给大家(无担保,风险自负):

#!/bin/bash
# Copyright: C. Hediger, 2019
# provided without warranty. use it at your own risk!
echo "-------------------------------------------"
echo "-------- SD-Card image generator ----------"
echo "-------------------------------------------"
echo ""
read -p 'Size for *.img [MB] default 512MByte: ' imagesize
if [ -z "$imagesize" ]
then
imagesize="512"
fi
read -p 'Path to Image default /home/<user>/Desktop/sdcard/sdimage.img: ' imagepath
if [ -z "$imagepath" ]
then
imagepath="/home/"$USER"/Desktop/sdcard/sdimage.img"
fi
read -p 'Path to u-boot default /home/<user>/Desktop/sdcard/u-boot.imx: ' ubootpath
if [ -z "$ubootpath" ]
then
ubootpath="/home/"$USER"/Desktop/sdcard/u-boot.imx"
fi
read -p 'Path to rootfs default /home/<user>/Desktop/sdcard/rootfs.tar.gz: ' rootfspath
if [ -z "$rootfspath" ]
then
rootfspath="/home/"$USER"/Desktop/sdcard/rootfs.tar.gz"
fi
read -p 'Strip output directory? Default 1: ' stripcount
if [ -z "$stripcount" ]
then
stripcount="1"
fi
read -p 'Path to kernel default /home/<user>/Desktop/sdcard/zImage: ' kernelpath
if [ -z "$kernelpath" ]
then
kernelpath="/home/"$USER"/Desktop/sdcard/zImage"
fi
read -p 'Path to *.dtb default /home/<user>/Desktop/sdcard/eval1a.dtb: ' dtbpath
if [ -z "$dtbpath" ]
then
dtbpath="/home/"$USER"/Desktop/sdcard/eval1a.dtb"
fi
ddimagesize=$((imagesize * 2))k
partitionsize=+$((imagesize - 20))M

dd status=progress if=/dev/zero of=$imagepath bs=512 count=$ddimagesize
(
echo o # Create a new empty DOS partition table
echo p # Add a new partition
echo x # expert mode
echo h # Partition number
echo 255
echo s
echo 63
echo c

echo r
echo n
echo p
echo 1
echo 4096
echo $partitionsize
echo p
echo w
) | fdisk $imagepath
dd bs=512 seek=2 conv=notrunc if=$ubootpath of=$imagepath
loodevice="$(sudo losetup --partscan --show --find $imagepath)"
loopartition="$loodevice"p1
mountfolder=/mnt/sdcardtmpfolder
echo "Device: "$loodevice
echo "Partition: "$loopartition
sudo mkfs.ext2 $loopartition
sudo mkdir -p $mountfolder
sudo mount $loopartition $mountfolder
sudo cp $rootfspath "$mountfolder"/rootfs.tar.gz
sudo tar xzf "$mountfolder"/rootfs.tar.gz -C $mountfolder --strip-components=$stripcount
sudo cp $kernelpath "$mountfolder"/boot/zImage
sudo cp $dtbpath "$mountfolder"/boot/imx6ull-dtb-eval1a.dtb
sudo rm "$mountfolder"/rootfs.tar.gz
echo " ----- Please extract rootfs -----"
read
sudo umount /mnt/sdcardtmpfolder
sudo fsck.ext4 $loopartition
sudo losetup -d $loodevice
sudo rm -R /mnt/sdcardtmpfolder
sudo gparted $imagepath

脚本使用提示:

  • 运行前确保安装了fdisk、losetup、gparted、tar等工具
  • 按照提示输入参数即可,默认路径会自动填充当前用户Desktop下的sdcard文件夹
  • 脚本会自动完成:创建空镜像、分区、烧录U-Boot、挂载分区、复制内核/设备树、解压rootfs,最后用gparted检查分区(可选)

内容的提问来源于stack exchange,提问作者C. Hediger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:36:13