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 的流程:
- 安装 repo 工具
- 初始化 SDK 仓库
- 同步代码
# 安装 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 模式,操作简单。具体步骤:
- 按住板子上的 Recovery 键
- 保持按住,给板子上电
- 等待 2 秒后松开 Recovery 键
- 用 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— 下载并运行 loaderwl— 写入固件到指定地址(0 表示起始地址)rd— 重启设备
避坑指南:烧录过程中千万不要拔掉 USB 线。我曾经有一次烧录到 80% 时不小心碰掉了 USB 线,结果板子变砖了。后来用 Maskrom 模式重新烧录才救回来。如果烧录失败,先检查 USB 线质量,换根好点的线试试。
2.6 开发环境全景图
下面这张图把整个开发环境搭建的流程串起来了。你可以把它贴在工位旁边,每次搭环境时对照着看。
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 模式下) |
我的习惯:每次搭完新环境,我都会编译一个最小的内核(只选必要的驱动),然后烧录到板子上验证能否启动。这一步能快速暴露环境问题,避免后面写了一大堆代码才发现工具链有问题。
环境搭建就到这里。记住一个原则:环境问题不要拖。遇到编译报错,先看日志,再查文档,最后问社区。别硬扛,也别跳过。环境稳了,后面的开发才能顺。