前提说明
本专题基于正点原子 ALPHA 开发板,移植 NXP 的原厂 U-Boot 2020.04 版本,后续也可能新增新版本的 U-Boot 移植;
本文参考了 i.MX6ULL - 从零开始移植uboot-imx_v2020.04_5.4.70_2.3.0。在其基础上,详细记录说明每一步操作的缘由,基于个人学习体会。
开发环境搭建
-
基于 WSL2 + Ubuntu-22.04 TLS 开发环境(自行搭建)
-
交叉编译工具,可以参考此篇 下载较老版本或最新版本的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 里面,目录位置任意,自己记住即可!
-
编译uboot和内核所必须的依赖库安装
bashsudo apt-get install -y libncurses5-dev lsb-core lib32stdc++6 bison flex lzop git bear
NXP 官方 U-Boot 编译
-
官方 U-Boot 位于 Github 上:
bashgit 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上面,后续实验基于该分支进行。 -
编写一个构建脚本
build.sh在uboot-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 跳转;
-
给 build.sh 脚本新增执行权限,并且进行编译:
bashchmod +x build.sh ./build.sh -
编写 usb 下载脚本,用于通过 usb 烧录镜像到开发板,方便后续开发验证程序,如果你使用 SD 卡,跳过该步骤即可。
在 Ubuntu-22.04 环境下直接通过
sudo apt-get install uuu即可下载 uuu 工具,如果其它环境请自行参考官方 mfgtools编写烧录脚本
flash.shbash#!/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." -
将开发板切换到 USB 启动,然后复位即可通过 flash.sh 脚本将镜像烧录。

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

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

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

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

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

-
屏蔽掉一些非 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 相关的内容都从搜索和文件夹里屏蔽掉了。