imx6ull开发板移植最新的uboot、内核和文件系统
在学习嵌入式ARM Linux驱动之前需要将开发和测试环境给配置好,所以需要在开发板上移植一套系统。正点原子提供了imx6ull开发板的系统移植教程,不过其移植的系统的版本比较老。本着折腾到底的目的,本文参考了正点原子的系统移植教程,给出了较新版本的uboot,内核和文件系统的移植流程,该移植后的系统也将作为后面嵌入式驱动教程的测试系统。
1 配置交叉编译器
ARM交叉编译器是移植的基础,它可以从Arm GNU Toolchain Downloads – Arm Developer这个网站下载下来。基于我们使用x86 Linux操作系统主机构建imx6ull目标机的软件,需选择arm-none-linux-gnueabihf这一类别的编译器使用,本文选择的是该编译器的15.3.Rel1版本。下载之后将压缩包解压到某个位置,然后修改~/.bashrc或/etc/profile文件的内容,在末尾加上以下两行:
export PATH=$PATH:/usr/local/arm/arm-none-linux-gnueabihf/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/arm/arm-none-linux-gnueabihf/lib你只需要更改上述路径(/usr/local/arm/arm-none-linux-gnueabihf)为你自己的解压路径。修改完成后执行source ~/.bashrc或source /etc/profile更新环境变量配置,这时执行arm-none-linux-gnueabihf-gcc -v看到下图所示内容即为配置成功。

2 移植uboot-imx v2026.04
从NXP官方维护的uboot-imx仓库中下载lf_v2026.04分支或lf-6.18.20-2.0.0标签(推荐)的源码并解压。首先需要配置的是设备树,没错,在较新版本的uboot中也使用设备树来配置硬件属性了。在源码的arch/arm/dts/文件夹下创建我们自己的设备树源文件imx6ull-myboard.dts,添加以下内容(根据分析imx6ul-14x14-evk.dtsi得到):
#include "imx6ull-14x14-evk-emmc.dts" // 包含原本imx6ull EVK开发板的设备树配置
/ {
spi-4 {
status = "disabled"; // spi-4使用了网卡芯片的复位口,需要关闭
};
};
&fec1 {
status = "disabled";
};
&fec2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet2>;
phy-mode = "rmii";
phy-handle = <ðphy1>;
phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
phy-reset-post-delay = <200>;
status = "okay";
mdio {
#address-cells = <1>;
#size-cells = <0>;
ethphy1: ethernet-phy@1 {
reg = <1>;
};
};
};
&lcdif {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_lcdif_dat
&pinctrl_lcdif_ctrl>;
display = <&display0>;
status = "okay";
display0: display@0 {
bits-per-pixel = <24>;
bus-width = <24>;
// 根据LCD屏参数设置
display-timings {
native-mode = <&timing0>;
timing0: timing0 {
clock-frequency = <51200000>;
hactive = <1024>;
vactive = <600>;
hfront-porch = <160>;
hback-porch = <140>;
hsync-len = <20>;
vback-porch = <20>;
vfront-porch = <12>;
vsync-len = <3>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <1>;
pixelclk-active = <0>;
};
};
};
};
接着,还需要将该源文件imx6ull-myboard.dts添加到arch/arm/dts/Makefile中对应的设备树编译列表上:
...
dtb-$(CONFIG_MX6ULL) += \
imx6ull-14x14-evk.dtb \
imx6ull-14x14-evk-emmc.dtb \
imx6ull-14x14-evk-gpmi-weim.dtb \
imx6ull-9x9-evk.dtb \
imx6ull-colibri-emmc-eval-v3.dtb \
imx6ull-colibri-eval-v3.dtb \
imx6ull-myir-mys-6ulx-eval.dtb \
imx6ull-seeed-npi-imx6ull-dev-board.dtb \
imx6ull-phytec-segin-ff-rdk-emmc.dtb \
imx6ull-dart-6ul.dtb \
imx6ull-somlabs-visionsom.dtb \
imx6ulz-bsh-smm-m2.dtb \
imx6ulz-14x14-evk.dtb \
imx6ulz-14x14-evk-emmc.dtb \
imx6ulz-14x14-evk-gpmi-weim.dtb \ # 不要忘了反斜杠
imx6ull-myboard.dtb # 添加,是dtb不是dts!
...下一步对配置文件进行修改。首先用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig将官方默认的配置导入到当前配置。然后用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig对配置进行修改,首先修改默认设备树(Device Tree Control->)为imx6ull-myboard:

然后修改网卡驱动支持(Device Drivers->Ethernet PHY (physical media interface) support->),去掉Micrel Ethernet PHYs support并勾选Realtek Ethernet PHYs support。

最后用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-编译,得到u-boot-dtb.imx文件。
3 移植linux-imx-6.18.20
从NXP官方维护的linux-imx仓库中下载lf-6.18.y分支或lf-6.18.20-2.0.0标签(推荐)的源码并解压。首先还是得配置设备树,但是这里不需要额外的工作了,上面的imx6ull-myboard.dts仍然可用,只是文件位置有变化,内核的相关设备树源文件在arch/arm/boot/dts/nxp/imx文件夹下,将imx6ull-myboard.dts放进该文件夹并修改该文件夹下的Makefile文件即可:
...
dtb-$(CONFIG_SOC_IMX6UL) += \
imx6ul-14x14-evk.dtb \
imx6ul-14x14-evk-csi.dtb \
imx6ul-14x14-evk-emmc.dtb \
imx6ul-14x14-evk-btwifi.dtb \
imx6ul-14x14-evk-ecspi-slave.dtb \
imx6ul-14x14-evk-ecspi.dtb \
imx6ul-14x14-evk-gpmi-weim.dtb \
imx6ul-9x9-evk.dtb \
imx6ul-9x9-evk-ldo.dtb \
imx6ul-9x9-evk-btwifi.dtb \
imx6ul-ccimx6ulsbcexpress.dtb \
imx6ul-ccimx6ulsbcpro.dtb \
imx6ul-geam.dtb \
imx6ul-isiot-emmc.dtb \
imx6ul-isiot-nand.dtb \
imx6ul-kontron-bl.dtb \
imx6ul-kontron-bl-43.dtb \
imx6ul-liteboard.dtb \
imx6ul-tqma6ul1-mba6ulx.dtb \
imx6ul-tqma6ul2-mba6ulx.dtb \
imx6ul-tqma6ul2l-mba6ulx.dtb \
imx6ul-opos6uldev.dtb \
imx6ul-pico-dwarf.dtb \
imx6ul-pico-hobbit.dtb \
imx6ul-pico-pi.dtb \
imx6ul-phytec-segin-ff-rdk-emmc.dtb \
imx6ul-phytec-segin-ff-rdk-nand.dtb \
imx6ul-prti6g.dtb \
imx6ul-tx6ul-0010.dtb \
imx6ul-tx6ul-0011.dtb \
imx6ul-tx6ul-mainboard.dtb \
imx6ull-14x14-evk.dtb \
imx6ull-14x14-evk-emmc.dtb \
imx6ull-14x14-evk-btwifi.dtb \
imx6ull-14x14-evk-gpmi-weim.dtb \
imx6ull-9x9-evk.dtb \
imx6ull-9x9-evk-ldo.dtb \
imx6ull-9x9-evk-btwifi.dtb \
imx6ull-colibri-aster.dtb \
imx6ull-colibri-emmc-aster.dtb \
imx6ull-colibri-emmc-eval-v3.dtb \
imx6ull-colibri-emmc-iris.dtb \
imx6ull-colibri-emmc-iris-v2.dtb \
imx6ull-colibri-eval-v3.dtb \
imx6ull-colibri-iris.dtb \
imx6ull-colibri-iris-v2.dtb \
imx6ull-colibri-wifi-aster.dtb \
imx6ull-colibri-wifi-eval-v3.dtb \
imx6ull-colibri-wifi-iris.dtb \
imx6ull-colibri-wifi-iris-v2.dtb \
imx6ull-dhcom-drc02.dtb \
imx6ull-dhcom-pdk2.dtb \
imx6ull-dhcom-picoitx.dtb \
imx6ull-dhcor-maveo-box.dtb \
imx6ull-jozacp.dtb \
imx6ull-kontron-bl.dtb \
imx6ull-myir-mys-6ulx-eval.dtb \
imx6ull-opos6uldev.dtb \
imx6ull-phytec-segin-ff-rdk-nand.dtb \
imx6ull-phytec-segin-ff-rdk-emmc.dtb \
imx6ull-phytec-segin-lc-rdk-nand.dtb \
imx6ull-phytec-tauri-emmc.dtb \
imx6ull-phytec-tauri-nand.dtb \
imx6ull-seeed-npi-dev-board-emmc.dtb \
imx6ull-seeed-npi-dev-board-nand.dtb \
imx6ull-tarragon-master.dtb \
imx6ull-tarragon-micro.dtb \
imx6ull-tarragon-slave.dtb \
imx6ull-tarragon-slavext.dtb \
imx6ull-tqma6ull2-mba6ulx.dtb \
imx6ull-tqma6ull2l-mba6ulx.dtb \
imx6ull-uti260b.dtb \
imx6ulz-14x14-evk.dtb \
imx6ulz-14x14-evk-btwifi.dtb \
imx6ulz-14x14-evk-emmc.dtb \
imx6ulz-14x14-evk-gpmi-weim.dtb \
imx6ulz-bsh-smm-m2.dtb \
imx6ull-myboard.dtb
...然后对于配置文件也不需要进行修改,直接导入默认官方配置。执行make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- imx_v7_defconfig和make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-,最终得到Zimage和imx6ull-myboard.dtb文件。在启动该内核的时候,你也许会看到许多提示报错,这是因为主要用的还是官方的设备树文件,其中有一些并不适配正点原子的开发板,但是这并不影响使用,在经过学习后正确的配置设备树文件,这些报错也将会不见,如果实在觉得烦,可以把对应的设备驱动在配置中先取消掉。
4 使用Buildroot构建文件系统并制作镜像
这里使用Buildroot来构建文件系统并制作完整镜像。从Buildroot官网上下载最新稳定版的buildroot-2026.05.2源码并解压,然后使用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig 对其进行配置。所需配置的项在下面列出:
- Target options
- Target Architecture --> ARM (little endian)
- Target Architecture Variant --> cortex-A7
- Floating point strategy --> NEON/VFPv4
- Toolchain
- Toolchain type --> External toolchain *也可以使用Buildroot上提供的工具链*
- Toolchain --> Custom toolchain
- Toolchain origin --> Pre-installed toolchain
- Toolchain path --> /usr/local/arm/arm-none-linux-gnueabihf *编译器路径,根据实际位置填写*
- Toolchain prefix --> $(ARCH)-none-linux-gnueabihf
- External toolchain gcc version --> 15.x
- External toolchain kernel headers series --> 6.6.x *对应/usr/local/arm/arm-none-linux-gnueabihf/arm-none-linux-gnueabihf/libc/usr/include/linux/version.h文件里的版本号*
**这一部分不同工具链可能存在不同,可全留空并在构建时检查**
- [*] Toolchain has SSP support?
- [*] Toolchain has SSP strong support?
- [*] Toolchain has C++ support?
- [*] Toolchain has Fortran support?
- [*] Toolchain has OpenMP support?
**这一部分不同工具链可能存在不同,可全留空并在构建时检查**
- [*]Copy gdb server to the Target *将gdb server复制到目标上,方便host调试*
- System configuration
- System hostname --> *自行设置*
- System banner --> *自行设置*
- /dev management --> Dynamic using devtmpfs + mdev
- [*]Merged /usr
- [*]Merged /usr/bin
- Root password --> *自行设置*
- Network interface to configure through DHCP --> eth1 *前面配置启用的是eth1网口*
- Custom scripts to run after creating filesystem images --> board/myboard/post-image.sh *用于制作完整镜像*
- Target packages *可以自行添加各种包*
- Filesystem images
- [*]ext2/3/4 root filesystem
- ext2/3/4 variant --> ext4
- exact size --> *自行设置,小了就相应调大点*
- Host utilities *制作完整镜像的相关依赖*
- [*] host dosfstools
- [*] host genimage
- [*] host mtools接下来还需要添加上面填写的board/myboard/post-image.sh文件以及其所需要的board/myboard/genimage.cfg文件,参考borad/freescale/common文件夹下的genimage.cfg.template和post-image.sh文件,内容如下:
# SD/eMMC image
#
# layout:
#
# 0x00400000 FAT boot partition
# ├── zImage
# └── imx6ull-myboard.dtb
#
# following EXT4 rootfs partition rootfs.ext4
image boot.vfat {
vfat {
label = "boot"
files = {
"zImage",
"imx6ull-myboard.dtb"
}
}
size = 40M
}
image emmc.img {
hdimage {
partition-table-type = "mbr"
}
partition boot {
partition-type = 0x0C
offset = 4M
size = 40M
image = "boot.vfat"
}
partition rootfs {
partition-type = 0x83
offset = 44M
image = "rootfs.ext4"
}
}#!/usr/bin/env bash
# post-image.sh
set -e
# 自行设置对应路径(需要绝对路径)
EXTERNAL_LINUX_DIR="/path/to/your/linux"
# 拷贝到 Buildroot 的 output/images
cp "${EXTERNAL_LINUX_DIR}/arch/arm/boot/zImage" \
"${BINARIES_DIR}/"
cp "${EXTERNAL_LINUX_DIR}/arch/arm/boot/dts/nxp/imx/imx6ull-myboard.dtb" \
"${BINARIES_DIR}/"
GENIMAGE_TMP="${BUILD_DIR}/genimage.tmp"
# 生成完成镜像
genimage \
--rootpath "${TARGET_DIR}" \
--tmppath "${GENIMAGE_TMP}" \
--inputpath "${BINARIES_DIR}" \
--outputpath "${BINARIES_DIR}" \
--config "board/myboard/genimage.cfg"
可以看到,genimage.cfg中描述了uboot、kernel和文件系统在SD/eMMC存储中的布局,启动分区设置为kernel和其设备树所在的分区。post-image.sh脚本则使用genimage命令根据genimage.cfg生成完整的系统镜像。
接下来就可以执行make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- 进行构建了,不过这里可能会遇到两个主要的问题:
LD_LIBRARY_PATH环境变量导致构建失败,需要通过unset LD_LIBRARY_PATH去掉。在WSL中编译需要将
PATH环境变量设置为/usr/local/arm/arm-none-linux-gnueabihf/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin,不然原有PATH的windows路径空格会导致构建失败。
最终,就可以在output/images文件下得到emmc.img文件,即为镜像。
5 烧写
正点原子教程里使用mfgtools2烧写uboot、kernel和文件系统,这里给出使用uuu(mfgtool3)的烧写方式。从mfgtools仓库上下载uuu.exe并将其与u-boot-dtb.imx和emmc.image文件放在同一目录下。执行.\uuu.exe -lsusb 查看是否与板子成功连接(需要将拨码开关设置为USB串行下载模式),然后先执行.\uuu.exe -b emmc u-boot-dtb.imx 烧写uboot,再执行.\uuu.exe -b emmc_all u-boot-dtb.imx emmc.img烧写镜像:
.\uuu.exe -lsusb
uuu (Universal Update Utility) for nxp imx chips -- libuuu_1.5.243-0-g230f1b1
Connected Known USB Devices
Path Chip Pro Vid Pid BcdVersion Serial_no
====================================================================
4:9 MX6ULL SDP: 0x15A2 0x0080 0x0001
.\uuu.exe -b emmc u-boot-dtb.imx
uuu (Universal Update Utility) for nxp imx chips -- libuuu_1.5.243-0-g230f1b1
Success 1 Failure 0
4:9- 1/ 1 [=================100%=================] SDP: boot -f u-boot-dtb.imx
4:9-5D51D9E7 7/ 7 [Done ] FB: Done
.\uuu.exe -b emmc_all u-boot-dtb.imx emmc.img
烧写完成后将拨码开关设置为eMMC启动模式,使用串口调试,可以看到uboot并没有成功启动内核,如上图所示,这是因为uboot环境变量不正确。这里需要将设备树和网卡的MAC地址进行正确的设置,如下图所示,修改uboot环境变量后,便能成功启动内核了。

最终这样我们就完整了一次较新版本的uboot、内核和文件系统的移植。
如果遇到什么问题,欢迎在下面讨论!😊
更新日志:
2026/8/30 更新内容至最新版本,添加烧写教程
0