第2章 RK3566与RK3568芯片差异:选型、封装与管脚、电源与时钟域
做嵌入式开发这么多年,我经常被问到同一个问题:「RK3566和RK3568到底怎么选?」
说实话,这两颗芯片长得太像了。从软件角度看,它们共享同一个SDK,同一个内核,甚至大部分设备树节点都能复用。但你要是真把它们当成同一颗芯片来用,迟早会踩坑。
我个人习惯是:先看封装,再看电源,最后才看性能。因为封装决定了你的PCB能不能放下,电源决定了你的系统稳不稳,性能反而是最不容易出问题的部分。
2.1 芯片选型对比:一张表说清楚
我们先看一张对比表。我建议你把它存下来,选型时直接翻出来看。
| 对比项 | RK3566 | RK3568 |
|---|---|---|
| CPU | 4×Cortex-A55 @1.8GHz | 4×Cortex-A55 @2.0GHz |
| GPU | Mali-G52 EE | Mali-G52 EE |
| NPU | 0.8 TOPS | 1.0 TOPS |
| 封装 | BGA 364 | BGA 636 |
| 管脚间距 | 0.65mm | 0.5mm |
| DDR支持 | LPDDR4/LPDDR4X | LPDDR4/LPDDR4X/DDR4 |
| PCIe | 1×PCIe 2.1 (1-lane) | 1×PCIe 3.0 (2-lane) + 1×PCIe 2.1 |
| USB3.0 | 1路 | 2路 |
| SATA | 无 | 1路 |
| 显示接口 | HDMI 2.0 + eDP + MIPI DSI | HDMI 2.0 + eDP + MIPI DSI + DP |
| 典型功耗 | 约3W | 约5W |
你看,RK3568在CPU频率、NPU算力、PCIe带宽、DDR类型、USB数量、SATA支持上都更「大方」。但代价是什么?封装大了将近一倍,管脚间距更密,PCB设计难度和成本都上去了。
2.2 封装与管脚差异:BGA 364 vs BGA 636
封装差异是这两颗芯片最直观的区别。RK3566是BGA 364,RK3568是BGA 636。别小看这272个管脚的差距,它直接影响你的PCB层数和布线难度。
2.2.1 管脚分布对比
我画了一张管脚功能分布对比图,帮你快速理解哪些管脚被「砍掉」了。
从图上能看出来,RK3568多出来的管脚主要用在了三个地方:
- DDR接口:支持DDR4需要额外的地址/控制管脚,多了约50个
- 高速接口:第二路USB3.0、PCIe 3.0的2-lane、SATA,加起来多了约40个
- GPIO:剩下的全给了通用IO,RK3568的GPIO资源比RK3566多了将近一倍
2.2.2 封装对PCB设计的影响
RK3566的BGA 364,管脚间距0.65mm,4层板就能搞定。RK3568的BGA 636,管脚间距0.5mm,至少需要6层板,而且对过孔和走线宽度要求更高。
我算过一笔账:
- RK3566 + 4层板:PCB成本约$2-3
- RK3568 + 6层板:PCB成本约$5-8
再加上RK3568芯片本身贵$3-5,整体BOM成本差距在$6-10之间。量大的话,这个差距很可观。
2.3 电源域与时钟域差异
这部分是设备树配置的关键。电源域和时钟域的差异,直接决定了你的设备树里哪些节点能开、哪些节点不能开。
2.3.1 电源域对比
RK3566和RK3568的电源域划分基本一致,但RK3566砍掉了几个电源域。我整理了一张表:
| 电源域 | 电压范围 | RK3566 | RK3568 | 说明 |
|---|---|---|---|---|
| VDD_CPU | 0.8V - 1.2V | ✔ | ✔ | CPU核心供电,RK3568频率更高,电流需求更大 |
| VDD_GPU | 0.8V - 1.2V | ✔ | ✔ | GPU供电,两颗芯片相同 |
| VDD_NPU | 0.8V - 1.1V | ✔ | ✔ | NPU供电,RK3568算力更高,电流略大 |
| VDD_LOGIC | 0.9V - 1.0V | ✔ | ✔ | 逻辑核心供电,两颗芯片相同 |
| VDD_DDR | 1.1V - 1.2V | ✔ | ✔ | DDR供电,RK3568支持DDR4,电压范围更宽 |
| VDD_PCIE | 0.9V - 1.0V | ✘ | ✔ | PCIe 3.0 PHY专用,RK3566没有 |
| VDD_SATA | 0.9V - 1.0V | ✘ | ✔ | SATA PHY专用,RK3566没有 |
| VDD_USB3 | 0.9V - 1.0V | ✔ | ✔ | USB3.0 PHY供电,RK3566只有1路 |
你看,RK3566砍掉了VDD_PCIE和VDD_SATA这两个电源域。这意味着什么?
说白了,RK3566的PCIe控制器虽然还存在,但它的PHY电源域被砍了,所以只能跑PCIe 2.1,而且只能接1-lane。SATA更是直接物理上不存在了。
phys属性指向的PHY节点是「残血版」的。我习惯在设备树里加一个status = "disabled"的检查,确保不会误开不存在的硬件。
2.3.2 时钟域差异
时钟域方面,两颗芯片的差异主要集中在高速接口上。RK3568多出了PCIe 3.0的100MHz参考时钟和SATA的专用时钟。
我画了一张时钟域对比图:
时钟域的差异在设备树里怎么体现?我举个例子:
// RK3568 的 PCIe 节点(完整版)
pcie3x2: pcie@fe280000 {
compatible = "rockchip,rk3568-pcie";
reg = <0x3 0xc0000000 0x0 0x00400000>;
clocks = <&cru ACLK_PCIE>, <&cru PCLK_PCIE>,
<&cru CLK_PCIE_AUX>, <&cru CLK_PCIE_PHY>;
clock-names = "aclk", "pclk", "aux", "phy";
phys = <&pcie_phy>;
phy-names = "pcie-phy";
status = "disabled";
};
// RK3566 的 PCIe 节点(精简版)
pcie2x1: pcie@fe260000 {
compatible = "rockchip,rk3566-pcie";
reg = <0x3 0xc0000000 0x0 0x00100000>;
clocks = <&cru ACLK_PCIE>, <&cru PCLK_PCIE>,
<&cru CLK_PCIE_AUX>;
clock-names = "aclk", "pclk", "aux";
// 注意:没有 CLK_PCIE_PHY 时钟
// 没有 phys 属性
status = "disabled";
};
你看,RK3566的PCIe节点少了CLK_PCIE_PHY时钟和phys属性。这就是为什么它只能跑PCIe 2.1——PHY时钟域被砍了,没法做高速串行化。
CLK_PCIE_PHY时钟。我遇到过有人这么干,结果调试了三天才发现是时钟域不匹配。记住:设备树不是通用的,必须针对芯片型号做适配。
2.4 设备树中的芯片型号识别
在实际开发中,我们经常需要一套代码兼容两颗芯片。怎么做?
我的做法是在设备树的根节点里加一个compatible属性,然后在驱动里根据这个属性做分支判断。
// RK3566 设备树根节点
/ {
model = "Rockchip RK3566 EVB";
compatible = "rockchip,rk3566", "rockchip,rk3568";
// 注意:兼容列表里同时包含 rk3566 和 rk3568
// 这样驱动可以 fallback 到通用逻辑
};
// RK3568 设备树根节点
/ {
model = "Rockchip RK3568 EVB";
compatible = "rockchip,rk3568";
};
在驱动里,你可以这样判断:
static const struct of_device_id rk_pcie_dt_ids[] = {
{ .compatible = "rockchip,rk3568-pcie", .data = &rk3568_pcie_data },
{ .compatible = "rockchip,rk3566-pcie", .data = &rk3566_pcie_data },
{ /* sentinel */ }
};
这样,内核会根据设备树里的compatible自动匹配对应的驱动数据。你想想看,是不是比硬编码要优雅得多?
rk356x.dtsi文件里,然后把差异部分分别放在rk3566.dtsi和rk3568.dtsi里。这样既减少了重复代码,又避免了误配置。
2.5 本章小结
RK3566和RK3568的差异,说白了就是「够用」和「满配」的区别。选型时别只看价格,要算清楚你的外设需求、PCB成本、开发周期。设备树配置上,记住三点:
- 管脚不兼容:别想着做兼容PCB
- 电源域有缺失:RK3566没有PCIe 3.0和SATA的电源域
- 时钟域有精简:RK3566的PCIe只能跑2.1,没有SATA时钟