2. 开发环境搭建:交叉编译工具链安装与源码获取

做嵌入式开发,环境搭建是第一步。这一步要是没弄好,后面全是坑。我见过不少新手,花了一周时间在 U-Boot 编译报错上,最后发现是工具链版本不对。嗯,咱们今天就把这事一次性搞定。

2.1 交叉编译工具链安装

说白了,交叉编译就是在 PC 上编译出能在 ARM 芯片上跑的程序。你想想看,你的电脑是 x86 架构,Rockchip 芯片是 ARM 架构,不用交叉编译工具链,根本没法干活。

我个人习惯用 gcc-arm-8.3-2019.03 这个版本。为什么选它?因为 Rockchip 官方 BSP 对这个版本支持最好,我在 RK3399 和 RK3568 项目上都验证过,没出过兼容性问题。

2.2.1 下载与解压

# 下载工具链
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz

# 解压到 /opt 目录
sudo tar -xvf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz -C /opt/

# 重命名(方便后续管理)
sudo mv /opt/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf /opt/gcc-arm-8.3
我的建议:别把工具链解压到用户目录下。放到 /opt 或 /usr/local,这样多用户都能用,也方便后续脚本引用。

2.2.2 配置环境变量

解压完只是第一步,你得让系统知道工具链在哪。我习惯把配置写到 ~/.bashrc 里,这样每次打开终端自动生效。

# 编辑 ~/.bashrc
vim ~/.bashrc

# 在文件末尾添加
export PATH=/opt/gcc-arm-8.3/bin:$PATH
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm

# 使配置生效
source ~/.bashrc

验证一下是否安装成功:

arm-linux-gnueabihf-gcc --version

# 输出应该类似:
# arm-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 8.3-2019.03) 8.3.0
注意:我曾经遇到过 PATH 配置冲突的问题。如果你之前装过其他版本的交叉工具链,记得检查一下 PATH 顺序。系统会优先使用先找到的那个版本,版本不对编译会报一些莫名其妙的错误。

2.2 依赖库安装

U-Boot 编译需要一些基础依赖库。少了这些,编译到一半就会卡住。我整理了一个清单,你直接照着装就行。

依赖库 用途 安装命令
build-essential 基础编译工具 sudo apt install build-essential
flex 词法分析器 sudo apt install flex
bison 语法分析器 sudo apt install bison
libncurses-dev 菜单配置界面 sudo apt install libncurses-dev
libssl-dev SSL 支持 sudo apt install libssl-dev
device-tree-compiler 设备树编译 sudo apt install device-tree-compiler
u-boot-tools U-Boot 镜像工具 sudo apt install u-boot-tools

一键安装命令:

sudo apt update
sudo apt install -y build-essential flex bison libncurses-dev libssl-dev device-tree-compiler u-boot-tools

嗯,这里要注意一下。如果你用的是 Ubuntu 20.04 以上版本,u-boot-tools 可能已经改名叫 u-boot-tools 了,但包名没变。我在 Ubuntu 22.04 上测试过,直接装就行。

2.3 源码获取

源码获取有两种方式:从官方仓库 clone,或者从 Rockchip 的 GitHub 仓库拉取。我个人推荐用 Rockchip 的仓库,因为里面已经包含了针对 Rockchip 平台的补丁和配置。

2.3.1 从官方 U-Boot 仓库获取

git clone https://github.com/u-boot/u-boot.git
cd u-boot
git checkout v2023.10  # 选择一个稳定版本

2.3.2 从 Rockchip 官方仓库获取(推荐)

git clone https://github.com/rockchip-linux/u-boot.git
cd u-boot
git checkout next-dev  # Rockchip 开发分支
我的经验:Rockchip 的仓库更新频率很高,基本跟着官方主线走。但有时候他们会加一些临时补丁,这些补丁在主线合入前可能会有变动。如果你做产品开发,建议锁定一个经过验证的 commit。

2.4 目录结构解析

U-Boot 的目录结构看起来复杂,其实核心就几个部分。我画了一张图,帮你快速建立整体认知。

U-Boot 目录结构核心模块 u-boot/ (根目录) arch/ board/ configs/ drivers/ arm/ include/ cpu/ rockchip/ common/ rk3399_defconfig rk3568_defconfig rk3588_defconfig mmc/ serial/ net/ include/ common/ lib/ 说明:arch/ 存放 CPU 架构相关代码,board/ 存放板级初始化代码,configs/ 存放默认配置文件 drivers/ 存放外设驱动,include/ 存放头文件,common/ 存放通用功能,lib/ 存放库函数

下面我把几个关键目录展开说一下,这些是移植过程中打交道最多的。

2.4.1 arch/ — 架构相关代码

这里面放的是 CPU 架构相关的代码。对于 Rockchip 平台,我们主要关注 arch/arm/ 目录。里面又细分了 cpu/(CPU 初始化)、include/(架构头文件)、mach-rockchip/(Rockchip 平台特有代码)。

2.4.2 board/ — 板级初始化代码

每个开发板都有自己的目录。Rockchip 的板级代码在 board/rockchip/ 下。比如 board/rockchip/evb_rk3399/ 就是 RK3399 评估板的初始化代码。移植时,你通常需要在这里新建一个板级目录。

2.4.3 configs/ — 默认配置文件

这里存放着各个开发板的默认配置。文件名格式是 <板子名>_defconfig。比如 rk3399_defconfig、rk3568_defconfig。编译时用 make rk3399_defconfig 就能加载对应的配置。

2.4.4 drivers/ — 驱动代码

U-Boot 的驱动框架很清晰。串口驱动在 drivers/serial/,MMC/SD 卡驱动在 drivers/mmc/,网络驱动在 drivers/net/。Rockchip 平台的驱动通常以 rockchip_ 开头。

2.4.5 dts/ — 设备树文件

这个目录在较新版本的 U-Boot 中独立出来了。设备树描述了硬件信息,Rockchip 平台的设备树文件在 dts/ 或 arch/arm/dts/ 下。文件名类似 rk3399-evb.dts。

快速上手命令:

# 查看目录结构(只显示第一层)
ls -1 u-boot/

# 查看 Rockchip 相关配置
ls configs/ | grep rk

# 查看 Rockchip 板级代码
ls board/rockchip/
避坑指南:我曾经在移植时犯过一个低级错误——直接修改了 configs/ 下的默认配置文件,结果 git pull 时冲突了。正确的做法是:用 make menuconfig 生成 .config,然后保存成自己的配置文件,不要动原来的 _defconfig。

好了,环境搭建这部分就到这里。工具链装好了,源码拉下来了,目录结构也清楚了。下一步就可以开始真正的移植工作了。