前期工作

移植教程开始前须下载NXP官方源码并解压,解压完成后用vscode打开源码目录,up主使用的板子是正点原子IMX6ULL MINI v2.2开发板,文件命名随意即可,不一定跟up主一样

一、/configs/mx6ull_alientek_emmc_defconfig

1、先在 configs 目录下创建默认配置文件,复制 mx6ull_14x14_evk_emmc_defconfig,然后重

命名为 mx6ull_alientek_emmc_defconfig

文件路径:/configs/mx6ull_alientek_emmc_defconfig

mx6ull_alientek_emmc_defconfig文件修改内容如下:

CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ull_alientek_emmc/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_ALIENTEK_EMMC=y
CONFIG_CMD_GPIO=y

二、/include/configs/mx6ull_alientek_emmc.h

2、在 目 录 include/configs 下 添 加 I.MX6ULL-MINI 开 发 板 对 应 的 头 文 件 , 复 制

include/configs/mx6ullevk.h,并重命名为 mx6ull_alientek_emmc.h

文件路径:/include/configs/mx6ull_alientek_emmc.h

修改内容:

找到mx6ull_alientek_emmc.h的第8第9行,如下图

#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H

修改后

#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H
#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H

三、board/freescale/mx6ull_alientec_emmc

3、在board/freescale 目录下有个名为 mx6ullevk 的文件夹,复制 mx6ullevk,将其重命名为 mx6ull_alientek_emmc

使用命令:cp mx6ullevk/ -r mx6ull_alientek_emmc

文件夹路径:board/freescale/mx6ull_alientec_emmc

mx6ull_alientec_emmc文件夹下需要修改的文件: mx6ullevk.c ------>mx6ull_alientek_emmc.c、Makefile、imximage.cfg、Kconfig、MAINTAINERS

修改内容:

1、Makefile文件
# (C) Copyright 2015 Freescale Semiconductor, Inc.
#
# SPDX-License-Identifier:	GPL-2.0+
#

obj-y  := mx6ull_alientek_emmc.o

extra-$(CONFIG_USE_PLUGIN) :=  plugin.bin
$(obj)/plugin.bin: $(obj)/plugin.o
	$(OBJCOPY) -O binary --gap-fill 0xff $< $@
2、imximage.cfg文件

修改imximage.cfg的34行

修改前

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

修改后

PLUGIN	board/freescale/mx6ull_alientek_emmc/plugin.bin 0x00907000
3、Kconfig文件

修改成以下内容

if TARGET_MX6ULL_ALIENTEK_EMMC

config SYS_BOARD
	default "mx6ull_alientek_emmc"

config SYS_VENDOR
	default "freescale"

config SYS_CONFIG_NAME
	default "mx6ull_alientek_emmc"

endif
4、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

四、arch/arm/cpu/armv7/mx6/Kconfig

4、修改 U-Boot 图形界面配置文件

文件路径:arch/arm/cpu/armv7/mx6/Kconfig

修改内容:

看到Kconfig的201行复制TARGET_MX6ULL_9X9_EVK的这一小段,粘贴到下面,模仿其修改成对应的代码

config TARGET_MX6ULL_9X9_EVK
	bool "Support mx6ull_9x9_evk"
	select MX6ULL
	select DM
	select DM_THERMAL

config TARGET_MX6ULL_ALIENTEK_EMMC
	bool "Support mx6ull_alientek_emmc"
	select MX6ULL
	select DM
	select DM_THERMAL

在文件末尾添加以下内容

source "board/freescale/mx6ull_alientek_emmc/Kconfig"

五、LCD驱动修改

打开如 mx6ull_alientek_emmc.h 和 mx6ull_alientek_emmc.c 这两个文件

文件路径:

/board/freescale/mx6ull_alientec_emmc/mx6ull_alientek_emmc.c

/include/configs/mx6ull_alientek_emmc.h

mx6ull_alientek_emmc.c

打开mx6ull_alientek_emmc.c Ctrl+f找到以下内容进行修改版,up主没买lcd屏幕,就只跟着正点原子左神的来了

struct display_info_t const displays[] = {{
	.bus = MX6UL_LCDIF1_BASE_ADDR,
	.addr = 0,
	.pixfmt = 24,
	.detect = NULL,
	.enable	= do_enable_parallel_lcd,
	.mode	= {
		.name			= "TFT7016",
		.xres           = 1024,
		.yres           = 600,
		.pixclock       = 19531,
		.left_margin    = 140,
		.right_margin   = 160,
		.upper_margin   = 20,
		.lower_margin   = 12,
		.hsync_len      = 20,
		.vsync_len      = 3,
		.sync           = 0,
		.vmode          = FB_VMODE_NONINTERLACED
} } };
mx6ull_alientek_emmc.h

打开mx6ull_alientek_emmc.h找到所有的如下语句

panel=TFT43AB

替换成

panel=TFT7016

uboot中修改panel的值为TFT7016即可,在uboot的命令模式下输入如下命令:

setenv panel TFT7016
saveenv 

六、网络驱动修改

I.MX6U-MINI 开发板 ENET1 上连接的 SR8201F 器件地址为 0X2,ENET2 上连接的 SR8201F 器件地址为 0X1

1、修改 uboot 中的 ENET1 和 ENET2 的 PHY 地址和驱动

1、首先修改 uboot 中的 ENET1 和 ENET2 的 PHY 地址和驱动,打开 mx6ull_alientek_emmc.h这个文件,找到如下代码:

#ifdef CONFIG_CMD_NET
#define CONFIG_CMD_PING
#define CONFIG_CMD_DHCP
#define CONFIG_CMD_MII
#define CONFIG_FEC_MXC
#define CONFIG_MII
#define CONFIG_FEC_ENET_DEV		1

#if (CONFIG_FEC_ENET_DEV == 0)
#define IMX_FEC_BASE			ENET_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR          0x2
#define CONFIG_FEC_XCV_TYPE             RMII
#elif (CONFIG_FEC_ENET_DEV == 1)
#define IMX_FEC_BASE			ENET2_BASE_ADDR
#define CONFIG_FEC_MXC_PHYADDR		0x1
#define CONFIG_FEC_XCV_TYPE		RMII
#endif
#define CONFIG_ETHPRIME			"FEC"

#define CONFIG_PHYLIB
#define CONFIG_PHY_REALTEK //注意MINI v2.2的板子对应阿尔法2.4,网络驱动用的不是LAN8720A,而是SR8201F,要改成CONFIG_PHY_REALTEK
#endif
2、删除 uboot 74LV595 的驱动代码

uboot 中网络 PHY 芯片地址修改完成以后就是网络复位引脚的驱动修改了,打开mx6ull_alientek_emmc.c,找到如下代码注释或删除:

// #define IOX_SDI IMX_GPIO_NR(5, 10)
// #define IOX_STCP IMX_GPIO_NR(5, 7)
// #define IOX_SHCP IMX_GPIO_NR(5, 11)
// #define IOX_OE IMX_GPIO_NR(5, 8)

改成:

#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)

继续在mx6ull_alientek_emmc.c中找到

static iomux_v3_cfg_t const iox_pads[]

static void iox74lv_init(void)

void iox74lv_set(int index)

三个函数,这些都是74LV595 的驱动代码,将其删除或屏蔽即可

找到board_init()函数屏蔽掉以下代码:

3、添加网络复位引脚驱动

在 mx6ull_alientek_emmc.c 中找到如下所示代码:

在对应的函数中添加

MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),

MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),

static iomux_v3_cfg_t const fec1_pads[] = {
	MX6_PAD_GPIO1_IO06__ENET1_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
	MX6_PAD_GPIO1_IO07__ENET1_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET1_TX_DATA0__ENET1_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET1_TX_DATA1__ENET1_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET1_TX_EN__ENET1_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET1_TX_CLK__ENET1_REF_CLK1 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),
	MX6_PAD_ENET1_RX_DATA0__ENET1_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET1_RX_DATA1__ENET1_RDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET1_RX_ER__ENET1_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET1_RX_EN__ENET1_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_SNVS_TAMPER7__GPIO5_IO07 | MUX_PAD_CTRL(NO_PAD_CTRL),
};

static iomux_v3_cfg_t const fec2_pads[] = {
	MX6_PAD_GPIO1_IO06__ENET2_MDIO | MUX_PAD_CTRL(MDIO_PAD_CTRL),
	MX6_PAD_GPIO1_IO07__ENET2_MDC | MUX_PAD_CTRL(ENET_PAD_CTRL),

	MX6_PAD_ENET2_TX_DATA0__ENET2_TDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_TX_DATA1__ENET2_TDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_TX_CLK__ENET2_REF_CLK2 | MUX_PAD_CTRL(ENET_CLK_PAD_CTRL),
	MX6_PAD_ENET2_TX_EN__ENET2_TX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),

	MX6_PAD_ENET2_RX_DATA0__ENET2_RDATA00 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_RX_DATA1__ENET2_RDATA01 | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_RX_EN__ENET2_RX_EN | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_ENET2_RX_ER__ENET2_RX_ER | MUX_PAD_CTRL(ENET_PAD_CTRL),
	MX6_PAD_SNVS_TAMPER8__GPIO5_IO08 | MUX_PAD_CTRL(NO_PAD_CTRL),
};

找到以下函数并修改成以下内容,这个硬件复位很重要!第 689 行复位结束以后一定要至少延时 150ms 才能操作 SR8201F,这个在 SR8201F 数据手册里面有详细要求的,否则会导致 uboot 无法识别 SR8201F。

static void setup_iomux_fec(int fec_id)
{
	if (fec_id == 0)
	{
		imx_iomux_v3_setup_multiple_pads(fec1_pads,
						 ARRAY_SIZE(fec1_pads));
		gpio_direction_output(ENET1_RESET, 1);
		gpio_set_value(ENET1_RESET, 0);
		mdelay(20);
		gpio_set_value(ENET1_RESET, 1);				 
	}		
	else
	{
		imx_iomux_v3_setup_multiple_pads(fec2_pads,
						 ARRAY_SIZE(fec2_pads));
		gpio_direction_output(ENET2_RESET, 1);
		gpio_set_value(ENET2_RESET, 0);
		mdelay(20);
		gpio_set_value(ENET2_RESET, 1);				 
	}
	mdelay(150);
}

以上设置完成后创建一个.sh文件放到uboot源码目录编译跑一下,代码如下:

mx6ull_alientek_emmc.sh

#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

编译成功如下图,会得到u-boot.bin,u-boot.imx等等文件,烧录到sd卡,再从mini板sd卡启动即可

4、u-boot环境配置
setenv ipaddr 192.168.100.21

setenv ethaddr b8:ae:1d:01:00:00

setenv gatewayip 192.168.100.100.1

setenv netmask 255.255.255.0

ipaddr:设置开发板ip地址 注意设置和Ubuntu和主机为同一网段

ethaddr:设置开发板MAC地址

gatewayip:设置网关

netmask :设置子网掩码

up主的网络方案选择的是usb拓展+网线,设置如下

主机有线网卡IPv4地址是192.168.100.10

Ubuntu ipv4地址是192.168.100.20

imx6ull-mini开发板IPv4地址是192.168.100.21

值得注意的是,主机、ubuntu和开发板ipv4地址必须处于同一网段,否则开发板无法ping通主机或Ubuntu,所谓同一网段则是IPV4地址前3位一样,第四位只要没有其他设备占用,随便配置即可,开发板可以ping通主机或ubuntu,主机或Ubuntu却ping不通开发板uboot是正常的,uboot没有接受ping并回复ping的功能!!!

另外需要注意的是Ubuntu网卡需要桥接到主机的有线网卡中去

可在虚拟机的虚拟网络适配器中设置


U-Boot 2016.03 (Sep 27 2025 - 13:14:13 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 40C
Reset cause: POR
Board: MX6ULL ALIENTEK EMMC|MINI v2.2
I2C:   ready
DRAM:  512 MiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Display: TFT7016 (1024x600)
Video: 1024x600x24
In:    serial
Out:   serial
Err:   serial
switch to partitions #0, OK
mmc0 is current device
Net:   FEC1
Normal Boot
Hit any key to stop autoboot:  0

这个是up主开发板uboot的开机信息,看到NET : FEC1,MINI板成功识别到了ENET2网口

,还有Display: TFT7016 (1024x600),LCD也识别成功了,接下来ping以下主机和ubuntu看看

=> ping 192.168.100.10
Using FEC1 device
host 192.168.100.10 is alive
=> ping 192.168.100.20
Using FEC1 device
host 192.168.100.20 is alive

成功ping通!!!

如果不会网络环境搭建的小伙伴可以关注up主,后期会出相关的教程,up必定知无不言言无不尽!!!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐