IMX6ULL学习笔记(5)——获取和编译U-Boot
2025-02-24 来源:jianshu
一、简介
1.1 BootLoader
BootLoader 是系统上电时运行的一段初始化代码,用于引导完整的操作系统,然后将控制器交给操作系统。 这段 BootLoader 程序会先初始化 DDR 等外设,然后将 Linux 内核从 Flash(NAND,NOR FLASH,SD,MMC 等)拷贝到 DDR 中,最后启动 Linux 内核。
另外,某些 BootLoader 可能含有一些高级特性,如校验操作系统镜像,从多个操作系统镜像中选择引导合适的操作系统, 或者添加网络功能,让系统自主从网上寻找合适的镜像并且进行引导等等。
1.2 U-Boot
U-Boot(Universal Boot Loader) 是一个主要用于嵌入式系统的引导加载程序。可以支持多种不同的计算机系统结构,包括 PPC、ARM、AVR32、MIPS、x86、68k、Nios 与 MicroBlaze。这也是一套在 GNU 通用公共许可证之下发布的自由软件。U-Boot 的主要作用是用来启动操作系统内核,它分为两个阶段,即 boot + loader, boot 阶段启动系统,初始化硬件设备,建立内存空间映射图,将系统的软硬件带到一个合适的状态, loader 阶段将操作系统内核文件加载至内存,之后跳转到内核所在地址运行。U-Boot 发展至今,已经可以实现非常多的功能,比如支持液晶屏、网络、USB 等高级功能。
二、安装编译工具和依赖
sudo apt install make git gcc-arm-none-eabi gcc bison flex libssl-dev dpkg-dev lzop libncurses5-dev
三、获取U-Boot
【不推荐,仅列出】
官方uboot下载:https://github.com/u-boot/u-boot、https://ftp.denx.de/pub/u-boot/
NXP提供uboot下载:https://source.codeaurora.org/external/imx/uboot-imx
STM32提供uboot下载:https://github.com/STMicroelectronics/u-boot
【新手推荐使用以下开发板商提供uboot】
野火提供uboot下载:https://gitee.com/Embedfire/ebf_linux_uboot
韦东山提供uboot下载:https://e.coding.net/weidongshan/imx-uboot2017.03.git
四、U-Boot工程结构
| 目录/文件 | 说明 |
|---|---|
| api | 通用的API函数相关目录 |
| arch | 与芯片架构相关目录 |
| board | 板级相关信息目录 |
| cmd | uboot命令相关目录 |
| common | 通用代码目录 |
| configs | boot配置文件目录 |
| disk | 磁盘相关内容目录 |
| doc | 说明文档 |
| drivers | 驱动代码相关目录 |
| dtoverlay | |
| dts | 设备树相关目录 |
| env | uboot环境相关 |
| examples | 示例代码目录 |
| fs | 文件系统相关目录 |
| include | 头文件相关目录 |
| lib | lib库文件目录 |
| Licenses | 许可证相关目录 |
| net | 网络相关代码目录 |
| post | 上电自检相关目录 |
| scripts | 相关脚本目录 |
| test | 测试代码目录 |
| tools | uboot构建工具相关目录 |
| Kconfig | 图形配置界面相关文件 |
| Makefile | Makefile文件 |
五、编译野火提供U-Boot
获取野火提供U-Boot源码
git clone -b ebf_v2020_10_imx https://gitee.com/Embedfire/ebf_linux_uboot进入工程目录
cd ebf_linux_uboot清除工程
清除上次生成的编译环境,避免之前的环境干扰影响编译结果
sudo make distclean配置工程
加载板级配置文件,具体的板级配置文件在uboot根目录下的configs目录下。野火提供的imx6ull uboot分为nand版本和emmc版本,以编译emmc版本为例
sudo make ARCH=arm CROSS_COMPILE=arm-none-eabi- mx6ull_fire_mmc_defconfig若想编译nand版本的uboot需要将 mx6ull_fire_mmc_defconfig 改为 mx6ull_fire_nand_defconfig

ARCH=arm:设置目标为 arm 架构
CROSS_COMPILE:指定所使用的交叉编译器
编译工程
sudo make ARCH=arm CROSS_COMPILE=arm-none-eabi-ARCH=arm:设置目标为 arm 架构
CROSS_COMPILE:指定所使用的交叉编译器
生成文件
编译完成以后多了一些文件:uboot :裸机程序,因此需要在其前面加上头部(IVT、DCD 等数据)才能在 IMX6ULL 上执行。
u-boot-nodtb.bin :是在 uboot 的基础上,经过 objcopy 去除符号表信息之后的可执行程序
u-boot.dtb :uboot 的设备树,是由 arm-none-eabi-gcc 和 dtc 编译出来的
u-boot.bin :是在 u-boot-nodtb.bin 后追加了 u-boot.dtb 形成的二进制文件。
u-boot-dtb.imx :就是我们最终要烧写到开发板中的 uboot 镜像文件。是 u-boot.bin 添加了3KB头部信息和尾部信息(结尾添加了1298字节的00,00实际没什么作用)组成的镜像。
新建编译脚本文件
每次编译 uboot 都要输入一长串命令,为了简单起见,我们可以新建一个 shell 脚本文件,将这些命令写到 shell 脚本文件里面,然后每次只需要执行 shell 脚本即可完成编译工作。#!/bin/bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_fire_nand_defconfig make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
第1行:shell 脚本要求的,必须是 “#!/bin/bash” 或者 “#!/bin/sh”。
第2行:使用了 make 命令,用于清理工程,也就是每次在编译 uboot 之前都清理一下工程。带有三个参数,第一个是 ARCH,也就是指定架构,这里肯定是 arm;第二个参数 CROSS_COMPILE 用于指定编译器,只需要指明编译器前缀就行了,比如 arm-linux-gnueabihf-gcc 编译器的前缀就是 “arm-linux-gnueabihf-”;最后一个参数 distclean 就是清除工程。
第3行:也使用了 make 命令,用于配置 uboot。同样有三个参数,不同的是,最后一个参数是 mx6ull_fire_mmc_defconfig。前面说了 uboot 是 bootloader 的一种,可以用来引导Linux,但是 uboot 除了引导 Linux 以外还可以引导其它的系统,而且 uboot 还支持其它的架构和外设,比如 USB、网络、SD 卡等。这些都是可以配置的,需要什么功能就使能什么功能。所以在编译 uboot 之前,一定要根据自己的需求配置 uboot。mx6ull_fire_mmc_defconfig 就是野火针对 I.MX6ULL 的 EMMC 核心板编写的配置文件,这个配置文件在 uboot源码的 configs 目录中。
第4行:用于编译 uboot,通过第 3 行配置好 uboot 以后就可以直接 “make” 编译 uboot 了
增加可执行权限
chmod 777 imx6ull_uboot.sh.sh执行脚本文件
./imx6ull_uboot.sh.sh新建名为 imx6ull_uboot.sh 的 shell 脚本文件:
vim imx6ull_uboot.sh然后在里面输入如下内容:
建议还是使用 arm-none-eabi- 编译器编译uboot,编译出来的镜像文件会小点,否则编译的uboot可能无法运行。
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 蓝牙信道探测技术原理与开发套件实践
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析






