4. Uboot的编译

4.1. 下载安装编译镜像系统

使用平台:Ubuntu 18.04 LTS 版本

可以使用我们提供的虚拟机镜像 https://doc.embedfire.com/products/link/zh/latest/linux/ebf_i.mx6ull.html#id4

也可以自己下载ubuntu 18.04 LTS官方镜像搭建 https://mirrors.aliyun.com/ubuntu-releases/bionic

4.2. 安装编译工具和依赖

使用apt工具能快速安装好我们需要的工具和依赖

1
sudo apt install make git gcc-arm-none-eabi gcc bison flex libssl-dev dpkg-dev lzop libncurses5-dev

4.3. 获取Uboot

4.3.1. 下载源代码

Uboot的源代码有多种方式可下载,但各自又有不同,野火Uboot是根据NXP官方提供的Uboot进行板卡的修改与功能的添加,NXP官方的Uboot是以Uboot官方版本进行芯片的适配。

而野火OpenWrt固件使用的Uboot(以下简称OP-Uboot)是在野火Uboot的基础上,删减了一部分在OpenWrt系统上无用功能的精简版本。

官方Uboot GitHub:

NXP提供的Uboot下载链接:

野火OP-Uboot下载链接:

注意:本教程以野火提供的OP-Uboot为分析样本

4.3.2. 查看切换分支

通常一个Uboot仓库往往维护着不同分支的Uboot,进入仓库目录下可通过命令查看及切换Uboot分支, 例如在当前版本中使用的Uboot分支为 ebf_v2020_10_imx

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#克隆远程仓库到本地
git clone http://gitlab.ebf.local/openwrt/gateway/ebf_gateway_linux_uboot.git

#查看Uboot分支
git branch -a

#打印消息如下,*表示当前分支为ebf_v2020_10_imx分支。
* ebf_v2020_10_imx
  remotes/origin/ebf_v2020_10_imx

#如果不在ebf_v2020_10_imx分支则需要切换分支
git checkout ebf_v2020_10_imx

#打印消息如下
分支 'ebf_v2020_10_imx' 设置为跟踪来自 'origin' 的远程分支 'ebf_v2020_10_imx'。
切换到一个新分支 'ebf_v2020_10_imx'

#重新查看当前分支
git branch

#打印消息如下
* ebf_v2020_10_imx

也可以在下载时指定分支,如下所示

1
git clone -b ebf_v2020_10_imx http://gitlab.ebf.local/openwrt/gateway/ebf_gateway_linux_uboot.git

4.4. Uboot工程结构分析

学习一个软件,尤其是开源软件,首先应该从分析软件的工程结构开始。一个好的软件有良好的工程结构,对于读者学习和理解软件的架构以及工作流程都有很好的帮助。

Uboot的源代码布局和我们后面讲的Linux类似,使用了按照模块划分的结构,并且充分考虑了体系结构和跨平台问题,其源代码树结构请参考下图

Uboot目录

目录/文件

说明

目录/文件

说明

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文件

4.5. Uboot编译

野火提供的imx6ull OP-Uboot分为nand版本和emmc版本,以编译nand版本为例

若想编译emmc版本的Uboot需要将 mx6ull_fire_nand_defconfig 改为 mx6ull_fire_mmc_defconfig

1
2
3
4
5
6
7
8
#清除之前的编译环境
sudo make distclean

#选择配置文件
sudo make ARCH=arm CROSS_COMPILE=arm-none-eabi- mx6ull_fire_nand_defconfig

#编译Uboot
sudo make ARCH=arm CROSS_COMPILE=arm-none-eabi-
  • sudo make distclean 清除上次生成的编译环境,避免之前的环境干扰影响编译结果

  • sudo make ARCH=arm CROSS_COMPILE=arm-none-eabi- mx6ull_fire_nand_defconfig 加载板级配置文件,具体的板级配置文件在Uboot根目录下的configs目录下

  • sudo make ARCH=arm CROSS_COMPILE=arm-none-eabi- 设置编译架构为arm 编译工具链为arm-none-eabi- 然后开始编译

4.6. 编译产物分析

编译成功后,将打印以下信息。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
OBJCOPY u-boot-nodtb.bin
DTC     arch/arm/dts/imx6ull-14x14-evk.dtb
DTC     arch/arm/dts/imx6ull-fire-mmc.dtb
DTC     arch/arm/dts/imx6ull-fire-nand.dtb
DTC     arch/arm/dts/imx6ull-colibri.dtb
DTC     arch/arm/dts/imx6ull-myir-mys-6ulx-eval.dtb
DTC     arch/arm/dts/imx6ull-phytec-segin-ff-rdk-emmc.dtb
DTC     arch/arm/dts/imx6ull-dart-6ul.dtb
DTC     arch/arm/dts/imx6ull-somlabs-visionsom.dtb
DTC     arch/arm/dts/imx6ulz-14x14-evk.dtb
DTC     arch/arm/dts/imx6-apalis.dtb
DTC     arch/arm/dts/imx6-colibri.dtb
SHIPPED dts/dt.dtb
FDTGREP dts/dt-spl.dtb
CAT     u-boot-dtb.bin
CFGS    u-boot-dtb.cfgout
MKIMAGE u-boot-dtb.imx
OBJCOPY u-boot.srec
COPY    u-boot.bin
SYM     u-boot.sym
COPY    u-boot.dtb
  • u-boot:初步链接后得到的Uboot文件

  • u-boot-nodtb.bin:是在u-boot的基础上,经过objcopy去除符号表信息之后的可执行程序,具体代码如下

1
arm-none-eabi-objcopy --gap-fill=0xff  -j .text -j .secure_text -j .secure_data -j .rodata -j .hash -j .data -j .got -j .got.plt -j .u_boot_list -j .rel.dyn -j .binman_sym_table -j .text_rest -j .dtb.init.rodata -j .efi_runtime -j .efi_runtime_rel -O binary   u-boot u-boot-nodtb.bin
  • u-boot.dtb:Uboot的设备树,是由arm-none-eabi-gcc和dtc编译出来的,详细的可以分析编译过程,这里就不展开分析了

  • u-boot.bin:是在u-boot-nodtb.bin后追加了u-boot.dtb形成的

  • u-boot-dtb.imx:是u-boot.bin 添加了3KB头部信息和尾部信息(结尾添加了1298字节的00,00实际没什么作用)组成的镜像

编译生成的u-boot-dtb.imx文件就是我们想要文件。

4.7. 参考资料

官方Uboot下载链接: http://www.denx.de/wiki/uboot/WebHome

官方Uboot GitHub: https://github.com/uboot/uboot

NXP提供的Uboot下载链接: https://source.codeaurora.org/external/imx/uboot-imx/

Uboot wiki: http://www.denx.de/wiki/uboot/WebHome