• 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】

    四、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
      • 2
      • 3
      • 4
      • 第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 编译与烧录

  • 相关阅读:
    打造“新型计算数据中心”!玻色量子与科华数据(002335.SZ)携手共创
    Vue实现增删改查——基于SpringBoot和Vue的后台管理系统项目系列博客(九)
    在 Rust 中读取文件的 4 种方法
    开源AI智能名片小程序在私域流量运营中的“及时法则”深度应用与策略探讨
    如何创建一个自己的sphinx文档网站
    在 Visual Studio Code (VS Code) 中设置
    产品人生(13):从“产品的RFM分析”看如何探索“职业方向”
    Cognos Analytics教程之为什么我喜欢 Cognos Analytics:IBM Cognos Analytics 的 15 个特性
    89.(前端)商品分类显示优化——关闭选择框、下拉框、修改间隔、显示层级为tag标签、添加操作栏、添加索引
    11.21序列检测,状态机比较与代码,按键消抖原理
  • 原文地址:https://blog.csdn.net/qq_36347513/article/details/126682052