一、简介
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
- ARCH=arm:设置目标为 arm 架构
- CROSS_COMPILE:指定所使用的交叉编译器
若想编译nand版本的uboot需要将
mx6ull_fire_mmc_defconfig
改为mx6ull_fire_nand_defconfig
-
编译工程
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 脚本即可完成编译工作。-
新建名为 imx6ull_uboot.sh 的 shell 脚本文件:
vim imx6ull_uboot.sh
-
然后在里面输入如下内容:
建议还是使用 arm-none-eabi- 编译器编译uboot,编译出来的镜像文件会小点,否则编译的uboot可能无法运行。
#!/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
-
• 由 Leung 写于 2022 年 9 月 3 日
• 参考:3. Uboot的编译
IMX6ULL - 移植uboot-imx_v2020.04_5.4.70_2.3.0
【Linux系统移植】U-Boot编译、烧写与使用
【Linux系统移植】NXP 官方开发板 uboot 编译与烧录
网友评论