按照自己的习惯新建目录存放uboot的源码
在正点原子资料获取NXP的uboot,或者进入NXP的官网下载
解压源码 在普通用户存放,而且是用vscode开发的话 不建议加sudo
tar -jxf uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
一:添加开发板uboot默认配置文件
config目录 存放的是默认的配置文件
拷贝一份NXP的,然后修改里面文件
cd configs
cp mx6ull_14x14_evk_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
二:添加开发板uboot对应的头文件
复 制 目录下的 include/configs/mx6ullevk.h, 并重命名为 mx6ull_alientek_emmc.h
cp include/configs/mx6ullevk.h include/configs/mx6ull_alientek_emmc.h
#ifndef __MX6ULLEVK_CONFIG_H
#define __MX6ULLEVK_CONFIG_H
改为
#ifndef __MX6ULL_ALIENTEK_EMMC_CONFIG_H
#define __MX6ULL_ALIENTEK_EMMC_CONFIG_H
三:分析mx6ull_alientek_emmc.h头文件 大概三百多行 我只说EMMC版本有关的
总结:uboot的头文件就是配置文件。配置自己想要的功能。
CONFIG_CMD_**是使能哪些命令,比如:CONFIG_CMD_MEMTEST 使能这个内存函数
CONFIG_SYS_**配置系统的功能,比如:CONFIG_SYS_MEMTEST_START 设置这个函数的开启地址
CONFIG_(设备名)_**配置uboot支持的某个设备,比如CONFIG_VIDEO_BMP_LOGO 启动lcd启动图片bmp的logo
因此能看懂会配置(添加\删除\修改)自己想要的功能就可以啦
四:添加开发板对应的板级文件夹
cd board/freescale/
cp mx6ullevk/ -r mx6ull_alientek_emmc
cd mx6ull_alientek_emmc
mv mx6ullevk.c mx6ull_alientek_emmc.c
mx6ull_alientek_emmc 目 录
# (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 $< $@

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

if TARGET_MX6ULL_ALIENTEK_EMMC
config SYS_BOARD
default "mx6ull_alientek_emmc"
config SYS_VENDOR
default "freescale"
config SYS_SOC
default "mx6"
config SYS_CONFIG_NAME
default "mx6ull_alientek_emmc"
endif
MX6ULL_ALIENTEK_EMMC BOARD
M: Peng Fan <peng.fan@nxp.com>
S: Maintained
F: board/freescale/mx6ull_alientek_emmc/
F: include/configs/mx6ull_alientek_emmc.h
config TARGET_MX6ULL_ALIENTEK_EMMC
bool "Support mx6ull_alientek_emmc"
select MX6ULL
select DM
select DM_THERMAL
第二个
source "board/freescale/mx6ull_alientek_emmc/Kconfig"

ARCH=arm 表示是ARM架构
CROSS_COMPILE=arm-linux-gnueabihf- 表示交叉编译器为 arm-linux-gnueabihf-
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_alientek_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16

./mx6ull_14x14_emmc.sh
成功!!
烧入SD卡
六:上板验证
只接串口线就可以啦!
看到终端输出,我们可以捋捋需要修改什么?
1. 自己LCD的分辨率跟NXP不一样,需要修改
2.以太网需要修改,为了我们后面用uboot通过以太网接口拉取linux内核和设备树,作为一个网络调试做铺垫
3,板子信息改为正点原子(不是必要)
现在开始细节修改咯! 我没有LCD屏幕,就只修改网络就可以了
#define CONFIG_PHY_SMSC


#define ENET1_RESET IMX_GPIO_NR(5, 7)
#define ENET2_RESET IMX_GPIO_NR(5, 8)
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 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);
}
}
#ifdef CONFIG_PHY_SMSC
static int lan8720_flag = 0;
int bmcr_reg = 0;
if (lan8720_flag == 0) {
bmcr_reg = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR);
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, BMCR_RESET);
while(phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR) & 0X8000) {
udelay(100);
}
phy_write(phydev, MDIO_DEVAD_NONE, MII_BMCR, bmcr_reg);
lan8720_flag = 1;
}
#endif

搞定!编译,烧入SD卡!!!
说明,ENET1 正常!!!
设置ENET1的IP 、MAC、默认网关、子网掩码、服务器地址
其中:IP地址、子网掩码、服务器地址自己随意配置,要求前面9位数字相同
MAC 必须是b8:ae:1d:01:00:00
setenv ipaddr 192.168.110.110 //开发板 IP 地址
setenv ethaddr b8:ae:1d:01:00:00 //开发板网卡 MAC 地址
setenv gatewayip 192.168.110.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.110.8 //服务器地址,也就是 Ubuntu 地址
saveenv //保存环境变量
关于服务器通过网线桥接开发板,我可以参考我写的这个
最后!!!host 192.168.******* is alive 表示成功!!!!