正点原子阿尔法开发板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=yCONFIG_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 = <ðphy0>;
phy-supply = <®_peri_3v3>;
status = "okay";
};
&fec2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet2
&pinctrl_enet2_reset>; // 添加了enet2复位引脚
phy-mode = "rmii";
phy-handle = <ðphy1>;
phy-supply = <®_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_defconfig为imx_alientek_emmc_defconfig,不需要修改内容。
🌴设备树文件移植
在同一目录复制arch/arm/boot/dts/nxp/imx/imx6ull-14x14-evk.dts为imx6ull-alientek-emmc.dts,入口文件
在同一目录复制arch/arm/boot/dts/nxp/imx/imx6ul-14x14-evk.dtsi为imx6ul-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 = <ðphy0>;
/* 复位引脚和延迟 */
phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
phy-supply = <®_peri_3v3>;
status = "okay";
};
&fec2 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_enet2
&pinctrl_enet2_reset>;
phy-mode = "rmii";
phy-handle = <ðphy1>;
/* 复位引脚和延迟 */
phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
phy-reset-duration = <200>;
phy-supply = <®_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博客

浙公网安备 33010602011771号