I.MX6ULL Uboot-2020.04 移植(1):开发环境搭建以及NXP源码编译

前提说明

本专题基于正点原子 ALPHA 开发板,移植 NXP 的原厂 U-Boot 2020.04 版本,后续也可能新增新版本的 U-Boot 移植;

本文参考了 i.MX6ULL - 从零开始移植uboot-imx_v2020.04_5.4.70_2.3.0。在其基础上,详细记录说明每一步操作的缘由,基于个人学习体会。

开发环境搭建

  1. 基于 WSL2 + Ubuntu-22.04 TLS 开发环境(自行搭建)

  2. 交叉编译工具,可以参考此篇 下载较老版本或最新版本的ARM Linux gcc 交叉编译工具链 详细介绍了各种交叉编译工具链的下载

    个人使用的 Linaro GCC

    旧版本下载链接 4.x~7.x

    新版本下载链接 11.x ~ 14.x

    我个人使用的 gcc-linaro-12.3.1-2023.06-x86_64_arm-linux-gnueabihf 版本,版本并没有太大关系,只要版本能运行在当前宿主机上(Ubuntu-22.04 TLS)即可。

    自行解压并存放在 Ubuntu 里面,目录位置任意,自己记住即可!

  3. 编译uboot和内核所必须的依赖库安装

    bash 复制代码
    sudo apt-get install -y libncurses5-dev lsb-core lib32stdc++6 bison flex lzop git bear

NXP 官方 U-Boot 编译

  1. 官方 U-Boot 位于 Github 上:

    bash 复制代码
    git clone https://github.com/nxp-imx/uboot-imx.git
    cd uboot-imx

    使用 git branch --all 可以参考所以的分支

    我们切换到分支 remotes/origin/imx_v2020.04_5.4.70_2.3.0 上面,后续实验基于该分支进行。

  2. 编写一个构建脚本 build.shuboot-imx 目录,既当前 U-Boot 的根目录下面

    shell 复制代码
    #!/bin/bash
    make ARCH=arm CROSS_COMPILE=/home/binwatson/.tools/gcc-linaro-12.3.1-2023.06-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- distclean
    make ARCH=arm CROSS_COMPILE=/home/binwatson/.tools/gcc-linaro-12.3.1-2023.06-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
    bear -- make ARCH=arm CROSS_COMPILE=/home/binwatson/.tools/gcc-linaro-12.3.1-2023.06-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- -j4 V=1
    • CROSS_COMPILE:指定前面安装交叉编译工具链的位置,参考我的修改成你自己的即可;
    • -j4:指定使用 4 个线程进行编译,可自行修改;
    • bear -- make:目的是生成 compile_commands.json 用于 clangd 跳转;
  3. build.sh 脚本新增执行权限,并且进行编译:

    bash 复制代码
    chmod +x build.sh
    ./build.sh
  4. 编写 usb 下载脚本,用于通过 usb 烧录镜像到开发板,方便后续开发验证程序,如果你使用 SD 卡,跳过该步骤即可。

    在 Ubuntu-22.04 环境下直接通过 sudo apt-get install uuu 即可下载 uuu 工具,如果其它环境请自行参考官方 mfgtools

    编写烧录脚本 flash.sh

    bash 复制代码
    #!/bin/bash
    SCRIPT_DIR=$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" &> /dev/null && pwd)
    BUILD_DIR="."
    UUU_TOOL=uuu
    
    echo "Start Download u-boot-dtb.imx ..."
    sudo ${UUU_TOOL} ${BUILD_DIR}/u-boot-dtb.imx
    echo "Download u-boot-dtb.imx done."
  5. 将开发板切换到 USB 启动,然后复位即可通过 flash.sh 脚本将镜像烧录。

    将 USB-OTG 挂在到 WSL2 需要借助 usbipd-win 工具,请自行参考安装

烧录成功后,可以通过串口查看运行情况:

配置 VSCode 作为后续的开发平台

  1. 前面我们生成了 compile_commands.json ,因此使用 VSCode 中的 clangd 插件即可完成代码的跳转、智能提示等功能(具体请自行查找资料研究):

  2. WLS2 可以通过 Remote Exploerer 插件,实现 Window 远程链接(具体请自行查找资料研究)

  3. 如上即可完成开发环境的搭建

  4. 屏蔽掉一些非 NXP I.MX6ULL 的文件,防止干扰我们搜索和阅读源码,在工程目录下,创建一个 .vscode/settings.json 文件,填充如下内容:

    json 复制代码
    {
        "search.exclude": {
            "**/node_modules": true,
            "**/bower_components": true,
            "**/*.o":true,
            "**/*.su":true,
            "**/*.cmd":true,
            "arch/arc":true,
            "arch/arm/dts/am*":true,
            "arch/avr32":true,
            "arch/blackfin":true,
            "arch/m68k":true,
            "arch/microblaze":true,
            "arch/mips":true,
            "arch/nds32":true,
            "arch/nios2":true,
            "arch/openrisc":true,
            "arch/powerpc":true,
            "arch/sandbox":true,
            "arch/sh":true,
            "arch/sparc":true,
            "arch/x86":true,
            "arch/arm/mach-[a-h]*":true, 
            "arch/arm/mach-in*":true, 
            "arch/arm/mach-[j-z]*":true, 
            "arch/arm/mach-imx/imx9*":true, 
            "arch/arm/mach-imx/imx8*":true, 
            "arch/arm/mach-imx/imx7*":true, 
            "arch/arm/mach-imx/imx2*":true, 
            "arch/arm/mach-imx/imx3*":true, 
            "arch/arm/mach-imx/imx5*":true, 
            "arch/arm/mach-imx/imxr*":true, 
            "arch/arm/mach-imx/mx7*":true, 
            "arch/arm/mach-imx/mx2*":true, 
            "arch/arm/mach-imx/mx3*":true, 
            "arch/arm/mach-imx/mx5*":true, 
            "arch/arm/mach-imx/mxs*":true, 
            "arch/arm/cpu/arm11*":true,
            "arch/arm/cpu/arm720t":true,
            "arch/arm/cpu/arm9*":true,
            "arch/arm/cpu/armv7m":true,
            "arch/arm/cpu/armv8":true,
            "arch/arm/cpu/pxa":true,
            "arch/arm/cpu/sa1100":true,
            "board/[a-e]*":true,
            "board/[g-z]*":true,
            "board/[0-9]*":true,
            "board/[A-Z]*":true,
            "board/fir*":true,
            "board/freescale/b*":true,
            "board/freescale/l*":true,
            "board/freescale/m5*":true,
            "board/freescale/mp*":true,
            "board/freescale/c29*":true,
            "board/freescale/cor*":true,
            "board/freescale/mx7*":true,
            "board/freescale/mx2*":true,
            "board/freescale/mx3*":true,
            "board/freescale/mx5*":true,
            "board/freescale/p*":true,
            "board/freescale/q*":true,
            "board/freescale/t*":true,
            "board/freescale/v*":true,
            "board/freescale/mx6d*":true,
            "board/freescale/mx6q*":true,
            "board/freescale/mx6s*":true,
            "board/freescale/mx6m*":true,
            "board/freescale/mx6ul_*":true,
            "board/freescale/mx6ull_*":true,
            "board/freescale/s32*":true,
            "board/freescale/imx8*":true,
            "board/freescale/imxr*":true,
            "configs/[a-l]*":true,
            "configs/[n-z]*":true,
            "configs/[A-Z]*":true,
            "configs/M[a-z]*":true,
            "configs/M[A-Z]*":true,
            "configs/M[0-9]*":true,
            "configs/m[a-w]*":true,
            "configs/m[0-9]*":true,
            "configs/[0-9]*":true,
            "configs/mx6d*":true,
            "configs/mx6c*":true,
            "configs/mx6s*":true,
            "configs/mx6q*":true,
            "configs/mx6ul_*":true,
            "configs/mx6ulz_*":true,
            "configs/mx6m*":true,
            "configs/mx7*":true,
            "configs/mx23*":true,
            "configs/mx25*":true,
            "configs/mx28*":true,
            "configs/mx3*":true,
            "configs/mx5*":true,
            "include/configs/[a-l]*":true,
            "include/configs/[n-z]*":true,
            "include/configs/[A-Z]*":true,
            "include/configs/m[a-w]*":true,
            "include/configs/mx6c*":true,
            "include/configs/mx6d*":true,
            "include/configs/mx6q*":true,
            "include/configs/mx6s*":true,
            "include/configs/mx6ul_*":true,
            "include/configs/mx6ulz_*":true,
            "include/configs/mx7*":true,
            "include/configs/mx2*":true,
            "include/configs/mx3*":true,
            "include/configs/mx5*":true,
            "include/configs/m2*":true,
            "include/configs/m5*":true,
            "include/configs/[0-9]*":true
        },
        "files.exclude": {
            "**/.git": true,
            "**/.svn": true,
            "**/.hg": true,
            "**/CVS": true,
            "**/.DS_Store": true,
            "**/*.o": true,
            "**/*.su":true,
            "**/*.cmd":true,
            "arch/arc":true,
            "arch/arm/dts/[a-h]*":true,
            "arch/arm/dts/[j-z]*":true,
            "arch/arm/dts/imx6-*":true,
            "arch/arm/dts/imx6d*":true,
            "arch/arm/dts/imx6q*":true,
            "arch/arm/dts/imx6sl*":true,
            "arch/arm/dts/imx6sx*":true,
            "arch/arm/dts/imx7*":true,
            "arch/arm/dts/imx8*":true,
            "arch/arm/dts/imx28*":true,
            "arch/arm/dts/imx53*":true,
            "arch/arm/dts/imx6ulz*":true,
            "arch/arm/dts/imxr*":true,
            "arch/arm/dts/imx6ull-14x14-ddr3*":true,
            "arch/avr32":true,
            "arch/blackfin":true,
            "arch/m68k":true,
            "arch/microblaze":true,
            "arch/mips":true,
            "arch/nds32":true,
            "arch/nios2":true,
            "arch/openrisc":true,
            "arch/powerpc":true,
            "arch/sandbox":true,
            "arch/sh":true,
            "arch/sparc":true,
            "arch/x86":true,
            "arch/arm/mach-[a-h]*":true, 
            "arch/arm/mach-in*":true, 
            "arch/arm/mach-[j-z]*":true, 
            "arch/arm/mach-imx/imx9*":true, 
            "arch/arm/mach-imx/imx8*":true, 
            "arch/arm/mach-imx/imx7*":true, 
            "arch/arm/mach-imx/imx2*":true, 
            "arch/arm/mach-imx/imx3*":true, 
            "arch/arm/mach-imx/imx5*":true, 
            "arch/arm/mach-imx/imxr*":true, 
            "arch/arm/mach-imx/mx7*":true, 
            "arch/arm/mach-imx/mx2*":true, 
            "arch/arm/mach-imx/mx3*":true, 
            "arch/arm/mach-imx/mx5*":true, 
            "arch/arm/mach-imx/mxs*":true, 
            "arch/arm/cpu/arm11*":true,
            "arch/arm/cpu/arm720t":true,
            "arch/arm/cpu/arm9*":true,
            "arch/arm/cpu/armv7m":true,
            "arch/arm/cpu/armv8":true,
            "arch/arm/cpu/pxa":true,
            "arch/arm/cpu/sa1100":true,
            "board/[a-e]*":true,
            "board/[g-z]*":true,
            "board/[0-9]*":true,
            "board/[A-Z]*":true,
            "board/fir*":true,
            "board/freescale/b*":true,
            "board/freescale/l*":true,
            "board/freescale/m5*":true,
            "board/freescale/mp*":true,
            "board/freescale/c29*":true,
            "board/freescale/cor*":true,
            "board/freescale/mx7*":true,
            "board/freescale/mx2*":true,
            "board/freescale/mx3*":true,
            "board/freescale/mx5*":true,
            "board/freescale/p*":true,
            "board/freescale/q*":true,
            "board/freescale/t*":true,
            "board/freescale/v*":true,
            "board/freescale/mx6d*":true,
            "board/freescale/mx6q*":true,
            "board/freescale/mx6s*":true,
            "board/freescale/mx6m*":true,
            "board/freescale/mx6ul_*":true,
            "board/freescale/mx6ull_*":true,
            "board/freescale/imx8*":true,
            "board/freescale/imxr*":true,
            "board/freescale/s32*":true,
            "configs/[a-l]*":true,
            "configs/[n-z]*":true,
            "configs/[A-Z]*":true,
            "configs/M[a-z]*":true,
            "configs/M[A-Z]*":true,
            "configs/M[0-9]*":true,
            "configs/m[a-w]*":true,
            "configs/m[0-9]*":true,
            "configs/[0-9]*":true,
            "configs/mx6d*":true,
            "configs/mx6c*":true,
            "configs/mx6s*":true,
            "configs/mx6q*":true,
            "configs/mx6ul_*":true,
            "configs/mx6ulz_*":true,
            "configs/mx6m*":true,
            "configs/mx7*":true,
            "configs/mx23*":true,
            "configs/mx25*":true,
            "configs/mx28*":true,
            "configs/mx3*":true,
            "configs/mx5*":true,
            "include/configs/[a-l]*":true,
            "include/configs/[n-z]*":true,
            "include/configs/[A-Z]*":true,
            "include/configs/m[a-w]*":true,
            "include/configs/mx6c*":true,
            "include/configs/mx6d*":true,
            "include/configs/mx6q*":true,
            "include/configs/mx6s*":true,
            "include/configs/mx6ul_*":true,
            "include/configs/mx6ulz_*":true,
            "include/configs/mx7*":true,
            "include/configs/mx2*":true,
            "include/configs/mx3*":true,
            "include/configs/mx5*":true,
            "include/configs/m2*":true,
            "include/configs/m5*":true,
            "include/configs/[0-9]*":true
        }
    }

    上面将非 IMX6ULL 相关的内容都从搜索和文件夹里屏蔽掉了。

相关推荐
一个平凡而乐于分享的小比特9 天前
CPU上电启动到程序运行全流程详解
linux·uboot·根文件系统·cpu上电到启动
Y unes17 天前
《uboot基础命令记录①》
linux·驱动开发·嵌入式硬件·mcu·ubuntu·uboot
尘似鹤25 天前
Uboot移植--修改lcd和网络驱动
linux·学习·uboot
一个平凡而乐于分享的小比特1 个月前
U-Boot 和 Linux 内核的关系及设备树详解
linux·设备树·uboot
2401_853448231 个月前
U-boot引导Linux内核启动
linux·uboot·nfs·mmc·tftp·系统移植
夜月yeyue2 个月前
Linux 中断处理机制详解:上下半部、内核线程与中断线程化
linux·运维·单片机·嵌入式硬件·uboot·bootloard
碰大点3 个月前
第8章 zynq uboot更新系统镜像并引导启动和个人心得
驱动开发·fpga开发·uboot·zynq
夜月yeyue3 个月前
STM32 Flash 访问加速器详解(ART Accelerator)
linux·单片机·嵌入式硬件·uboot·bootloard
CheungChunChiu4 个月前
嵌入式 Linux 启动机制全解析:从 Boot 到 Rootfs
linux·运维·服务器·ubuntu·uboot·boot·extboot