第2章 RK3566与RK3568芯片差异:选型、封装与管脚、电源与时钟域

做嵌入式开发这么多年,我经常被问到同一个问题:「RK3566和RK3568到底怎么选?」

说实话,这两颗芯片长得太像了。从软件角度看,它们共享同一个SDK,同一个内核,甚至大部分设备树节点都能复用。但你要是真把它们当成同一颗芯片来用,迟早会踩坑。

我个人习惯是:先看封装,再看电源,最后才看性能。因为封装决定了你的PCB能不能放下,电源决定了你的系统稳不稳,性能反而是最不容易出问题的部分。

核心结论: RK3568是RK3566的「满血版」。RK3566在封装、管脚、电源域上做了精简,目的是降低成本。但精简的部分,恰恰是很多工程师容易忽略的陷阱。

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设计难度和成本都上去了。

我的选型建议: 如果你的产品只需要跑Android或轻量Linux,外设不多,RK3566完全够用。但如果你需要接NVMe SSD、多路摄像头、或者做边缘AI推理,老老实实上RK3568。我在一个工业平板项目里为了省几块钱选了RK3566,结果发现PCIe带宽不够,最后只能改方案——亏大了。

2.2 封装与管脚差异:BGA 364 vs BGA 636

封装差异是这两颗芯片最直观的区别。RK3566是BGA 364,RK3568是BGA 636。别小看这272个管脚的差距,它直接影响你的PCB层数和布线难度。

2.2.1 管脚分布对比

我画了一张管脚功能分布对比图,帮你快速理解哪些管脚被「砍掉」了。

RK3566 vs RK3568 管脚功能分布对比 RK3566 (BGA 364) CPU/GPU/NPU 核心管脚 (约80) DDR/LPDDR4 管脚 (约90) 显示接口 (HDMI/eDP/MIPI) (约50) USB/PCIe/SDIO 等高速接口 (约60) GPIO/I2C/SPI/UART 等低速管脚 (约84) 总计: 364 管脚 RK3568 (BGA 636) CPU/GPU/NPU 核心管脚 (约80) DDR4/LPDDR4 管脚 (约140) 显示接口 (HDMI/eDP/MIPI/DP) (约70) USB3.0×2 / PCIe3.0 / SATA (约100) GPIO/I2C/SPI/UART 等低速管脚 (约246) 总计: 636 管脚 RK3568 多出的272个管脚,主要分布在DDR、高速接口和GPIO上

从图上能看出来,RK3568多出来的管脚主要用在了三个地方:

  • DDR接口:支持DDR4需要额外的地址/控制管脚,多了约50个
  • 高速接口:第二路USB3.0、PCIe 3.0的2-lane、SATA,加起来多了约40个
  • GPIO:剩下的全给了通用IO,RK3568的GPIO资源比RK3566多了将近一倍
管脚兼容性警告: 这两颗芯片的管脚不是pin-to-pin兼容的。我曾经见过有人想用一块PCB兼容两颗芯片,结果发现DDR走线完全对不上。如果你有兼容设计的想法,趁早放弃——老老实实做两套PCB。

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更是直接物理上不存在了。

设备树中的体现: 在RK3566的设备树里,你可能会看到pcie节点,但它的phys属性指向的PHY节点是「残血版」的。我习惯在设备树里加一个status = "disabled"的检查,确保不会误开不存在的硬件。

2.3.2 时钟域差异

时钟域方面,两颗芯片的差异主要集中在高速接口上。RK3568多出了PCIe 3.0的100MHz参考时钟和SATA的专用时钟。

我画了一张时钟域对比图:

RK3566 vs RK3568 时钟域对比 RK3566 时钟域 CPU: 24MHz 晶振 → PLL → 1.8GHz DDR: 24MHz → PLL → 1600MHz (LPDDR4) PCIe: 100MHz 参考时钟 (仅PCIe 2.1) USB3: 24MHz → PLL → 5Gbps 显示: HDMI 148.5MHz / eDP 270MHz 总计: 5个主要时钟域 RK3568 时钟域 CPU: 24MHz 晶振 → PLL → 2.0GHz DDR: 24MHz → PLL → 1600/1866MHz (DDR4) PCIe: 100MHz 参考时钟 (PCIe 3.0 + 2.1) USB3: 24MHz → PLL → 5Gbps (×2路) 显示: HDMI 148.5MHz / eDP 270MHz / DP 总计: 7个主要时钟域 (+SATA +DP) RK3568 多出 SATA 专用时钟和 DP 时钟域,PCIe 时钟支持更高频率

时钟域的差异在设备树里怎么体现?我举个例子:

// 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时钟域被砍了,没法做高速串行化。

时钟配置陷阱: 如果你把RK3568的设备树直接拿来给RK3566用,内核会在初始化PCIe时卡住,因为找不到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时钟