本文介绍将NXP官方的uboot移植到正点原子的I.MX6ULL开发板上的详细流程。以此了解uboot移植的基本操作,为后续可能的深层定制打下基础。
目录
[1.1 复制修改mx6ull_14x14_evk_emmc_defconfig文件](#1.1 复制修改mx6ull_14x14_evk_emmc_defconfig文件)
[1.2 复制修改mx6ullevk.h文件](#1.2 复制修改mx6ullevk.h文件)
[1.3 复制修改板级文件夹](#1.3 复制修改板级文件夹)
[1.4 修改U-Boot 图形界面配置文件](#1.4 修改U-Boot 图形界面配置文件)
[3.1 ENET1 的网络原理图](#3.1 ENET1 的网络原理图)
[3.2 PHY地址和驱动修改](#3.2 PHY地址和驱动修改)
[3.2.1 地址修改](#3.2.1 地址修改)
[3.2.2 驱动修改](#3.2.2 驱动修改)
[3.2.3 复位引脚修改](#3.2.3 复位引脚修改)
1、在U-Boot中添加自己的开发板
1.1 复制修改mx6ull_14x14_evk_emmc_defconfig文件
主要修改第一行开发板对应的板级文件夹路径。第四行开发板配置项的名称。
第四行的 CONFIG_TARGET_MX6UL_14X14_EVK=y 是下图路径中的 Kconfig 文件决定的,当 其被选中时,自动设置 SYS_BOARD(板卡名称)、SYS_VENDOR(厂商)、SYS_CONFIG_NAME(配置文件名)
1.2 复制修改mx6ullevk.h文件
该文件的主要功能就是配置或者裁剪uboot。如果需要某个功能的话就在里面添加这个功能对应的CONFIG_XXX 宏即可,如果不需要某个功能的话就删除掉对应的宏即可。
该文件中,可以设置DRAM大小、malloc内存池大小、使能串口功能、使能I2C功能、设置I2C速度、NAND分区设置、USB相关的宏定义、网络相关的宏定义、...

1.3 复制修改板级文件夹
进入mx6ull_alientek_emmc 目录中,将其中的mx6ullevk.c 文件重命名为mx6ull_alientek_e
mmc.c

然后修改mx6ull_alientek_emmc目录下的Makefile 、imximage.cfg 、Kconfig、MAINTAINERS这四个文件。只改名字即可(mx6ullevk → mx6ull_alientek_emmc)
1.4 修改U-Boot 图形界面配置文件
uboot 是支持图形界面配置,修改文件arch/arm/cpu/armv7/mx6/Kconfig。红色为新增部分。
- config:在 U-Boot 的配置界面中,新增 "Support mx6ull_alientek_emmc" 这个选项,用户可以选择该板卡作为编译目标。
- select MX6ULL:关联 IMX6ULL 芯片的架构配置(保证编译对应芯片的代码)
- select DM/DM_THERMAL:关联设备模型(Driver Model)及热管理模块的配置(启用板卡需要的功能框架)。
- source:将该板卡目录下的 Kconfig 引入到 U-Boot 的全局配置系统中,让板卡的专属硬件参数(如板名、厂商)能被配置系统识别。

到此为止,I.MX6U-ALPHA 开发板就已经添加到uboot 中了。主要做到工作是复制原厂相关文件,改了名称、路径,裁剪了uboot,并在图形配置界面中新增ALPHA 开发板的选项。此时的uboot编译后,对于ALPHA 开发板,LCD 驱动和网络驱动是有问题的(ALPHA 开发板和NXP官方使用的LCD和网络模块硬件不一样,所以驱动需要修改)。
2、LCD驱动修改
驱动的修改,一般是在下面两个文件中修改


LCD的驱动修改看两点:
1、LCD所使用的GPIO配置是否正确(若原理图上LCD和芯片引脚连接一致,则无需修改这部分)
2、LCD 配置参数是否正确(一般产品使用手册会有这些参数)
修改完成以后重新编译一遍uboot 并烧写到SD中启动。重启以后LCD驱动一般就会工作正常了,LCD 上会显示NXP的logo
3、网络驱动修改
**内部MAC+外部PHY 的分离式方案:**嵌入式领域的主流设计,核心是两者分工协作:MAC 负责协议层处理,PHY 负责物理层信号转换。
- MAC: 以太网媒体访问控制器
- PHY:以太网物理层(Physical Layer)芯片(网线端口就插在该芯片模块上)
拓展资料:OSI七层模型
3.1 ENET1 的网络原理图
正点原子的I.MX6U-ALPHA 开发板提供了ENET1 和ENET2 这两个网络接口。其都使用SR8201F 作为PHY 芯片。NXP 官方的I.MX6ULL EVK 开发板使用KSZ8081这颗PHY 芯片。以此为例,说明更换PHY芯片后如何调整网络驱动。

U14(SR8201F)的引脚标注了 LED0/PHYAD0 和 LED1/PHYAD1 ,这两个是 PHY 的地址配置引脚(PHYAD0 为地址低位,PHYAD1 为地址次低位)。其中,一个下拉到 GND,一个上拉到VCC_3V3。故二进制组合为 10,故器件地址为0x2
NXP官方的I.MX6ULL EVK 开发板原理图

对比上述原理图正点原子I.MX6U-ALPHA 开发板的ENET1 引脚与NXP 官方的I.MX6ULL EVK 开发板基本一样,主要是复位引脚不同。从图可以看出,正点原子I.MX6U-ALPHA 开发板的ENET1 复位引脚ENET1_RST 接到了I.M6ULL 的SNVS_TAMPER7 这个引脚上。
综上,网络驱动的修改有三点:1、复位引脚 2、PHY 器件地址 3、PHY 驱动
3.2 PHY地址和驱动修改
3.2.1 地址修改
打开mx6ull_alientek_emmc.h 发现两个网口对应的PHY默认地址和原理图对应,故无需修改
3.2.2 驱动修改
CONFIG_PHY_MICREL,这个宏用于使能uboot中Micrel公司的PHY驱动,KSZ8081这颗PHY芯片(NXP官方板子上的)就是Micrel公司生产的。现在使用的PHY芯片是SR8201F,那么就得将CONFIG_PHY_MICREL 改为CONFIG_PHY_REALTEK(SR8201F 就是Pin to Pin 替换Realtek 的RTL8201F 的,因此可以直接使用Realtek 的相关驱动)

3.2.3 复位引脚修改
**1、**注释4行代码,添加两行代码。IOX 开头的宏定义是74LV595 的相关GPIO,因为NXP 官方I.MX6ULL EVK 开发板使用74LV595 来扩展IO,两个网络的复位引脚就是由74LV595 来控制的。正点原子的I.MX6U-ALPHA 开发板并没有使用74LV595,故需注释掉。
ENET1 的复位引脚连接到SNVS_TAMPER7 上,对应的GPIO在原理图中搜索即可。

2、然后继续在该文件中删除IOX相关的配置和函数。
3、然后在fec1_pads 和fec2_pads 这 ENET1 和ENET2 这两个网口的IO 配置参数结构体数组的最后一行添加两个网口的复位IO 配置参数。

4、函数setup_iomux_fec 是根据fec1_pads 和fec2_pads 这两个网络IO 配置数组来初始化I.MX6ULL 的网络IO。需要在其中添加网络复位IO初始化的代码、复位PHY芯片的代码
(复位结束后至少延时150ms 才能正常使用SR8201F,这个在SR8201F 数据手册里面有详细要求,否则会导致uboot 无法识别SR8201F。)
至此网络的复位引脚驱动修改完成,重新编译uboot,然后将u-boot.bin 烧写到SD 卡中并启动。从uboot 启动信息中可以看到"Net: FEC1"这一行,提示当前使用的FEC1 这个网口,也就是ENET2。在uboot 中使用网络之前要先设置几个环境变量:
setenv ipaddr 192.168.1.55 //开发板IP 地址
setenv ethaddr b8:ae:1d:01:00:00 //开发板网卡MAC 地址
setenv gatewayip 192.168.1.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.1.250 //服务器地址,也就是Ubuntu 地址(PC电脑)
saveenv //保存环境变量
然后通过ping 命令来测试一下网络连接,,有 host 192.168.1.250 is alive 这句,说明ping 主机成功,说明ENET2 网络工作正常。再测试一下ENETT1即可。
至此,I.MX6UALPHA开发板的两个网络都工作正常了,网络驱动修改成功。uboot 移植也完成了,uboot 的最终目的就是启动Linux 内核,所以需要通过启动Linux 内核来最终判断uboot 移植是否成功。
最后,移植 U-Boot 远不止修改 LCD 和网络,正点原子的 U-Boot 移植核心是基于 NXP 原厂复刻板做 LCD、网络等外设微调,帮开发者快速掌握基础流程,属于表层适配。实际工作中可能需围绕产品化需求深度定制:核心硬件上要调整 DDR 时序 / 容量、时钟晶振适配、存储介质切换(如 EMMC 转 SPI Flash)及引脚复用修改;外设需完善 USB、触摸屏等必选功能;还要设计启动介质优先级、开发 SD 卡 / OTA 升级功能,添加固件加密校验与专属环境变量管理;同时需开启看门狗、优化时序、添加异常容错机制,保障产品稳定性与鲁棒性。