目录

imx6ull开发板移植最新的uboot、内核和文件系统

发表于
1131 17.1~22.0 分钟

在学习嵌入式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 ~/.bashrcsource /etc/profile更新环境变量配置,这时执行arm-none-linux-gnueabihf-gcc -v看到下图所示内容即为配置成功。

1-1-bsuatguo.png

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 = <&ethphy1>;

	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:

1-2-vnuidida.png

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

1-3-gazrywtc.png

最后用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_defconfigmake 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- 进行构建了,不过这里可能会遇到两个主要的问题:

  1. LD_LIBRARY_PATH环境变量导致构建失败,需要通过unset LD_LIBRARY_PATH去掉。

  2. 在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
1-4-jhajvres.png

烧写完成后将拨码开关设置为eMMC启动模式,使用串口调试,可以看到uboot并没有成功启动内核,如上图所示,这是因为uboot环境变量不正确。这里需要将设备树和网卡的MAC地址进行正确的设置,如下图所示,修改uboot环境变量后,便能成功启动内核了。

1-5-rnbeezlm.png

最终这样我们就完整了一次较新版本的uboot、内核和文件系统的移植。

如果遇到什么问题,欢迎在下面讨论!😊

更新日志:
2026/8/30 更新内容至最新版本,添加烧写教程


0