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

Posted Leung_ManWah

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IMX6ULL学习笔记——获取和编译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】

四、U-Boot工程结构

目录/文件说明
api通用的API函数相关目录
arch与芯片架构相关目录
board板级相关信息目录
cmduboot命令相关目录
common通用代码目录
configsboot配置文件目录
disk磁盘相关内容目录
doc说明文档
drivers驱动代码相关目录
dtoverlay
dts设备树相关目录
envuboot环境相关
examples示例代码目录
fs文件系统相关目录
include头文件相关目录
liblib库文件目录
Licenses许可证相关目录
net网络相关代码目录
post上电自检相关目录
scripts相关脚本目录
test测试代码目录
toolsuboot构建工具相关目录
Kconfig图形配置界面相关文件
MakefileMakefile文件

五、编译野火提供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学习笔记——获取和编译U-Boot的主要内容,如果未能解决你的问题,请参考以下文章

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

IMX6ULL学习笔记——通过SD卡启动U-Boot

IMX6ULL学习笔记——通过SD卡启动U-Boot

IMX6ULL学习笔记——通过SD卡启动U-Boot

IMX6ULL学习笔记——通过USB OTG烧录U-Boot(MfgTool工具)

IMX6ULL学习笔记——通过USB OTG烧录U-Boot(MfgTool工具)