imx6ull开发板移植新版uboot、kernel和文件系统

Published on
156 24~31 min

在学习嵌入式Linux驱动之前需要把开发和测试环境给配置好,所以需要在开发板上移植一套系统。正点原子提供了imx6ull开发板的移植教程,不过其移植的版本是比较老,所以,本文参考了正点原子的移植教程,给出了较新版的uboot,kernel和文件系统的移植流程,该移植后的系统也将作为后面嵌入式驱动教程的构建和测试系统。

1 配置交叉编译器

ARM交叉编译器是移植的基础,它可以从Arm GNU Toolchain Downloads – Arm Developer这个网站下载下来。基于我们使用Linux操作系统构建imx6ull的软件,需选择arm-none-linux-gnueabihf这一类别的编译器使用,本文选择的是该编译器的14.2.Rel1版本。下载之后将压缩包解压到某个位置,然后修改/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 /etc/profile更新配置,这时执行arm-none-linux-gnueabihf-gcc -v看到下图所示内容即为配置成功。

crosscompiler.jpg

2 移植uboot-imx_v2024.04

从NXP官方维护的uboot-imx仓库中下载lf_v2024.04分支的源码并解压。首先需要配置的是设备树,没错,在较新版本的uboot中也使用设备树来配置硬件属性了。在源码的arch/arm/dts/文件夹下创建我们自己配置的设备树源文件imx6ull-myboard.dts,添加以下内容(根据分析imx6ul-14x14-evk.dtsi得到):

#include "imx6ull-14x14-evk-emmc.dts"    //包含原本imx6ull EVK开发板的设备树配置

/ {
	spi-4 {
		status = "disable";    //spi-4使用了网卡芯片的复位口,需要关闭
	};
};

&fec1 {
	status = "disable";    //只需要一个网卡,关闭
};

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

		ethphy0: ethernet-phy@2 {
			compatible = "ethernet-phy-id0022.1560";
			reg = <2>;
			micrel,led-mode = <1>;
			clocks = <&clks IMX6UL_CLK_ENET_REF>;
			clock-names = "rmii-ref";

		};

		ethphy1: ethernet-phy@1 {
			compatible = "ethernet-phy-id0022.1560";
			reg = <1>;
			micrel,led-mode = <1>;
			clocks = <&clks IMX6UL_CLK_ENET2_REF>;
			clock-names = "rmii-ref";
		};
	};
};

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

		display-timings {    //根据LCD屏参数设置
			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:

config1.jpg

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

config2.jpg

最后用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf-编译,得到u-boot-dtb.imx文件,将该文件烧写即可。

3 移植Linux-imx-6.12.y

从NXP官方维护的linux-imx仓库中下载lf-6.12.y分支的源码并解压。首先还是得配置设备树,但是这里不需要额外的工作了,上面用的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可以用来方便的构建文件,并且还可以方便的导入一些常用的库(ffmpeg等)。从官网下载最新稳定版的buildroot-2025.02,然后使用make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- menuconfig 对其进行配置即可。所需配置的项如下:

- Target options
  - Target Architecture --> ARM (little endian)
  - Target Architecture Variant --> cortex-A7

- Toolchain
  - Toolchain type --> External toolchain
  - Toolchain ---> Arm ARM 14.2.rel1
  - Toolchain origin --> Pre-installed toolchain
  - Toolchain path --> *编译器的路径,bin所在的文件夹*

- System configuration
  - System hostname --> *自行设置*
  - System banner --> *自行设置*
  - /dev management --> Dynamic using devtmpfs + mdev
  - Root password --> *自行设置*

- Target packages *可以自行添加各种库*

- Filesystem images
  - [*]ext2/3/4 root filesystem
    - ext2/3/4 variant --> ext4
  - exact size --> *自行设置,小就调大点*
  - [*]tar the root filesystem
    - Compression method --> bzip2

最后执行make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- 可以在buildroot的output/images文件夹下得到打包压缩好的rootfs.tar.bz2,即自己做的文件系统。

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


Next Post 嵌入式Linux驱动教程PART1-设备与驱动模型