2、开发环境搭建:Ubuntu 22.04环境配置,交叉编译工具链安装,Repo与Git管理SDK
做嵌入式Linux开发,环境搭建是第一道坎。很多人觉得装个系统、装个编译器有什么难的?但我在带新人时发现,十有八九的问题都出在环境上——要么是Python版本不对,要么是工具链路径没配好,要么是Repo同步到一半断了。
这一章,我就带你一步步把环境搭扎实。我们用的是Ubuntu 22.04 LTS,Rockchip官方SDK目前对这个版本支持最好。
2.1 Ubuntu 22.04 基础环境配置
我个人习惯装完系统第一件事就是换源。国内网络环境你懂的,不换源的话,apt install能等到你怀疑人生。
# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 替换为清华源(Ubuntu 22.04 Jammy)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y
接下来安装必备软件包。Rockchip SDK编译依赖比较多,我整理了一份清单,直接复制执行就行。
sudo apt install -y \
git repo curl wget \
build-essential lzop libncurses5-dev \
libssl-dev libelf-dev device-tree-compiler \
python3 python3-pip python3-dev \
bison flex gawk \
cpio rsync unzip zip \
pkg-config libc6-i386 lib32stdc++6 \
libgmp-dev libmpc-dev libmpfr-dev \
texinfo u-boot-tools \
dosfstools mtools \
parted gdisk \
file
2.2 交叉编译工具链安装
交叉编译工具链,说白了就是在一台x86电脑上编译出能在ARM芯片上跑的程序。Rockchip官方推荐使用ARM GCC工具链,版本是 gcc-arm-10.3-2021.07。
为什么选这个版本?我试过更新的11.x和12.x,编译Linux内核时偶尔会报一些奇怪的警告,虽然不影响功能,但看着烦。10.3这个版本经过Rockchip官方验证,最稳。
2.2.1 下载与解压
# 创建工具链目录
mkdir -p ~/toolchain
cd ~/toolchain
# 下载ARM GCC 10.3
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/binrel/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
# 解压
tar -xf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
2.2.2 配置环境变量
我个人习惯把工具链路径加到 ~/.bashrc 里,这样每次打开终端自动生效。
echo 'export PATH=$PATH:~/toolchain/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin' >> ~/.bashrc
source ~/.bashrc
# 验证安装
aarch64-none-linux-gnu-gcc --version
如果看到输出类似 gcc version 10.3.1 20210621 (GNU Toolchain for the A-profile Architecture 10.3-2021.07),说明安装成功。
sudo apt install libc6-i386 lib32stdc++6
2.3 Repo与Git管理SDK
Rockchip的SDK体量很大,包含U-Boot、Linux内核、Buildroot、RKNN等多个仓库。如果用传统的git submodule管理,你会疯掉的——依赖关系太复杂了。
Repo是Google为Android开发的多仓库管理工具,Rockchip借鉴了这套方案。你想想看,一个 repo sync 就能拉下几十个仓库,是不是很爽?
2.3.1 安装Repo
# 下载Repo脚本
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
# 添加到PATH
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
2.3.2 初始化SDK
以RK3588为例,Rockchip官方SDK的manifest文件在GitHub上。
# 创建工作目录
mkdir -p ~/rk3588_sdk
cd ~/rk3588_sdk
# 初始化Repo
repo init -u https://github.com/rockchip-linux/manifests.git -b master -m rk3588_linux.xml
# 同步代码(这一步很耗时,建议用 -j4 或 -j8 加速)
repo sync -j8 --no-tags
同步完成后,你会看到类似这样的目录结构:
| 目录/文件 | 说明 |
|---|---|
| u-boot/ | U-Boot引导加载程序 |
| kernel/ | Linux内核源码(5.10或6.1) |
| buildroot/ | Buildroot根文件系统构建 |
| rkbin/ | Rockchip闭源二进制文件(DDR初始化、M0固件等) |
| device/rockchip/ | 设备树、板级配置、分区表 |
| external/ | 第三方库和工具 |
| docs/ | 官方文档和Release Notes |
2.3.3 Repo常用操作
刚开始用Repo时,我总记不住命令。后来总结了一张速查表,贴在我的显示器边上。
| 命令 | 作用 | 使用场景 |
|---|---|---|
repo sync -j8 |
同步所有仓库到最新 | 每天开始工作前执行 |
repo start <branch> --all |
在所有仓库创建新分支 | 开始一个新功能开发 |
repo status |
查看所有仓库的修改状态 | 检查哪些文件被改了 |
repo diff |
查看所有仓库的差异 | 提交前做代码审查 |
repo upload |
提交代码到Gerrit审核 | 团队协作时使用 |
repo forall -c "git log --oneline -5" |
在所有仓库执行git命令 | 批量操作,比如查看最近提交 |
repo sync 过程中强制中断!我有个同事因为网络不好,Ctrl+C了三次,结果manifest文件损坏,所有仓库状态混乱,最后只能删掉重来。如果网络慢,用 repo sync -j4 降低并发数。
2.4 环境验证
环境搭好了,我们来验证一下。写一个简单的Hello World,交叉编译后在目标板上运行。
# 创建测试文件
cat > hello.c << 'EOF'
#include <stdio.h>
int main() {
printf("Hello from Rockchip!\n");
return 0;
}
EOF
# 交叉编译
aarch64-none-linux-gnu-gcc -o hello hello.c
# 查看文件信息
file hello
# 输出应为:hello: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV)
看到 ARM aarch64 就对了。把这个文件拷贝到开发板上,执行 ./hello,如果打印出 "Hello from Rockchip!",说明整个工具链环境完全OK。
环境搭建到这里就完成了。你可能会问:为什么不用Docker?嗯,Docker确实方便,但做内核移植时经常需要操作USB设备、挂载分区、烧录固件,这些在容器里搞起来很麻烦。我个人建议至少在开发阶段用原生系统,等流程稳定了再考虑容器化。