RK3568 Linux SDK 详解:SDK 是什么、板级差异与完整构建流程

RK3568 Linux SDK 详解:SDK 是什么、板级差异与完整构建流程

刚接触嵌入式 Linux 的人,打开厂商给的 SDK 目录往往一头雾水:这些文件夹都是干什么的?不同开发板的 SDK 是不是一套?没有板子资料能不能自己编译?本文以瑞芯微 RK3568 官方 Linux SDK 为例,把 SDK 的组成、板级差异位置和从源码到烧录的完整流程一次讲清。

日期 :2026-09-27 平台:RK3568(ARM64)


目录

  1. [SDK 是什么](#SDK 是什么)
  2. [不同开发板的 SDK 一样吗](#不同开发板的 SDK 一样吗)
  3. [kernel 目录为何"看起来差不多"](#kernel 目录为何"看起来差不多")
  4. 板级构建差异清单
  5. 完整构建流程(实战)
  6. 没有板子资料如何构建
  7. 验证与常见问题排查
  8. 总结

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):

  1. USB OTG 口连接板子与电脑;
  2. 让板子进入烧录模式:按住 MaskROM(VOL+)按键再上电,或短接 eMMC 的 CLK 引脚与地后上电,工具识别到"发现一个 MASKROM 设备";
  3. 在 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 做板级适配"。

推荐的五步路径:

  1. 拿到基线 SDK:用 repo 拉取官方 SDK,或直接使用任意一家 RK3568 板厂的 SDK,主体内容几乎一致;
  2. 先编译公版 EVB 配置 :envsetup 选择 rk3568-evb 类目标,执行 ./build.sh all 与 ./mkfirmware.sh,先确认主机环境和编译流程跑通;
  3. 搞到自己板子的原理图(硬门槛):必须知道用了哪颗 PMIC(如 RK809)、DDR 颗粒型号、eMMC 还是 NAND、屏幕时序、以太网 PHY 型号、每个外设接在哪个引脚上;
  4. 复制 EVB 的 DTS 和 BoardConfig 改名,按原理图逐项修改 pinmux 和外设使能状态;
  5. 编译 → 烧录 → 串口看启动日志 → 回到 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. 总结

  1. SDK 是芯片级的。 嵌入式 Linux SDK 是一整棵能编译出 bootloader + kernel + rootfs 完整固件的代码树,由芯片厂商发布,跟着 SoC 走。
  2. 板级差异是配置级的。 同一 SoC 的不同板子共用一套 SDK,差异集中在 device/ 的 BoardConfig、内核 arch/arm64/boot/dts/rockchip/ 下的设备树、分区表和少量硬件参数。
  3. 构建流程是固定的。 选板(source envsetup.sh)→ 编译(./build.sh all)→ 打包(./mkfirmware.sh)→ 烧录(./rkflash.sh)。没有官方 SDK 和板子原理图无法从零造轮子,但在 EVB 基线上做适配,是每个嵌入式开发者都能走通的路。

命令基于 RK 官方 Linux SDK 整理,具体以 SDK 内 docs/ 文档为准。

相关推荐
拾贰_C1 小时前
【Ubuntu | port】Linux进程端口号冲突问题解决
linux·运维·ubuntu
wdfk_prog1 小时前
Wi-Fi Direct 教程 07:第一次 P2P Scan 如何真正发出——WPS/P2P IE、radio work 与 driver request
运维·服务器·ubuntu·wifi-direct
机核研创社1 小时前
服装自动化观察:接橡筋机的超声波熔切与冷刀,差别到底在哪
运维·自动化
欣欣之王来了1 小时前
AI合规专项:AI自动化决策的合规管控要点
运维·人工智能·自动化
guo_wen_qiang1 小时前
docker安装常见软件集合
运维·docker·容器
0+1111 小时前
Linux --读者写者问题、读写锁与自旋锁
linux
谷哥的小弟2 小时前
CentOS寿终正寝
linux·运维·centos
醇氧2 小时前
nohup 后台启动 uvicorn(仅测试 / 临时运行)
linux·运维·网络·python·python3.11
lisanmengmeng2 小时前
nagios的安装错误
linux