为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生成,正确步骤应该是这样:
- 彻底清理之前的编译产物:
make mrproper - 加载你的自定义板配置:如果你的defconfig文件名是
eval1a_defconfig(对应CONFIG_TARGET_EVAL1A=y),就执行make eval1a_defconfig;如果是自定义命名的myBoard_defconfig,就用make myBoard_defconfig - 执行编译:
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
相关产品推荐
相关产品推荐

