3、开发环境搭建:RK SDK获取、交叉编译工具链配置、板端环境准备(ADB/SSH)
好,咱们正式开始动手了。这一章我带你把开发环境搭起来。说实话,环境搭建这事儿,看着琐碎,但真要是哪个环节出了岔子,后面调试的时候能把你折腾到怀疑人生。我自己就吃过这个亏——第一次调RK3588的ISP时,交叉编译链版本不对,编译出来的库在板子上跑起来直接段错误,查了整整两天才发现是工具链的问题。所以这一章,咱们一步一个脚印,把地基打牢。
3.1 RK SDK获取:从哪里开始?
瑞芯微的SDK,说白了就是一套完整的BSP包。里面包含了Linux内核、U-Boot、驱动、HAL层代码、ISP tuning工具等等。你拿到手的SDK版本,直接决定了你能调哪些功能。
SDK的获取方式,通常有两种:
- 官方Git仓库:瑞芯微在GitHub或Gitee上有官方仓库,比如
rk3588-linux或rk356x-android。但注意,很多内部代码是不开源的,你需要签NDA协议才能拿到完整包。 - 板卡厂商提供:如果你用的是第三方开发板(比如Firefly、友善之臂),厂商会提供定制好的SDK。我建议优先用厂商的,因为适配工作他们已经做了一部分。
我的个人习惯:拿到SDK后,第一件事不是编译,而是先看 README.md 和 docs/ 目录。里面通常会写明依赖的交叉编译链版本、编译步骤、已知问题。别跳过这一步,我见过太多人上来就 make,结果卡在某个莫名其妙的错误上。
下载SDK的命令,以RK3588为例:
# 从Gitee克隆(国内速度快)
git clone https://gitee.com/rockchip_linux/rk3588_linux_sdk.git
# 或者从GitHub
git clone https://github.com/rockchip-linux/rk3588_linux_sdk.git
# 进入目录,初始化子模块
cd rk3588_linux_sdk
git submodule update --init --recursive
嗯,这里要注意:子模块更新这一步很关键。SDK里很多驱动和HAL代码是以子模块形式引用的,你不更新,编译时会缺文件。我曾经有一次忘了执行这步,结果编译内核时报了一堆头文件找不到的错误,排查了半天才发现是子模块没拉下来。
3.2 交叉编译工具链配置:别让版本坑了你
交叉编译工具链,就是把你在PC上写的代码,编译成能在ARM板子上运行的二进制文件。瑞芯微官方推荐用 gcc-arm-10.3-2021.07 这个版本,但不同芯片可能有差异。
工具链的安装步骤:
- 从ARM官网或瑞芯微网盘下载预编译的工具链。
- 解压到
/opt/或/usr/local/目录。 - 配置环境变量,让系统能找到
aarch64-linux-gnu-gcc。
具体命令如下:
# 下载(以aarch64为例)
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.3-2021.07/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz
# 解压到/opt
sudo tar -xvf gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu.tar.xz -C /opt/
# 配置环境变量(写入~/.bashrc)
export PATH=/opt/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-none-linux-gnu-
export ARCH=arm64
# 使生效
source ~/.bashrc
# 验证
aarch64-none-linux-gnu-gcc --version
避坑指南:我曾经用gcc-9.2版本编译RK3588的ISP驱动,结果在板子上跑时,图像数据出现了奇怪的偏移。后来查了瑞芯微的论坛,才发现官方要求最低gcc-10.3。所以,工具链版本一定要和SDK文档里写的一致,别自作聪明用最新版。
另外,如果你同时开发多个项目(比如RK3566和RK3588),建议在 ~/.bashrc 里为每个项目单独配置别名:
alias rk3588_env='export PATH=/opt/gcc-arm-10.3-2021.07/bin:$PATH; export CROSS_COMPILE=aarch64-none-linux-gnu-'
alias rk3566_env='export PATH=/opt/gcc-arm-9.2-2019.12/bin:$PATH; export CROSS_COMPILE=aarch64-none-linux-gnu-'
这样切换项目时,只需要执行 rk3588_env 或 rk3566_env 就行,省得每次手动改环境变量。
3.3 板端环境准备:ADB与SSH
板子拿到手,第一件事是让它能联网、能通信。我一般同时准备 ADB 和 SSH 两种方式,因为调试时各有各的用处。
3.3.1 ADB:快速调试的利器
ADB(Android Debug Bridge)虽然名字带Android,但瑞芯微的Linux系统也支持。它通过USB连接,不需要网络,适合初期调试。
配置步骤:
- PC端安装ADB工具:
sudo apt install adb - 板端内核需要开启
CONFIG_USB_G_SERIAL和CONFIG_USB_CONFIGFS。 - 用USB线连接板子和PC,执行
adb devices查看是否识别。
注意:如果 adb devices 显示 unauthorized,需要在板子上确认授权。有些板子默认没开ADB,你得先通过串口登录,执行 start adbd 启动服务。
ADB的常用命令:
# 推送文件到板子
adb push ./test_isp /data/
# 从板子拉取文件
adb pull /data/log.txt ./
# 进入shell
adb shell
# 重启板子
adb reboot
我个人习惯用ADB来快速推送测试程序。比如编译了一个ISP tuning的测试工具,直接 adb push 到板子上跑,比用U盘拷来拷去快多了。
3.3.2 SSH:远程开发的标配
SSH适合长时间调试,尤其是你需要在板子上跑服务、看日志的时候。配置SSH分两步:板端开启SSH服务,PC端连接。
板端配置:
# 安装openssh-server(如果系统没有)
apt-get update
apt-get install openssh-server
# 启动SSH服务
/etc/init.d/ssh start
# 设置开机自启
update-rc.d ssh defaults
# 查看IP地址
ifconfig eth0
PC端连接:
ssh root@192.168.1.100 # 替换为板子的实际IP
我的经验:如果板子和PC不在同一个网段,可以用USB网卡或者通过路由器桥接。我遇到过最坑的情况是,板子的IP是动态分配的,每次重启IP都变。后来我直接在板子的 /etc/rc.local 里写死了静态IP,省得每次都要去查。
SSH连接成功后,我通常会做两件事:
- 用
scp传输大文件(比如编译好的内核镜像)。 - 用
screen或tmux保持会话,防止SSH断开后任务中断。
3.4 知识体系总览
下面这张图,我把本章的核心逻辑画出来了。你一看就明白:SDK是原材料,交叉编译链是工具,板端环境是战场。三者缺一不可。
3.5 环境验证:确保一切就绪
环境搭好了,怎么知道对不对?我一般跑一个简单的测试程序验证。
步骤1:编写测试代码
// test_env.c
#include <stdio.h>
int main() {
printf("RK ISP Development Environment OK!\n");
return 0;
}
步骤2:交叉编译
aarch64-none-linux-gnu-gcc test_env.c -o test_env
步骤3:推送到板子并运行
# 通过ADB
adb push test_env /data/
adb shell chmod +x /data/test_env
adb shell /data/test_env
# 或者通过SSH
scp test_env root@192.168.1.100:/tmp/
ssh root@192.168.1.100 /tmp/test_env
如果输出 RK ISP Development Environment OK!,说明环境搭建成功。如果报错,比如 No such file or directory,大概率是工具链版本不对,或者板子的glibc版本与编译链不匹配。
最后说一句:环境搭建这事儿,一次配好,后面能省下大把时间。我建议你把每一步都记录下来,尤其是工具链的路径和版本号。下次换电脑或者重装系统时,照着笔记来,十分钟就能恢复环境。