IMX6ULL学习笔记(5)——获取和编译U-Boot

一、简介

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 脚本即可完成编译工作。

    1. 新建名为 imx6ull_uboot.sh 的 shell 脚本文件:
      vim imx6ull_uboot.sh

    2. 然后在里面输入如下内容:
      建议还是使用 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 了
    1. 增加可执行权限
      chmod 777 imx6ull_uboot.sh.sh

    2. 执行脚本文件
      ./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 编译与烧录

你可能感兴趣的:(IMX6ULL学习笔记(5)——获取和编译U-Boot)