2. 开发环境搭建:Ubuntu交叉编译环境、SDK获取与编译、烧录工具与流程

做 Rockchip 平台开发,第一步就是把环境搭好。这事看着简单,但我在项目里见过太多人卡在环境上——不是工具链版本不对,就是 SDK 编译到一半报错。说白了,环境搭得顺不顺,直接影响后面几天的开发节奏。

这一节,我带你从头捋一遍。从 Ubuntu 系统准备,到交叉编译工具链安装,再到 SDK 获取、编译,最后把固件烧到板子上。每一步我都会把坑点指出来。

2.1 主机环境准备

我个人习惯用 Ubuntu 20.04 LTS 或 22.04 LTS。Rockchip 官方 SDK 对这两个版本支持最好。别用太新的版本,比如 Ubuntu 24.04,有些依赖包还没适配好。

硬件建议:CPU 至少 4 核,内存 16GB 以上,硬盘留出 200GB 空闲空间。SDK 解压后大概 30GB,编译过程中还会产生大量临时文件。

装好系统后,先更新软件源,再安装基础依赖包。我整理了一个清单,你直接复制执行就行:

sudo apt update
sudo apt upgrade -y

# 基础编译工具
sudo apt install -y git repo wget curl \
    build-essential cmake make gcc g++ \
    flex bison libncurses5-dev \
    libssl-dev libelf-dev

# Python 环境(SDK 脚本依赖)
sudo apt install -y python3 python3-pip python3-dev \
    python3-venv python3-setuptools

# 文件系统工具
sudo apt install -y dosfstools mtools \
    parted e2fsprogs genext2fs

# 其他常用工具
sudo apt install -y device-tree-compiler \
    u-boot-tools mtd-utils

小技巧:装完依赖后,建议重启一次系统。有些内核模块更新后需要重启才能生效。我吃过这个亏,编译到一半报缺少某个头文件,折腾半天才发现是没重启。

2.2 交叉编译工具链

交叉编译,说白了就是在 x86 的 PC 上编译出 ARM 架构的可执行文件。Rockchip 官方提供了两种工具链:

工具链类型 适用场景 下载方式
gcc-arm-8.3-2019.03 Linux 用户空间程序、内核模块 SDK 内置 / ARM 官网
gcc-arm-10.3-2021.07 较新内核(5.10+)、64位应用 SDK 内置 / ARM 官网
aarch64-linux-gnu Ubuntu 源直接安装(通用) sudo apt install gcc-aarch64-linux-gnu

我个人推荐用 SDK 内置的工具链。为什么?因为 Rockchip 团队已经测试过版本兼容性,你直接用就行,省得自己配环境变量。

安装步骤:

# 以 gcc-arm-8.3-2019.03 为例
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz

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

# 添加环境变量(建议写到 ~/.bashrc)
export PATH=/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64

注意:环境变量一定要写对。我见过有人把 CROSS_COMPILE 拼成 CROSS_COMPILER,编译内核时死活找不到工具链。检查方法很简单:执行 aarch64-linux-gnu-gcc --version,能正常输出版本号就说明配好了。

2.3 SDK 获取与目录结构

Rockchip 的 SDK 通过 repo 工具管理。repo 是 Google 为 Android 开发的 Git 仓库管理工具,Rockchip 把它拿来管理 Linux SDK 的多个子仓库。

获取 SDK 的流程:

  1. 安装 repo 工具
  2. 初始化 SDK 仓库
  3. 同步代码
# 安装 repo
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

# 创建 SDK 目录
mkdir -p ~/rk3588_sdk
cd ~/rk3588_sdk

# 初始化(以 RK3588 为例)
repo init -u https://github.com/rockchip-linux/manifests -b linux-5.10-gen-rkr4.1

# 同步代码(这一步耗时较长,建议用代理)
repo sync -j4

同步完成后,SDK 目录结构大致如下:

rk3588_sdk/
├── kernel/          # Linux 内核源码
├── u-boot/          # U-Boot 启动引导
├── buildroot/       # Buildroot 根文件系统
├── device/          # 设备树、板级配置
├── external/        # 第三方库、驱动
├── tools/           # 烧录工具、打包脚本
├── docs/            # 文档
└── rkbin/           # Rockchip 闭源二进制(ATF、DDR 初始化等)

经验之谈:第一次同步 SDK 时,网络不稳定容易中断。我建议用 repo sync -j4 --no-clone-bundle 参数,能减少因网络问题导致的失败。如果中途断了,重新执行 repo sync 会断点续传。

2.4 SDK 编译流程

编译 SDK 分三步:编译 U-Boot、编译内核、编译根文件系统。Rockchip 提供了自动化脚本,但理解每一步做了什么很重要。

2.4.1 编译 U-Boot

cd ~/rk3588_sdk/u-boot
make rk3588_defconfig
make -j$(nproc)

编译完成后,会在 u-boot/ 目录下生成 uboot.img 和 trust.img。这两个文件是启动流程的关键。

2.4.2 编译内核

cd ~/rk3588_sdk/kernel
make rockchip_linux_defconfig
make -j$(nproc) Image.gz dtbs

内核编译产物:

  • arch/arm64/boot/Image.gz — 压缩后的内核镜像
  • arch/arm64/boot/dts/rockchip/ — 设备树文件(.dtb)

注意:如果你改了设备树,一定要重新编译 dtbs。我遇到过有人只编译了内核,没编译设备树,结果板子启动后外设全不工作。排查了半天才发现是设备树没更新。

2.4.3 编译根文件系统

Rockchip SDK 默认用 Buildroot 构建根文件系统。编译命令:

cd ~/rk3588_sdk/buildroot
make rockchip_rk3588_defconfig
make -j$(nproc)

编译完成后,在 buildroot/output/images/ 下生成 rootfs.ext4 和 rootfs.squashfs。

2.4.4 打包固件

Rockchip 提供了打包脚本,把 U-Boot、内核、设备树、根文件系统打包成一个完整的固件镜像:

cd ~/rk3588_sdk
./mkfirmware.sh

打包完成后,在 rockdev/ 目录下生成 update.img。这个文件就是最终要烧录到板子上的固件。

2.5 烧录工具与流程

Rockchip 的烧录工具叫 RKDevTool,支持 Windows 和 Linux 版本。我个人更推荐用 Linux 版的 upgrade_tool,命令行操作,方便集成到自动化脚本中。

2.5.1 安装烧录工具

# 下载 Linux 版烧录工具
wget https://github.com/rockchip-linux/tools/raw/master/rkdeveloptool

# 赋予执行权限
chmod +x rkdeveloptool

# 移动到系统路径
sudo mv rkdeveloptool /usr/local/bin/

2.5.2 进入烧录模式

Rockchip 板子有两种烧录模式:

  • Maskrom 模式:板子完全没固件时进入,通过短接 eMMC 的 CLK 和 GND 引脚触发
  • Loader 模式:板子上已有 U-Boot,通过按住 Recovery 键上电进入

我个人习惯用 Loader 模式,操作简单。具体步骤:

  1. 按住板子上的 Recovery 键
  2. 保持按住,给板子上电
  3. 等待 2 秒后松开 Recovery 键
  4. 用 USB 线连接板子和 PC

2.5.3 烧录固件

# 检查设备是否识别
sudo rkdeveloptool ld

# 如果输出 "Device Not Found",检查 USB 驱动或烧录模式

# 烧录固件
sudo rkdeveloptool db rk3588_sdk/rockdev/loader.img
sudo rkdeveloptool wl 0 rk3588_sdk/rockdev/update.img
sudo rkdeveloptool rd

命令说明:

  • db — 下载并运行 loader
  • wl — 写入固件到指定地址(0 表示起始地址)
  • rd — 重启设备

避坑指南:烧录过程中千万不要拔掉 USB 线。我曾经有一次烧录到 80% 时不小心碰掉了 USB 线,结果板子变砖了。后来用 Maskrom 模式重新烧录才救回来。如果烧录失败,先检查 USB 线质量,换根好点的线试试。

2.6 开发环境全景图

下面这张图把整个开发环境搭建的流程串起来了。你可以把它贴在工位旁边,每次搭环境时对照着看。

Rockchip 开发环境搭建流程 Rockchip 开发环境搭建全景图 阶段一:主机准备 Ubuntu 20.04/22.04 LTS 阶段二:工具链安装 gcc-arm-8.3 / 10.3 阶段三:SDK获取 repo init + repo sync 阶段四:SDK 编译(三件套) U-Boot uboot.img + trust.img Kernel Image.gz + dtbs Rootfs rootfs.ext4 阶段五:打包固件 ./mkfirmware.sh → update.img 阶段六:烧录到板子 rkdeveloptool → Loader/Maskrom 模式 提示:每个阶段都有对应的验证方法,建议按顺序执行,不要跳步

2.7 环境验证清单

环境搭完后,别急着写代码。先跑一遍验证清单,确保每个环节都正常:

检查项 验证命令 预期结果
交叉编译工具链 aarch64-linux-gnu-gcc --version 输出版本号,无报错
内核编译 make -j4 Image.gz 生成 arch/arm64/boot/Image.gz
设备树编译 make dtbs 生成对应 .dtb 文件
U-Boot 编译 make rk3588_defconfig && make 生成 uboot.img
烧录工具 rkdeveloptool ld 识别到设备(Loader 模式下)

我的习惯:每次搭完新环境,我都会编译一个最小的内核(只选必要的驱动),然后烧录到板子上验证能否启动。这一步能快速暴露环境问题,避免后面写了一大堆代码才发现工具链有问题。

环境搭建就到这里。记住一个原则:环境问题不要拖。遇到编译报错,先看日志,再查文档,最后问社区。别硬扛,也别跳过。环境稳了,后面的开发才能顺。