3. 获取Rockchip官方SDK:仓库结构、Repo同步与分支选择

做Rockchip平台开发,第一步就是拿到官方SDK。很多新手上来就急着git clone,结果发现仓库根本拉不全,或者拉下来编译报错。嗯,这里面的门道,我花了不少时间才摸清楚。

Rockchip的SDK不是单个git仓库,而是一组仓库的集合。说白了,它用Google的Repo工具来管理。你想想看,一个完整的BSP包含U-Boot、Kernel、Buildroot、RGA驱动、Mali GPU驱动、NPU工具链……如果每个都单独维护,版本对齐就是个噩梦。

3.1 SDK仓库结构解析

先看看Rockchip官方SDK长什么样。以RK3588的Linux SDK为例,它的顶层结构是这样的:

rk3588-linux/
├── .repo/              # Repo的元数据目录,别手动改
├── u-boot/             # 引导加载程序
├── kernel/             # Linux内核(5.10或6.1)
├── buildroot/          # Buildroot构建系统
├── device/             # 设备配置与分区表
├── external/           # 第三方组件
│   ├── rkwifibt/       # WiFi/BT驱动
│   ├── camera_engine/  # 摄像头算法库
│   └── drm/            # DRM显示驱动
├── prebuilts/          # 预编译工具链
├── tools/              # 烧录与调试工具
└── docs/               # 文档(有时很旧)

每个目录都有自己的git仓库。我刚开始接触时,以为.repo是多余的,删过一次……结果整个SDK就废了。千万别碰.repo目录,它是Repo工具的命根子。

目录 作用 我踩过的坑
u-boot/ 引导加载程序,负责初始化DDR、加载内核 分支选错,板子直接变砖
kernel/ Linux内核,包含Rockchip的板级补丁 设备树文件经常要自己改
buildroot/ 根文件系统构建工具 默认配置不带Qt,得自己加
device/ 板级配置、分区表、参数文件 分区大小改错,系统起不来
external/ Rockchip私有库和驱动 版本不匹配,编译报一堆错

3.2 使用Repo同步源码

Repo是Google为Android开发的管理工具,Rockchip拿来管理BSP。它的核心是一个manifest文件,里面列出了所有子仓库的地址和分支。

同步步骤其实很简单:

  1. 安装Repo:sudo apt install repo 或者从Google官方下载
  2. 初始化:repo init -u <manifest_url> -b <branch>
  3. 同步:repo sync -c -j4

我个人习惯用-j4,网络好的话可以开到-j8。但别贪多,我试过-j16,结果服务器把我限流了,反而更慢。

小技巧:第一次同步时加--no-clone-bundle参数,可以避免下载预打包的bundle文件,有时候反而更快。

同步完成后,所有子仓库都处于detached HEAD状态。什么意思?就是没有分支名,只有commit ID。这时候如果你想改代码,记得先建个本地分支:

cd kernel
git checkout -b my-feature-branch

我曾经直接改代码没建分支,结果repo sync后所有修改全丢了……嗯,血的教训。

3.3 SDK目录功能详解

咱们挑几个关键目录深入看看。

device/ 目录

这个目录存放板级配置。以RK3588 EVB为例:

device/rockchip/
├── rk3588/
│   ├── BoardConfig.mk       # 板级编译配置
│   ├── parameter.txt        # 分区表
│   ├── recovery.sh          # 恢复模式脚本
│   └── rk3588_evb7.dts      # 设备树

BoardConfig.mk里定义了用什么内核、什么文件系统、分区大小。我改得最多的就是parameter.txt,因为产品需求不同,分区大小经常要调。

external/ 目录

这里放的是Rockchip的私有组件。比如rkwifibt是WiFi和蓝牙驱动,camera_engine是ISP算法库。这些组件通常不开源,只提供二进制文件。

注意:external目录下的组件版本必须和内核版本匹配。我曾经把RK3588的WiFi驱动用在RK3568上,编译能过,但运行时WiFi死活连不上。

prebuilts/ 目录

预编译工具链。Rockchip提供了aarch64的交叉编译工具链,省去了自己编译gcc的麻烦。不过版本比较老,如果你要用新特性,可以自己换。

3.4 版本管理与分支选择

Rockchip的分支命名有规律。以RK3588为例:

分支名 内核版本 适用场景
rk3588/linux-5.10.y 5.10 稳定版,推荐量产
rk3588/linux-6.1.y 6.1 新特性,但驱动可能不全
rk3588/linux-next 开发版 尝鲜,别用于产品

我建议新手选linux-5.10.y。为什么?因为Rockchip对5.10的支持最成熟,文档最多,社区问题也最多。6.1虽然新,但有些驱动还没完全稳定。

选择分支时,还要注意manifest文件里的版本号。Rockchip会定期发布release版本,比如V3.0、V3.1。这些release版本经过了内部测试,比直接拉分支更可靠。

我的经验:量产项目一定要用release版本,不要用daily build。我曾经为了一个新功能用了daily build,结果发现NPU驱动有bug,折腾了两天才回退。

最后,画一张图总结一下SDK的获取和结构:

Rockchip SDK获取与结构概览 Rockchip SDK 获取与结构 Repo init + Repo sync Manifest 文件(.repo/manifest.xml) 分支选择 同步完成 目录结构 分支选择建议 • linux-5.10.y(稳定) • linux-6.1.y(新特性) • release版本(量产) 同步后状态 detached HEAD 需建本地分支 核心目录 • u-boot/ • kernel/ • buildroot/ 不要手动修改 .repo 目录!

这张图把整个流程串起来了。从repo init开始,manifest文件决定了拉哪些仓库、用什么分支。同步完成后,你得到的就是一个完整的、版本对齐的SDK。