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
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
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 开发分支
2.4 目录结构解析
U-Boot 的目录结构看起来复杂,其实核心就几个部分。我画了一张图,帮你快速建立整体认知。
下面我把几个关键目录展开说一下,这些是移植过程中打交道最多的。
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。
好了,环境搭建这部分就到这里。工具链装好了,源码拉下来了,目录结构也清楚了。下一步就可以开始真正的移植工作了。