RK3568 Linux SDK 详解:SDK 是什么、板级差异与完整构建流程
刚接触嵌入式 Linux 的人,打开厂商给的 SDK 目录往往一头雾水:这些文件夹都是干什么的?不同开发板的 SDK 是不是一套?没有板子资料能不能自己编译?本文以瑞芯微 RK3568 官方 Linux SDK 为例,把 SDK 的组成、板级差异位置和从源码到烧录的完整流程一次讲清。
日期 :2026-09-27 平台:RK3568(ARM64)
目录
- [SDK 是什么](#SDK 是什么)
- [不同开发板的 SDK 一样吗](#不同开发板的 SDK 一样吗)
- [kernel 目录为何"看起来差不多"](#kernel 目录为何"看起来差不多")
- 板级构建差异清单
- 完整构建流程(实战)
- 没有板子资料如何构建
- 验证与常见问题排查
- 总结
1. SDK 是什么
SDK 全称 Software Development Kit(软件开发包) 。在 PC 或手机开发里,SDK 可能只是几个库加头文件;但在嵌入式 Linux 领域,SDK 是一整棵代码树------配合交叉编译工具链和脚本,可以从源码一路编译出能烧进板子、上电启动的完整固件。
一块运行 Linux 的嵌入式板子,其固件由三部分构成,SDK 就是这三部分源码的合集:
- bootloader:上电后最先运行,初始化 DDR、存储等硬件,引导内核(RK 平台对应 u-boot + rkbin 里的 loader);
- kernel:Linux 内核,包含进程调度、内存管理、各类硬件驱动;
- rootfs:根文件系统,即内核启动后挂载的第一个文件系统,里面是 shell、库、配置文件和你的应用程序。
以 RK3568 Linux SDK 根目录为例,各目录与脚本的职责如下:
| 目录 / 文件 | 作用 |
|---|---|
u-boot/ |
bootloader 源码,负责硬件后期初始化和引导内核 |
rkbin/ |
瑞芯微闭源二进制:DDR 初始化、TF-A(ARM 可信固件)、USB Loader、Miniloader |
kernel/ |
Linux 内核源码,含驱动和设备树 DTS |
buildroot/ |
Buildroot 根文件系统构建系统,轻量、编译快,嵌入式最常用 |
debian/ |
Debian 根文件系统,软件包丰富,适合带桌面/重度应用场景 |
yocto/ |
Yocto 构建系统,高度可定制,适合产品级定制,学习曲线陡 |
app/ |
厂商或用户的应用程序 |
external/ |
第三方开源组件 |
prebuilts/ |
预编译的交叉编译工具链(aarch64 gcc) |
device/ |
板级配置:不同板子的差异集中在这里(BoardConfig、分区表等) |
tools/ |
烧录工具(如 Linux 下的 upgrade_tool)、打包工具 |
docs/ |
官方文档,包括编译指南、烧录指南,遇到问题应优先查阅 |
rockdev/ |
编译产物输出目录,各分区镜像和最终的 update.img 在此 |
envsetup.sh |
环境配置脚本,执行后选择板型、设置工具链环境变量 |
build.sh |
主编译入口,编译 u-boot / kernel / rootfs 都通过它 |
mkfirmware.sh |
把各部分编译产物收集、打包成完整固件 |
rkflash.sh |
调用烧录工具,把固件通过 USB 烧进板子 |
SDK 的分层结构(固件就是这些层编译产物的合集):
text
┌─────────────────────────────────────────────┐
│ app / external 用户应用、第三方组件 │
├─────────────────────────────────────────────┤
│ buildroot/debian/yocto 根文件系统(三选一) │
├─────────────────────────────────────────────┤
│ kernel 内核 + 驱动 + 设备树 │
├─────────────────────────────────────────────┤
│ u-boot bootloader,引导内核 │
├─────────────────────────────────────────────┤
│ rkbin 闭源:DDR/TF-A/Loader │
├─────────────────────────────────────────────┤
│ prebuilts aarch64 交叉工具链 │
└─────────────────────────────────────────────┘
2. 不同开发板的 SDK 一样吗
这个问题不能一概而论,要分三种情况:
情况一:同一 SoC、不同板厂的开发板
比如正点原子、野火、飞凌各自基于 RK3568 出的板子。它们的 SDK 90% 以上相同 ------全部源自瑞芯微官方发布的同一套代码。板厂拿到官方 SDK 后,只针对自家板子修改 device/ 下的板级配置和内核设备树(引脚、屏幕、外设),然后以"自家 SDK"的名义发布。
情况二:不同 SoC
比如 RK3568 与 RK3588、全志 T507、NXP i.MX8M 之间。SDK 完全不同:bootloader、内核 BSP、固件二进制 blob、编译脚本都各成体系。但它们"bootloader + kernel + rootfs"的分层思想是一样的,掌握一个平台后迁移成本主要在熟悉厂商工具链。
情况三:同一 SoC、自研板
公司自研板子通常直接复用官方或某块成熟板子的 SDK,只新增一份自研板的设备树和板级配置。这正是 SDK 设计上希望看到的用法。
核心结论:SDK 跟着芯片走,配置跟着板子走。 不存在"每块板子一套独立 SDK",准确的模型是"一套芯片 SDK + 多份板级配置"共存。
3. kernel 目录为何"看起来差不多"
进入 SDK 的 kernel/ 目录后,很多人会发现:这里的目录结构和其他平台、甚至和 x86 PC 的内核源码几乎一模一样。这个观察对了一半:
- 目录骨架确实相同 。无论 RK3568、高通骁龙还是 x86 服务器,内核都源自 kernel.org 的同一套上游代码,
kernel/ mm/ fs/ net/ drivers/ ipc/ block/是 Linux 的标准结构。这是内核刻意的可移植性设计:把架构差异收进arch/,把外设差异收进drivers/,核心代码保持平台无关。 - 目录里的内容差异很大。芯片厂商以"打补丁 + 加子目录 + 加设备树"的方式往里加东西,一套厂商 SDK 内核通常比上游主线多数千个 commit。
这些差异分布在四个由通用到专用的嵌套层级里,越往外越"板子特有":
- L0 kernel.org 上游内核 (同版本号下,所有平台逐字相同)
init/ kernel/(调度、进程) mm/(内存管理) fs/(文件系统) net/(网络协议栈) block/ ipc/ crypto/ security/ lib/ virt/ scripts/ include/,以及drivers中的子系统框架(USB/PCI/I2C 框架等) - L1 arch/arm64 (ARM64 架构公共层,高通 / 瑞芯微 / 全志的 ARM64 芯片共用)
arch/arm64/kernel/(异常、上下文切换)、arch/arm64/mm/(页表)、arch/arm64/crypto/ - L2 rockchip 芯片级 BSP (RK3568 / RK3588 等瑞芯微芯片共用,换厂商就没有)
drivers/clk/rockchip(时钟)、drivers/soc/rockchip(电源 / GRF 寄存器)、drivers/phy/rockchip、drivers/gpu/drm/rockchip(显示)、drivers/media/platform/rockchip(VPU / RKVDEC 硬解)、sound/soc/rockchip(音频)、drivers/gpu/arm/mali(Mali GPU 驱动)、include/dt-bindings/clock/rk3568.h - L3 板级 (同芯片的每块板子都不同,适配硬件主要改这层)
arch/arm64/boot/dts/rockchip/rk3568-xxx.dts(引脚 / 外设 / 屏幕)、arch/arm64/configs/rockchip_*_defconfig(内核裁剪配置)
顶层那些文件都是什么 ------在 kernel/ 下 ls 看到的内容分三类:
| 类别 | 文件 | 说明 |
|---|---|---|
| 上游原生 | arch drivers fs include init ipc kernel lib mm net sound ... |
kernel.org 内核标准目录 |
| RK / Android 构建胶水 | make.sh、build.config.*、boot.its |
make.sh 是 RK 的内核编译封装脚本;build.config 是 Android GKI 构建配置(这套内核同时服务 Android 和 Linux);boot.its 是 FIT 镜像打包描述 |
| 编译产物 | vmlinux、built-in.a、System.map、modules.order、kernel.img、boot.img、resource.img、zboot.img |
看到这些说明内核已经编译过;kernel.img 等是 RK 打包格式,resource.img 里装的是 DTB 和开机 logo |
可以用以下命令亲自验证"骨架相同、内容不同":
bash
$ head -5 Makefile # 查看内核版本号
$ ls arch/arm64/boot/dts/rockchip/ | grep 3568 # 板级设备树列表
$ ls drivers/soc/rockchip drivers/phy/rockchip # 芯片级驱动
$ ls arch/arm64/configs/ | grep -i rockchip # 内核 defconfig
$ git log --oneline | wc -l # 厂商在上游之外加了多少 commit
4. 板级构建差异清单
不同 RK3568 板子的编译命令完全一样,差异全部落在配置文件中。需要为新板子适配时,按下表逐项核对:
| 差异项 | 位置 | 决定什么 |
|---|---|---|
| 选板目标 | device/rockchip/rk3568/BoardConfig.mk |
envsetup 时选择的 lunch 目标,串联后面所有配置 |
| 内核设备树 | kernel/arch/arm64/boot/dts/rockchip/rk3568-xxx.dts |
引脚复用(pinmux)、I2C/SPI/UART、网口 PHY、声卡、屏幕面板 |
| u-boot 配置 | u-boot/configs/*_defconfig 及其 arch/arm/dts 下的 DTS |
引导阶段初始化的外设、启动参数 |
| 分区表 | parameter.txt |
各分区大小、存储类型(eMMC / NAND) |
| DDR / 屏幕参数 | rkbin 相关 ini 配置 | DDR 颗粒型号与时序、显示时序 |
| rootfs 内容 | buildroot/debian 配置、app/ |
预装的软件包、库、服务和应用 |
5. 完整构建流程(实战)
下面以 Ubuntu 主机 + RK3568 Linux SDK(带 envsetup.sh、build.sh 的版本)为例,走一遍从环境准备到烧录的完整流程。不同 SDK 版本菜单文字略有差异,以 docs/ 目录官方文档为准。
5.1 主机环境准备
推荐 Ubuntu 18.04 / 20.04 / 22.04,磁盘预留 40GB 以上空间。安装编译依赖:
bash
$ sudo apt-get update
$ sudo apt-get install -y repo git ssh make gcc libssl-dev liblz4-tool \
expect g++ patchelf chrpath gawk texinfo diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake gcc-multilib \
g++-multilib unzip device-tree-compiler ncurses-dev python3 python3-pip
5.2 获取 SDK
两种途径:一是板厂直接提供的 SDK 压缩包,解压即可;二是瑞芯微官方通过 repo 管理的代码(GitHub 上 rockchip-linux 组织提供 manifest),典型拉取方式:
bash
$ repo init --repo-url=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo \
-u https://github.com/rockchip-linux/manifests -b master -m rk3568_linux_release.xml
$ repo sync
注意:manifest 分支与文件名随版本变化,拉取前以瑞芯微官方或板厂发布的《SDK 发布说明》为准。学习阶段直接用板厂打包好的 SDK 最省事。
5.3 选择板型
在 SDK 根目录执行环境配置脚本,按菜单编号选择与自己板子对应的配置:
bash
$ cd rk3568_linux_sdk
$ source envsetup.sh
# 脚本会列出类似菜单:
# 1. rockchip_rk3568
# 2. rockchip_rk3566
# ...
# Please choose: 1
这一步会设置交叉编译工具链路径等环境变量,每个新开的终端都要重新执行一次。
5.4 分步编译
可以分别编译三大件,便于单独调试:
bash
$ ./build.sh uboot # 编译 u-boot + loader
$ ./build.sh kernel # 编译内核和设备树
$ ./build.sh buildroot # 编译 Buildroot 根文件系统
5.5 一键编译
确认配置无误后,一条命令完成全部编译:
bash
$ ./build.sh all
5.6 打包固件
bash
$ ./mkfirmware.sh
该脚本把各部分产物收集到 rockdev/ 目录,典型内容包括:MiniLoaderAll.bin、parameter.txt、uboot.img、boot.img、rootfs.img、oem.img、userdata.img,以及合并后的整包 update.img。
5.7 烧录到板子
Linux 主机可直接用脚本烧录(底层调用 tools 目录下的 upgrade_tool):
bash
$ ./rkflash.sh
Windows 主机使用瑞芯微 RKDevTool(AndroidTool):
- USB OTG 口连接板子与电脑;
- 让板子进入烧录模式:按住 MaskROM(VOL+)按键再上电,或短接 eMMC 的 CLK 引脚与地后上电,工具识别到"发现一个 MASKROM 设备";
- 在 RKDevTool 中选择整包
update.img,点击"升级"等待完成。
build.sh 常用子命令速查:
| 命令 | 作用 |
|---|---|
./build.sh all |
编译 u-boot、kernel、rootfs 全部组件 |
./build.sh uboot |
只编译 u-boot |
./build.sh kernel |
只编译内核 |
./build.sh buildroot |
只编译 Buildroot 根文件系统 |
./build.sh debian |
编译 Debian 根文件系统 |
./build.sh modules |
编译内核模块 |
./build.sh firmware |
等同于执行打包流程 |
./build.sh clean |
清理各组件编译产物 |
./build.sh distclean |
深度清理,恢复到未编译状态 |
标准构建流程总览(所有 RK3568 板子命令相同,仅选板目标不同):
text
source envsetup.sh → build.sh uboot → build.sh kernel
→ build.sh buildroot → mkfirmware.sh → rkflash.sh
选板/设环境 u-boot+loader 内核+DTS
rootfs 打 update.img USB 烧录
6. 没有板子资料如何构建
先说明一个现实:RK 这类平台无法仅凭芯片 datasheet 从零写出可用 SDK 。DDR 初始化、USB 烧录协议都封装在 rkbin 的闭源二进制里,没有官方 blob,板子连最基本的上电启动都做不到。普通人能做、也应该做的,是"基于官方 SDK 做板级适配"。
推荐的五步路径:
- 拿到基线 SDK:用 repo 拉取官方 SDK,或直接使用任意一家 RK3568 板厂的 SDK,主体内容几乎一致;
- 先编译公版 EVB 配置 :envsetup 选择 rk3568-evb 类目标,执行
./build.sh all与./mkfirmware.sh,先确认主机环境和编译流程跑通; - 搞到自己板子的原理图(硬门槛):必须知道用了哪颗 PMIC(如 RK809)、DDR 颗粒型号、eMMC 还是 NAND、屏幕时序、以太网 PHY 型号、每个外设接在哪个引脚上;
- 复制 EVB 的 DTS 和 BoardConfig 改名,按原理图逐项修改 pinmux 和外设使能状态;
- 编译 → 烧录 → 串口看启动日志 → 回到 DTS 修正,循环迭代直到全部外设正常。
需要备齐的资料清单:
| 资料 | 来源 | 用途 |
|---|---|---|
| RK3568 datasheet / TRM | 瑞芯微官网(需申请) | 寄存器、引脚、控制器说明 |
| 板子原理图 | 板厂提供 / 自研硬件同事 | 确定外设接线,是改 DTS 的依据 |
| 官方 SDK 及 docs 文档 | repo / 板厂资料包 | 编译、烧录、适配的权威说明 |
| DDR / 屏幕规格书 | 颗粒与屏厂 | DDR 时序、屏幕显示参数 |
两种"没有"要分清:没有实体板子,依然可以在主机上编译出固件,只是无法验证;没有原理图,则自研板的适配无从下手。靠万用表量板反推接线只适合救急,效率极低。
7. 验证与常见问题排查
串口是第一调试手段 。板子的调试 UART(通常是 UART2,波特率 1500000)接 USB 转串口模块,主机用 minicom、picocom 或 MobaXterm 打开。上电后 u-boot、内核的全部日志都从这里输出,90% 的启动问题靠串口日志定位,不要在没有串口日志的情况下盲猜。
bash
$ sudo picocom -b 1500000 /dev/ttyUSB0
常见问题:
| 现象 | 排查方向 |
|---|---|
| 编译报缺头文件 / 命令找不到 | 检查依赖包是否装全;确认当前终端执行过 source envsetup.sh |
| buildroot 下载源码失败 | 网络问题,可重试;或配置代理 / 换国内源后重新编译 |
| 烧录工具识别不到板子 | 确认 USB 接的是 OTG 口;重新进入 MaskROM 模式;Linux 下配置 udev 规则或加 sudo;换数据线(很多线只能充电) |
| 烧录后板子完全无输出 | 串口 TX/RX 是否接反、波特率是否 1500000;DDR 配置与实际颗粒不符;供电不足 |
| 内核启动到一半挂死 | 对照串口日志定位最后加载的驱动,通常是 DTS 中某个外设引脚配错或硬件未贴 |
| 启动正常但某外设不工作 | DTS 中该外设节点 status 是否为 okay、引脚是否冲突、defconfig 是否打开对应驱动 |
| 想彻底重新编译 | ./build.sh distclean 后重新选板、编译 |
8. 总结
- SDK 是芯片级的。 嵌入式 Linux SDK 是一整棵能编译出 bootloader + kernel + rootfs 完整固件的代码树,由芯片厂商发布,跟着 SoC 走。
- 板级差异是配置级的。 同一 SoC 的不同板子共用一套 SDK,差异集中在
device/的 BoardConfig、内核arch/arm64/boot/dts/rockchip/下的设备树、分区表和少量硬件参数。 - 构建流程是固定的。 选板(
source envsetup.sh)→ 编译(./build.sh all)→ 打包(./mkfirmware.sh)→ 烧录(./rkflash.sh)。没有官方 SDK 和板子原理图无法从零造轮子,但在 EVB 基线上做适配,是每个嵌入式开发者都能走通的路。
命令基于 RK 官方 Linux SDK 整理,具体以 SDK 内 docs/ 文档为准。