3. SDK获取与结构:Rockchip官方SDK下载、目录结构解析、Git分支管理策略

做Rockchip平台开发,第一件事就是拿到SDK。很多新手上来就问「SDK去哪下」,其实这里头有不少门道。我最早接触RK3399时,也踩过下载的坑——下错了分支,编译到一半发现缺文件,白白浪费一整天。

这一章,咱们就把SDK的获取、目录结构、Git分支策略讲透。你跟着走一遍,后面就顺了。

3.1 官方SDK下载渠道与方式

Rockchip官方SDK托管在GitLab上,地址是:https://gitlab.com/rockchip_linux。不过,直接去GitLab拉取需要权限,你得先注册账号并申请。

我个人习惯用另一种方式——通过Rockchip发布的SDK压缩包。官方会定期打包完整SDK,放在百度网盘或阿里云OSS上。你拿到压缩包后,解压就能用,省去Git拉取的等待时间。

小提示: 如果你在公司内网开发,建议先下载完整压缩包,再传到内网Git服务器。我有个项目团队在海外,直接拉GitLab慢到崩溃,后来改用压缩包+内网同步,效率翻倍。

下载时要注意版本匹配。Rockchip SDK按芯片系列分仓库,比如RK356x、RK3588、RK3399等。你选错了,编译肯定报错。

芯片系列 SDK仓库名 Linux内核版本 适用场景
RK3566/RK3568 rk356x_linux_sdk 4.19 / 5.10 平板、盒子、边缘计算
RK3588/RK3588S rk3588_linux_sdk 5.10 高性能AI、NVR、平板
RK3399 rk3399_linux_sdk 4.4 / 4.19 行业平板、广告机
RV1126/RV1109 rv1126_linux_sdk 4.19 IPC、摄像头

下载命令很简单,以RK3588为例:

# 方式一:通过GitLab直接拉取(需要权限)
git clone https://gitlab.com/rockchip_linux/rk3588_linux_sdk.git

# 方式二:从压缩包解压后初始化
tar -xvf rk3588_linux_sdk_v1.0.0.tar.gz
cd rk3588_linux_sdk
.repo/repo/repo sync -l  # 本地同步,不联网
注意: 压缩包解压后,必须执行 repo sync -l 来初始化本地Git仓库。我曾经跳过这步,直接编译,结果u-boot源码是空的,排查了半天才发现。

3.2 SDK目录结构深度解析

解压完SDK,你会看到一堆目录。别慌,Rockchip的目录设计其实很有规律。我把它分成三层来理解:顶层、组件层、构建层。

3.2.1 顶层目录一览

进入SDK根目录,执行 ls -la,你会看到:

.
├── .repo/          # repo工具管理目录,存放manifest和所有仓库元数据
├── app/            # 上层应用(可选,部分SDK有)
├── buildroot/      # Buildroot构建系统(如果使用Buildroot)
├── device/         # 设备树、板级配置、分区表
├── docs/           # 文档(英文为主,中文较少)
├── external/       # 第三方库、驱动、工具
├── kernel/         # Linux内核源码
├── prebuilts/      # 预编译工具链、二进制文件
├── rkbin/          # Rockchip闭源固件(ATF、DDR初始化、M0固件)
├── rockdev/        # 打包脚本、镜像输出目录
├── tools/          # 烧录工具、调试工具
├── u-boot/         # U-Boot引导加载程序
└── yocto/          # Yocto构建系统(如果使用Yocto)

这里面,kernel/、u-boot/、rkbin/ 是核心三件套。你改驱动、调启动、加外设,基本都在这三个目录里转。

3.2.2 关键目录详解

device/ 目录:这是板级配置的核心。每个开发板对应一个子目录,比如 device/rockchip/rk3588/。里面放着:

  • BoardConfig.mk:板级编译配置,定义芯片型号、DDR大小、存储介质
  • parameter.txt:分区表,定义每个分区的大小和起始地址
  • recovery/:恢复模式相关文件

rkbin/ 目录:这个目录很特殊。它存放的是Rockchip的闭源二进制固件,包括:

  • bin/ddr/:DDR初始化固件,不同DDR频率对应不同文件
  • bin/rkxx/:ATF(ARM Trusted Firmware)、OP-TEE
  • bin/mcu/:M0协处理器固件(用于PMU、低功耗管理)
重点: rkbin里的文件是闭源的,你拿不到源码。如果遇到DDR兼容性问题,只能找Rockchip FAE要新版本替换。我在RK3568项目上就遇到过DDR4 3200不稳定,换了rkbin里的DDR固件才解决。

rockdev/ 目录:编译完成后,生成的镜像文件会放在这里。常见的镜像有:

  • boot.img:内核+设备树+ramdisk
  • rootfs.img:根文件系统
  • update.img:完整升级包(包含所有分区)
  • parameter.txt:分区表(打包时会复制过来)

3.2.3 构建系统目录

Rockchip SDK支持三种构建系统:Buildroot、Yocto、Debian。你选哪个,对应的目录就生效。

构建系统 目录 特点 适合场景
Buildroot buildroot/ 轻量、配置简单、生成最小系统 嵌入式产品、资源受限设备
Yocto yocto/ 功能强大、可定制性强、学习曲线陡 复杂产品、需要大量软件包
Debian debian/(部分SDK有) 直接生成Debian根文件系统 快速原型、桌面级应用

我个人偏爱Buildroot,因为它快。Yocto第一次编译要下载几百兆源码,Buildroot半小时就能出镜像。但如果你需要Debian的apt包管理,那就得用Debian构建方式。

3.3 Git分支管理策略

Rockchip SDK使用 repo 工具管理多个Git仓库。repo是Google为Android开发的多仓库管理工具,Rockchip拿来管理Linux SDK,效果也不错。

3.3.1 repo的基本用法

SDK根目录下有个 .repo/ 目录,里面记录了所有子仓库的地址和分支信息。你不需要手动去每个仓库拉代码,一条命令搞定:

# 同步所有仓库到本地
.repo/repo/repo sync

# 切换到指定分支(所有仓库一起切)
.repo/repo/repo init -m manifest_rk3588.xml
.repo/repo/repo sync

# 查看当前所有仓库的分支状态
.repo/repo/repo status

这里有个关键文件:.repo/manifest.xml。它定义了SDK包含哪些仓库、每个仓库的远程地址、默认分支。你打开看看,会发现类似这样的内容:

<manifest>
  <remote name="rockchip" fetch="https://gitlab.com/rockchip_linux/" />
  <default revision="rk3588/linux-5.10.y" remote="rockchip" />
  <project path="kernel" name="rk3588_kernel" />
  <project path="u-boot" name="rk3588_u-boot" />
  <project path="rkbin" name="rkbin" />
  ...
</manifest>

你看,default revision 定义了所有仓库的默认分支。Rockchip的分支命名规则是 芯片系列/内核版本,比如 rk3588/linux-5.10.y。

3.3.2 分支策略与选择

Rockchip官方维护多个分支,每个分支对应不同的内核版本和功能集。我建议你按这个策略选:

  • 稳定分支:rkxx/linux-x.x.y,比如 rk3588/linux-5.10.y。这是官方测试过的稳定版本,适合量产。
  • 开发分支:rkxx/linux-x.x.y-next,包含最新功能但可能有bug。适合尝鲜或验证新硬件。
  • 芯片分支:rkxx/master,针对特定芯片的持续集成分支。我一般不看这个,太不稳定。
经验之谈: 量产项目一定要锁定分支。我见过有人用 rk3588/master 开发,结果某天repo sync后内核API变了,驱动编译不过,紧急回退才救回来。用稳定分支,别追新。

3.3.3 本地分支管理技巧

你拿到SDK后,肯定要改代码。怎么管理自己的修改?我推荐这套流程:

  1. 在需要修改的仓库里创建本地分支,比如 kernel/ 目录下:
cd kernel
git checkout -b my_feature_branch
  1. 修改代码、提交:
git add .
git commit -m "feat: add my custom driver"
  1. 当官方SDK更新时,先切回主分支拉取最新代码:
git checkout rk3588/linux-5.10.y
git pull
git checkout my_feature_branch
git rebase rk3588/linux-5.10.y  # 变基,解决冲突

为什么要用rebase而不是merge?因为rebase能让你的提交历史保持线性,方便后续提交补丁或生成patch。我在团队里推行这个策略,代码review时清晰很多。

注意: 不要在 .repo/ 目录里直接改东西。repo sync时会覆盖它。你的所有修改都应该在子仓库里完成,并且用Git管理。

3.4 SDK结构全景图

说了这么多,咱们用一张图把SDK的整体结构串起来。你看着这张图,就能理解各个组件怎么配合。

Rockchip SDK 整体结构图 Rockchip SDK 整体结构 SDK 根目录 (rk3588_linux_sdk) kernel/ (Linux内核) u-boot/ (引导加载程序) rkbin/ (闭源固件) device/ (板级配置) external/ (第三方库) prebuilts/ (工具链) buildroot/ (Buildroot) yocto/ (Yocto) Debian rockdev/ (镜像输出) boot.img + rootfs.img + update.img 核心三件套:kernel + u-boot + rkbin 决定系统能否启动;device/ 决定板级适配;构建系统决定根文件系统 最终产物在 rockdev/ 目录下,用于烧录或升级

这张图把SDK的层次关系讲清楚了。从上到下依次是:SDK根目录 → 核心组件(kernel/u-boot/rkbin)→ 板级配置与工具链 → 构建系统 → 镜像输出。你每次编译,数据流都是这样走的。

3.5 避坑指南与最佳实践

最后,分享几个我踩过的坑,你遇到了能少走弯路。

坑1:repo sync 失败
网络不稳定时,repo sync会中断。解决办法:加 --no-tags 参数跳过标签下载,或者用 repo sync -j1 单线程重试。我写了个脚本,自动重试3次,基本都能拉完。
坑2:分支混乱
多个仓库同时开发时,容易搞混当前分支。我习惯在 kernel/ 和 u-boot/ 目录里用 git branch 确认。更保险的做法是,在本地分支名里加上项目名,比如 projectA_kernel_v2。
坑3:rkbin版本不匹配
rkbin里的固件必须与内核版本匹配。我遇到过RK3588用新内核但rkbin是旧的,结果ATF初始化失败,串口没输出。解决办法:每次更新SDK时,检查 rkbin/ 的提交日志,确保与内核同步。