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类似,使用了按照模块划分的结构,并且充分考虑了体系结构和跨平台问题,其源代码树结构请参考下图
目录/文件 |
说明 |
目录/文件 |
说明 |
---|---|---|---|
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