正点原子阿尔法开发板imx6ull芯片移植u-boot (v2025.04)和linux kernel (v6.12.y)

🍌u-boot 移植

✂️前言

正点原子文档教程中的uboot移植,太老旧了,为了学习最新的技术,故进行最新u-boot的移植。而且网上很多教程说的太复杂了,其实很多步骤都不用做。下面是我试验后精简的配置过程。

⌨️开发环境

开发板:正点原子阿尔法开发板v2.4以后

系统环境:ubuntu24.04

u-boot版本:v2025.04,下载地址:https://github.com/nxp-imx/uboot-imx

交叉编译器:arm-linux-gnueabihf-  (版本v13.3)

🛠️移植步骤

移植操作是基于mx6ull_14x14_evk_emmc进行的,主要分为两大部分,一部分是文件的复制和简单修改,一部分是驱动的移植,其中文件复制修改部分可结合正点原子驱动开发指南《第三十三章 U-Boot移植 》食用,驱动的移植部分参考《第三十七章 Linux内核移植》

📃配置文件移植

复制路径configs/下的mx6ull_14x14_evk_emmc_defconfig一份命名为mx6ull_alientek_emmc_defconfig,然后修改字段

  • CONFIG_TARGET_MX6ULL_14X14_EVK=y改为CONFIG_TARGET_MX6ULL_ALIENTEK_EMMC=y
  • CONFIG_DEFAULT_DEVICE_TREE="imx6ull-14x14-evk-emmc"改为CONFIG_DEFAULT_DEVICE_TREE="imx6ull-alientek-emmc"

🦊头文件移植

include/configs路径下的mx6ullevk.h复制一份重命名为mx6ull_alientek_emmc.h,然后

将开头的
#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H
修改为
#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H
#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H

📁板级文件夹移植

将文件夹board/freescale/mx6ullevk复制一份为board/freescale/mx6ull_alientek_emmc,将mx6ullevk.c重命名为mx6ull_alientek_emmc.c,然后修改相关文件

1. c文件

可以不修改

2. Makefile

目标修改为对应的名字:obj-y  := mx6ull_alientek_emmc.o

3. MAINTAINERS

好像只是一些版本修改说明,可以不修改?修改后的如下:

MX6ULLEVK BOARD
M:	Peng Fan <peng.fan@nxp.com>
S:	Maintained
F:	board/freescale/mx6ull_alientek_emmc/
F:	include/configs/mx6ull_alientek_emmc.h
F:	configs/mx6ull_alientek_emmc_defconfig
F:	configs/mx6ull_14x14_evk_plugin_defconfig
F:	configs/mx6ulz_14x14_evk_defconfig

4. Kconfig

同样替换为自己的目录或者文件名

if TARGET_MX6ULL_ALIENTEK_EMMC || TARGET_MX6ULL_9X9_EVK

config SYS_BOARD
	default "mx6ull_alientek_emmc"

config SYS_VENDOR
	default "freescale"

config SYS_CONFIG_NAME
	default "mx6ull_alientek_emmc"

config IMX_CONFIG
	default "board/freescale/mx6ull_alientek_emmc/imximage.cfg"

config TEXT_BASE
	default 0x87800000
endif

5. imximage.cfg和imximage_lpddr2.cfg

都是将下面这个路径替换成自己移植的新的目录,修改后的

PLUGIN  board/freescale/mx6ull_alientek_emmc/plugin.bin 0x00907000

📊图形界面配置文件

找到文件:arch/arm/mach-imx/mx6/Kconfig,复制一份TARGET_MX6ULL_14X14_EVK的配置,修改成如下样子,其实就修改了前两行,注意TARGET_MX6ULL_ALIENTEK_EMMC不要写错,要与刚才deconfig中的一致

config TARGET_MX6ULL_ALIENTEK_EMMC
	bool "Support mx6ull_alientek_emmc"
	depends on MX6ULL
	select BOARD_LATE_INIT
	select DM
	select DM_THERMAL
	select IOMUX_LPSR
	select IMX_MODULE_FUSE
	select OF_SYSTEM_SETUP
	imply CMD_DM

然后后面加上

source "board/freescale/mx6ull_alientek_emmc/Kconfig"

🌳设备树移植

在设备树路径arch/arm/dts/下进行如下文件复制和修改操作(不局限于一种实现方式)

  • imx6ull-14x14-evk.dts改为imx6ull-alientek-emmc.dts,相当于一个入口文件,将#include "imx6ul-14x14-evk.dtsi"改为下面这个文件,也就是#include "imx6ul-alientek-emmc.dtsi"
  • imx6ul-14x14-evk.dtsi改为imx6ul-alientek-emmc.dtsi,基本大部分的设备树配置都在这里面
  • imx6ull-14x14-evk-emmc-u-boot.dtsi改为imx6ull-alientek-emmc-u-boot.dtsi,重要,一定要复制一份,名且名字要对应到的defconfig下的CONFIG_DEFAULT_DEVICE_TREE字段,因为这个文件是编译器自己查找自己引用的,并没有显式的引用,如果不加这个会导致u-boot启动的时候不显示版本、CPU和内存等头部信息。详细见:正点原子移植最新u-boot(v2025.04)启动不显示CPU等板子banner信息的解决方法

🛻驱动设置

1. 显示屏驱动设置

打开imx6ul-alientek-emmc.dtsi,找到&lcdif节点,按照正点原子驱动开发指南中,LCD屏幕相关的章节设置好参数即可,可参考《第五十九章 Linux LCD驱动实验》

我的屏幕是4.3寸,800*480分辨率的,配置如下

&lcdif {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_lcdif_dat
		     &pinctrl_lcdif_ctrl>;
	display = <&display0>;
	status = "okay";

	display0: display@0 {
		bits-per-pixel = <16>;
		bus-width = <24>;

		display-timings {
			native-mode = <&timing0>;

			timing0: timing0 {
				clock-frequency = <31000000>;
				hactive = <800>;
				vactive = <480>;
				hfront-porch = <40>;
				hback-porch = <88>;
				hsync-len = <48>;
				vback-porch = <32>;
				vfront-porch = <13>;
				vsync-len = <3>;
				hsync-active = <0>;
				vsync-active = <0>;
				de-active = <1>;
				pixelclk-active = <0>;
			};
		};
	};
};

2. 网络驱动配置

类比正点原子驱动开发指南中,linux内核移植章节的《37.4.4 V2.4及以后版本底板网络驱动修改》进行修改,详细的原理可参考本节。

同样打开imx6ul-alientek-emmc.dtsi文件

2.1 复位以及网络时钟引脚

找到如下代码,下面是修改后的代码,我是直接注释掉了,也可以直接删除。

pinctrl_spi4: spi4grp {
	fsl,pins = <
		MX6UL_PAD_BOOT_MODE0__GPIO5_IO10	0x70a1
		MX6UL_PAD_BOOT_MODE1__GPIO5_IO11	0x70a1
		/* 移植网络驱动,需要禁用这两个 */
		/* MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07	0x70a1 */
		/* MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08	0x80000000 */
	>;
};

在这个节点后面添加下面的两个新节点

/* 网络驱动1 */
pinctrl_enet1_reset: enet1resetgrp {
	fsl,pins = <
		MX6UL_PAD_SNVS_TAMPER7__GPIO5_IO07		0x10B0
	>;
};
/* 网络驱动2 */
pinctrl_enet2_reset: enet2resetgrp {
	fsl,pins = <
		MX6UL_PAD_SNVS_TAMPER8__GPIO5_IO08		0x10B0
	>;
};

找到如下代码,把用到GPIO5_7和GPIO5_8相应的部分注释掉,一共两个地方,下面代码同样也是修改后的

spi-4 {
	compatible = "spi-gpio";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_spi4>;
	status = "okay";
	gpio-sck = <&gpio5 11 0>;
	gpio-mosi = <&gpio5 10 0>;
	/* 网络驱动移植注释掉 */
	/* cs-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>; */
	num-chipselects = <1>;
	#address-cells = <1>;
	#size-cells = <0>;

	gpio_spi: gpio@0 {
		compatible = "fairchild,74hc595";
		gpio-controller;
		#gpio-cells = <2>;
		reg = <0>;
		registers-number = <1>;
		registers-default = /bits/ 8 <0x57>;
		spi-max-frequency = <100000>;
		/* 网络驱动移植注释掉 */
		/* enable-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>; */
	};
};

 2.2 修改 fec1和 fec2节点,修改之后的代码如下,pinctrl-0属性添加了reset引脚

&fec1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet1
				 &pinctrl_enet1_reset>;	// 添加了enet1复位引脚
	phy-mode = "rmii";
	phy-handle = <&ethphy0>;
	phy-supply = <&reg_peri_3v3>;
	status = "okay";
};

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2
				 &pinctrl_enet2_reset>;	// 添加了enet2复位引脚
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	phy-supply = <&reg_peri_3v3>;
	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";
		};
	};
};

修改完启动可能会报错MAC地址没设置,按要求设置即可。下面是我的设置模板

setenv ipaddr 192.168.3.120		    # 主机IP
setenv eth1addr b8:ae:1d:01:00:00	# 最新版uboot的,这里是eth1addr,多了个1
setenv gatewayip 192.168.3.1		# 网关
setenv netmask 255.255.255.0		# 一般就是这个
setenv serverip 192.168.3.125		# 服务器,也就是网络启动linux的ip
setenv dnsip 192.168.3.1			# 对应好

修改完这些就可以愉快的从网络启动Linux内核了!😀😀😀

✅结语

由于比较精简,仅仅是能运行起来了,实际有些不足的地方,后续需要再研究。比如看有的会需要校准DDR等,修改板级文件夹的C文件等。

🗂️引用参考

正点原子imx6ull开发板移植新版本U-boot(uboot2022.04,有设备树)_imx6ull移植最新uboot-CSDN博客

IMX6ULL2025年最新部署方案:最新的UBootLinux和Rootfs部署正点原子Alpha开发板指南_uboot移植 2025-CSDN博客

正点原子IMX6ULL-ALPHA开发板移植uboot2023.04_imx6ull移植最新u-boot-CSDN博客

🍌Linux Kernel 移植

🗣️前言

这个移植可以大部分参考正点原子驱动开发指南的《第三十七章 Linux内核移植》

🪚开发环境

linux kernel版本:6.12.y(y的意思是不确定),下载地址:https://github.com/nxp-imx/linux-imx

其他与u-boot一样

🛫移植步骤

linux kernel移植相对u-boot移植来说要简单一些

📃配置文件移植

在同一目录中复制arch/arm/configs/imx_v7_defconfigimx_alientek_emmc_defconfig,不需要修改内容。

🌴设备树文件移植

在同一目录复制arch/arm/boot/dts/nxp/imx/imx6ull-14x14-evk.dtsimx6ull-alientek-emmc.dts,入口文件

在同一目录复制arch/arm/boot/dts/nxp/imx/imx6ul-14x14-evk.dtsiimx6ul-alientek.dtsi,主要的设备树内容都在这里

并将imx6ull-alientek-emmc.dts#include "imx6ul-14x14-evk.dtsi"改为#include "imx6ul-alientek.dtsi"

与u-boot移植类似,将arch/arm/boot/dts/nxp/imx/imx6ull-14x14-evk-emmc.dts&usdhc2节点内容复制到imx6ull-alientek-emmc.dts

⚙️驱动移植

1. 显示屏驱动设置

跟u-boot完全相同

2. 网络驱动设置

跟u-boot基本相同,唯一的不同点是在fec1和fec2节点加了两个复位引脚和延迟以及smsc,disable-energy-detect;厂商的识别标志,具体可参考正点原子驱动开发指南。

&fec1 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet1
				 &pinctrl_enet1_reset>;
	phy-mode = "rmii";
	phy-handle = <&ethphy0>;
	/* 复位引脚和延迟 */
	phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <200>;

	phy-supply = <&reg_peri_3v3>;
	status = "okay";
};

&fec2 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_enet2
				 &pinctrl_enet2_reset>;
	phy-mode = "rmii";
	phy-handle = <&ethphy1>;
	/* 复位引脚和延迟 */
	phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
	phy-reset-duration = <200>;

	phy-supply = <&reg_peri_3v3>;
	status = "okay";

	mdio {
		#address-cells = <1>;
		#size-cells = <0>;

		ethphy0: ethernet-phy@2 {
			compatible = "ethernet-phy-id0022.1560";
			smsc,disable-energy-detect;
			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";
			smsc,disable-energy-detect;
			reg = <1>;
			micrel,led-mode = <1>;
			clocks = <&clks IMX6UL_CLK_ENET2_REF>;
			clock-names = "rmii-ref";
		};
	};
};

我没有修改源码文件,进入根文件系统测试后,网络是正常的。

✅结语

同u-boot,也是移植的比较精简

🗂️引用参考

Linux移植5.4版本内核:正点原子阿尔法IMX6ULL开发板Linux内核源码移植详细步骤(5.4版本内核)_imx6使用linux5.4内核-CSDN博客

posted @ 2025-12-20 19:41  绿树荫下跑猫猫  阅读(38)  评论(0)    收藏  举报