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拉取的等待时间。
下载时要注意版本匹配。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-TEEbin/mcu/:M0协处理器固件(用于PMU、低功耗管理)
rockdev/ 目录:编译完成后,生成的镜像文件会放在这里。常见的镜像有:
boot.img:内核+设备树+ramdiskrootfs.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后,肯定要改代码。怎么管理自己的修改?我推荐这套流程:
- 在需要修改的仓库里创建本地分支,比如
kernel/目录下:
cd kernel
git checkout -b my_feature_branch
- 修改代码、提交:
git add .
git commit -m "feat: add my custom driver"
- 当官方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的整体结构串起来。你看着这张图,就能理解各个组件怎么配合。
这张图把SDK的层次关系讲清楚了。从上到下依次是:SDK根目录 → 核心组件(kernel/u-boot/rkbin)→ 板级配置与工具链 → 构建系统 → 镜像输出。你每次编译,数据流都是这样走的。
3.5 避坑指南与最佳实践
最后,分享几个我踩过的坑,你遇到了能少走弯路。
网络不稳定时,repo sync会中断。解决办法:加
--no-tags 参数跳过标签下载,或者用 repo sync -j1 单线程重试。我写了个脚本,自动重试3次,基本都能拉完。
多个仓库同时开发时,容易搞混当前分支。我习惯在
kernel/ 和 u-boot/ 目录里用 git branch 确认。更保险的做法是,在本地分支名里加上项目名,比如 projectA_kernel_v2。
rkbin里的固件必须与内核版本匹配。我遇到过RK3588用新内核但rkbin是旧的,结果ATF初始化失败,串口没输出。解决办法:每次更新SDK时,检查
rkbin/ 的提交日志,确保与内核同步。