【Linux】MX6ULL移植uboot过程详细分析(附NXP官方原理图)

本文介绍将NXP官方的uboot移植到正点原子的I.MX6ULL开发板上的详细流程。以此了解uboot移植的基本操作,为后续可能的深层定制打下基础。

目录

1、在U-Boot中添加自己的开发板

[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 图形界面配置文件)

2、LCD驱动修改

3、网络驱动修改

[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 升级功能,添加固件加密校验与专属环境变量管理;同时需开启看门狗、优化时序、添加异常容错机制,保障产品稳定性与鲁棒性。

相关推荐
大树884 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质5 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush45 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5205 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz5 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工6 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
不会C语言的男孩6 小时前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
shushangyun_6 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化