3. Rockchip 平台概述:RK3568/RK3588 系列芯片特性、典型硬件架构、SDK 目录结构
做 Rockchip 平台设备树开发,你得先摸清这家芯片的脾气。RK3568 和 RK3588 是目前市面上最火的两颗芯,一个主打性价比和低功耗,一个专攻高性能和多屏交互。我最早接触 Rockchip 是 RK3288 时代,那时候设备树还不像现在这么规范,踩了不少坑。到了 RK3568/RK3588,体系已经相当成熟了。
这一节,我把这两颗芯片的核心特性、硬件架构和 SDK 目录结构给你捋一遍。你心里有了这张地图,后面写设备树才不会迷路。
3.1 RK3568 与 RK3588 核心特性对比
先看一张对比表,直观感受一下差距。
| 特性 | RK3568 | RK3588 |
|---|---|---|
| CPU | 4×Cortex-A55 (2.0GHz) | 4×Cortex-A76 (2.4GHz) + 4×Cortex-A55 (1.8GHz) |
| GPU | Mali-G52 EE | Mali-G610 MP4 |
| NPU | 1 TOPS (RKNN) | 6 TOPS (RKNN) |
| 内存 | LPDDR4/LPDDR4x/DDR4/DDR3 | LPDDR4/LPDDR5 |
| 显示 | HDMI 2.0, eDP 1.3, MIPI DSI | HDMI 2.1, eDP 1.4, DP 1.4, MIPI DSI |
| 视频编解码 | 4K@60fps H.265/H.264 解码 | 8K@60fps H.265/VP9 解码, 8K@30fps 编码 |
| PCIe | 1×PCIe 3.0 x2, 1×PCIe 2.0 x1 | 2×PCIe 3.0 x4, 2×PCIe 2.0 x1 |
| USB | 1×USB 3.0, 2×USB 2.0 | 2×USB 3.1, 2×USB 2.0 |
| 以太网 | 2×GMAC (RGMII/RMII) | 2×GMAC (RGMII/RMII) |
| 封装 | BGA 636 (19×19mm) | BGA 1088 (23×23mm) |
看到没?RK3588 的 CPU 是大核+小核的 big.LITTLE 架构,设备树里要配 cpu-opp-table 和 cpu-supply,调频策略比 RK3568 复杂不少。我有个项目用 RK3588 做边缘计算盒子,一开始没配好 OPP 表,大核死活跑不到 2.4GHz,后来发现是电压域设备树节点少了一个 regulator-microvolt-range。
选型建议: 如果你的产品只需要 4K 显示和轻量 AI 推理,RK3568 完全够用,成本低、散热好处理。如果要做 8K 视频、多路摄像头接入或者跑大模型,直接上 RK3588,别犹豫。
3.2 典型硬件架构
Rockchip 的硬件架构,说白了就是「多总线 + 多 IP 模块」的互联结构。我画了一张架构图,你对照着看。
这张图里,我最想让你注意的是「系统总线」和「外设总线」的分离。Rockchip 把高性能 IP(CPU、GPU、NPU)挂在 ACE 总线上,把低速外设挂在 AHB/APB 上。设备树里,每个外设节点都要指定 interrupt-parent 和 clocks,这两个属性错了,驱动根本跑不起来。
我的习惯: 拿到一块新板子,我会先看 arch/arm64/boot/dts/rockchip/ 目录下的 rk3588.dtsi,找到 bus 节点和 clock 节点,确认总线频率和时钟源。这一步能避免后面 80% 的外设配置问题。
3.3 SDK 目录结构
Rockchip 官方 SDK 是基于 Yocto 或 Buildroot 的,但实际项目里,我见到的更多是「半手动」的 SDK 结构。下面这个目录树,是我从一个量产项目中提炼出来的典型结构。
RK3588_SDK/
├── kernel/ # Linux 内核源码 (5.10 / 6.1)
│ ├── arch/arm64/boot/dts/rockchip/ # 设备树文件
│ │ ├── rk3588.dtsi # SoC 级设备树 (所有通用外设)
│ │ ├── rk3588-evb1.dts # EVB 板级设备树
│ │ ├── rk3588s.dtsi # RK3588S 精简版 SoC 设备树
│ │ └── rk3588-xxx-product.dts # 你的产品设备树
│ ├── drivers/ # 驱动源码
│ └── ...
├── u-boot/ # U-Boot 引导程序
│ ├── arch/arm/dts/ # U-Boot 设备树 (与内核设备树同步)
│ └── ...
├── rkbin/ # Rockchip 二进制固件
│ ├── bin/ # DDR 初始化、ATF、OP-TEE
│ └── ...
├── buildroot/ # 根文件系统构建
│ └── ...
├── external/ # 第三方库和工具
│ ├── rknpu/ # NPU 驱动和工具链
│ ├── rkmpp/ # 多媒体处理库
│ └── ...
├── device/ # 产品配置
│ ├── rockchip/ # Rockchip 板级配置
│ │ ├── rk3588/ # 芯片级配置
│ │ └── common/ # 通用配置
│ └── ...
├── tools/ # 烧录、调试工具
│ ├── rkdeveloptool # 命令行烧录工具
│ └── ...
└── docs/ # 文档
└── Rockchip_RK3588_Developer_Guide_*.pdf
这个结构里,设备树文件是「三明治」式的:rk3588.dtsi 定义 SoC 级外设,rk3588-evb1.dts 定义 EVB 板级外设,你的产品设备树 rk3588-xxx-product.dts 再 #include 它们并覆盖差异部分。
避坑指南: 我曾经犯过一个低级错误——直接修改了 rk3588.dtsi 里的 i2c2 节点,结果所有用这个 SoC 的板子都受影响。正确的做法是在你的产品设备树里用 &i2c2 引用并覆盖属性。记住:dtsi 是公共库,别动它。
3.4 设备树在 SDK 中的角色
设备树在 Rockchip SDK 里,不只是给内核用的。U-Boot 也要解析设备树来初始化 DDR、时钟和 GPIO。甚至 rkbin 里的 ATF(ARM Trusted Firmware)也会读取设备树中的 psci 节点和 reserved-memory 节点。
我建议你养成一个习惯:每次修改设备树,都要同步更新 U-Boot 的设备树。虽然 U-Boot 和内核的设备树可以共用同一个 .dts 文件(通过 CONFIG_OF_LIVE 和 CONFIG_OF_BOARD 控制),但很多项目还是分开维护的。不一致的话,U-Boot 可能起不来,或者内核启动时设备树覆盖失败。
关键文件清单: 开始一个 Rockchip 项目前,先确认以下文件是否齐全:
rk3588.dtsi— SoC 级设备树,必须与内核版本匹配rk3588-evb1.dts— 官方 EVB 参考,用来对比你的硬件差异rk3588-xxx-product.dts— 你的产品设备树,从这里开始写rk3588.dtsi对应的bindings文档 — 在Documentation/devicetree/bindings/下
嗯,这一节的内容就这些。你先把 RK3568 和 RK3588 的差异记牢,再把 SDK 目录结构刻在脑子里。后面写设备树的时候,你会感谢自己现在花时间看了这张架构图。