4. SDK获取与结构解析:瑞芯微官方SDK下载、SDK目录结构详解、BSP各组件作用
拿到一块新的开发板,第一件事是什么?我个人习惯,不是急着看原理图,而是先把SDK拉下来,把目录结构摸清楚。瑞芯微的SDK说大不大,说小不小,解压完十几个G是常事。但你别被这个数字吓到,其实核心的东西就那么几块。
这一章,我就带你从头捋一遍:去哪下载、下载完长什么样、每个文件夹是干嘛的。嗯,这里要注意,不同芯片型号的SDK结构会略有差异,但骨架是一样的。
4.1 官方SDK获取途径
瑞芯微的SDK主要分两条线:一条是公开的,一条是签了NDA的。公开的你去GitHub上搜"rockchip-linux"就能找到,但那个只是碎片化的仓库,不是完整的BSP。真正能用的完整SDK,得从瑞芯微的官方FTP或者百度网盘拿。
| 获取方式 | 适用对象 | 内容完整度 | 更新频率 |
|---|---|---|---|
| GitHub rockchip-linux | 个人开发者、爱好者 | 仅部分组件(U-Boot、Kernel) | 不定期 |
| 瑞芯微官方FTP | 签约客户、合作伙伴 | 完整SDK(含Buildroot、工具链、文档) | 季度/月度 |
| 百度网盘(代理商提供) | 购买了开发板的用户 | 板级支持包 + 部分源码 | 随板卡发布 |
4.2 SDK目录结构全景
下载完SDK,解压后你会看到类似下面的目录结构。我用RK3588的SDK举个例子,其他型号大同小异。
rk3588_linux_sdk/
├── app/ # 上层应用示例
├── buildroot/ # Buildroot构建系统
├── device/ # 板级配置与分区表
├── docs/ # 文档(英文为主)
├── external/ # 第三方库与工具
├── kernel/ # Linux内核源码
├── prebuilts/ # 预编译工具链
├── rkbin/ # 瑞芯微闭源二进制(ATF、DDR、M0)
├── tools/ # 烧录与打包工具
├── u-boot/ # U-Boot引导加载程序
├── yocto/ # Yocto构建系统(部分SDK有)
├── .repo/ # repo管理元数据
├── Makefile # 顶层构建入口
└── README.md # 说明文件
你想想看,这十几个文件夹,真正需要你动手改的其实就三四个。我刚开始做RK3399移植的时候,看到这个目录头皮发麻,后来发现大部分文件夹根本不用碰。
4.3 核心组件详解
咱们挑几个最重要的文件夹,一个一个说清楚。
4.3.1 u-boot/ — 引导加载程序
U-Boot负责初始化硬件、加载内核。瑞芯微的U-Boot做了大量定制,比如支持FIT镜像、Rockchip特有的DDR初始化流程。你在移植新板子时,主要改的是u-boot/board/rockchip/下的板级文件。
关键路径:
u-boot/configs/— 板级默认配置(如rk3588_defconfig)u-boot/arch/arm/dts/— 设备树文件(如rk3588-evb.dts)u-boot/board/rockchip/— 板级初始化代码
4.3.2 kernel/ — Linux内核
内核部分,瑞芯微基于LTS主线内核打上了大量Rockchip-specific的补丁。我记得有一次移植RK3566,内核启动到一半卡在PCIe枚举上,查了两天才发现是设备树里一个reg属性写错了。说白了,内核移植80%的工作量都在设备树上。
4.3.3 rkbin/ — 闭源二进制固件
这个文件夹很特殊。里面放的是瑞芯微不公开源码的二进制文件,包括:
- ATF (ARM Trusted Firmware) — 安全监控层,负责PSCI、电源管理
- DDR初始化代码 — 内存控制器训练,不同频率有不同bin
- M0协处理器固件 — 用于低功耗管理、音频DSP等
这些二进制文件是瑞芯微的"黑盒",你没法改源码,但可以替换版本。比如你想支持更高频率的DDR,就得找FAE要新的DDR bin。
4.3.4 device/ — 板级配置中心
这个文件夹是移植工作的主战场。它包含了:
- 分区表(parameter.txt) — 定义每个分区的大小和位置
- 板级配置文件(BoardConfig.mk) — 指定芯片型号、DDR容量、屏幕参数
- 恢复模式镜像(recovery) — 用于OTA升级
4.4 BSP各组件关系图
下面这张图,我画的是瑞芯微BSP各组件之间的依赖关系。你看一眼就能明白,为什么改一个设备树会影响那么多东西。
4.5 各组件版本对应关系
移植时最头疼的问题之一:U-Boot、Kernel、ATF这三个东西的版本必须匹配。我见过有人把RK3588的U-Boot配RK3566的Kernel,结果DDR初始化就挂了。下面这张表,是我整理的主流芯片的组件版本对应关系。
| 芯片型号 | U-Boot版本 | Kernel版本 | ATF版本 | Buildroot版本 |
|---|---|---|---|---|
| RK3566 | 2017.09 (Rockchip定制) | 4.19 / 5.10 | rk3568_bl31_v1.24 | 2020.02 |
| RK3568 | 2017.09 (Rockchip定制) | 4.19 / 5.10 | rk3568_bl31_v1.27 | 2020.02 |
| RK3588 | 2021.07 (Rockchip定制) | 5.10 / 6.1 | rk3588_bl31_v1.08 | 2022.02 |
| RK3399 | 2014.10 (Rockchip定制) | 4.4 / 4.19 | rk3399_bl31_v1.30 | 2018.08 |
4.6 快速上手:从SDK到第一次编译
下载完SDK,别急着改代码。先跑一遍编译流程,确认环境没问题。步骤很简单:
- 解压SDK — 注意路径不要有中文和空格
- 安装依赖 — Ubuntu 20.04/22.04 执行
sudo apt install repo git-core gcc-arm-linux-gnueabihf等 - 选择板级配置 —
./build.sh rk3588-evb1-lp4-v10-linux.mk - 执行编译 —
./build.sh all(第一次编译大概1-2小时) - 检查输出 — 在
rockdev/目录下找到update.img
python2,因为Buildroot里某个老脚本还在用Python 2语法。
SDK的结构,说白了就是一层套一层的依赖关系。你不需要一开始就全部搞懂,但心里要有张地图:改硬件配置去device/,改驱动去kernel/,改启动流程去u-boot/,改文件系统去buildroot/。这张地图,就是你这章学到的东西。