3、RK3568硬件基础:核心板与底板资源、启动流程、存储布局、串口与网络接口

在进入Buildroot系统构建之前,必须先建立对RK3568硬件平台的完整认知。很多初学者在编译阶段遇到“内核启动卡死”“根文件系统挂载失败”“网络不通”等问题,根源往往不是软件配置错误,而是对硬件资源边界、启动介质选择、存储分区布局以及调试接口物理连接缺乏清晰理解。本章将围绕RK3568核心板与底板的资源划分、芯片级启动流程、存储布局设计以及串口与网络接口的工程细节展开,为后续系统构建提供硬件层面的决策依据。

RK3568 硬件资源与启动链路总览 RK3568 SoC 四核 Cortex-A55 @ 2.0GHz Mali-G52 GPU 0.8 TOPS NPU LPDDR4/4X 控制器 eMMC 5.1 / SD 3.0 Gigabit GMAC ×2 PCIe 3.0 / SATA 3.0 电源域 电源管理 PMIC: RK809-5 DCDC1: VDD_CPU 0.8-1.2V DCDC2: VDD_GPU 0.8-1.1V DCDC3: VDD_LOGIC 0.9-1.1V LDO: 1.8V / 3.3V / 2.8V RTC: 32.768kHz 存储接口 存储介质 eMMC 8/16/32GB SPI NOR/NAND Flash SD Card (底板扩展) 调试接口 调试与网络 UART0: 调试串口 1500000 UART2: 蓝牙/外设 GMAC1: RGMII 千兆 GMAC2: RMII 百兆 底板资源 • 电源输入: DC 12V / USB-C PD • 以太网: 1× RJ45 (RGMII) • USB: 1× USB3.0 Host, 1× USB2.0 OTG • HDMI 2.0 / eDP 1.3 / MIPI-DSI • MIPI-CSI ×2 / 千兆网口 • PCIe x1 插槽 / SATA 接口 • 40-Pin GPIO 扩展排针 • 板载 RTL8211F 千兆PHY • 板载 EEPROM / RTC 电池座 • 按键: RESET / RECOVERY / POWER • LED: 电源 / 用户 / 网络状态 • 调试串口: 3.3V TTL 排针 • 风扇接口: 5V PWM 控制 • 音频: 3.5mm 耳机 / 麦克风 • 摄像头: MIPI-CSI 双通道 • 显示: HDMI / eDP / MIPI 三选一

上图展示了RK3568核心板与底板之间的资源边界和关键信号流向。核心板集成了SoC、LPDDR4内存、eMMC存储、PMIC电源管理以及必要的时钟和复位电路,而底板则负责提供对外接口、网络PHY、电平转换、连接器以及扩展功能。理解这一分层结构,是后续配置Buildroot设备树(DTS)和内核菜单的基础。

3.1 核心板与底板资源划分

3.1.1 核心板资源清单与设计约束

RK3568核心板通常采用邮票孔或板对板连接器方式与底板交互。核心板上的资源属于“最小可运行系统”,包括:

  • 主芯片:RK3568 SoC,四核Cortex-A55,集成Mali-G52 GPU、0.8 TOPS NPU、4K视频编解码单元。
  • 内存:LPDDR4/4X,容量从1GB到8GB不等,数据总线位宽为32bit或16bit,频率可达1600MHz。
  • 存储:板载eMMC 5.1,常见容量8GB/16GB/32GB;部分核心板同时预留SPI NOR Flash(8MB/16MB)用于存放Bootloader备份。
  • 电源管理:RK809-5 PMIC,提供多路DCDC和LDO输出,支持软件动态调压(DVFS)。
  • 时钟:24MHz主晶振、32.768kHz RTC晶振,部分核心板还提供可编程时钟发生器。
  • 网络PHY:部分核心板直接集成RTL8211F千兆PHY,底板只需接RJ45连接器和网络变压器。

核心板设计的关键约束在于引脚复用和电源域分配。RK3568的GPIO引脚大多支持多种功能(I2C、UART、PWM、GPIO等),在Buildroot中配置设备树时,必须确保同一引脚不被多个外设同时占用。例如,GPIO3_C0可能同时被UART2和I2C5复用,若底板同时引出这两个接口,则需要在设备树中通过pinctrl节点明确指定功能。

3.1.2 底板资源与接口扩展

底板负责将核心板的信号转换为标准物理接口。典型底板资源包括:

接口类型数量/规格控制器典型用途
千兆以太网1× RJ45GMAC1 + RTL8211F主网络接口,支持WOL
百兆以太网1× RJ45(可选)GMAC2 + 内置PHY辅助网络/工业控制
USB 3.0 Host1× Type-AUSB3.0 OTG控制器U盘、移动硬盘、4G模块
USB 2.0 OTG1× Type-CUSB2.0 OTG烧录、ADB调试、USB网卡
HDMI 2.01× Type-AHDMI TX4K@60Hz显示输出
MIPI-DSI1× 4-laneDSI控制器MIPI屏幕显示
MIPI-CSI2× 4-laneCSI控制器双摄像头输入
PCIe 3.01× x1 插槽PCIe控制器NVMe SSD、扩展卡
SATA 3.01× 标准接口SATA控制器机械硬盘/SSD
40-Pin GPIO1× 2.54mm排针GPIO/I2C/SPI/UART/PWM传感器、LED、按键等
调试串口1× 3.3V TTLUART0内核日志、Bootloader交互

底板设计时需特别注意电平匹配。RK3568的GPIO电压域分为VCCIO1(3.3V)、VCCIO2(1.8V)、VCCIO3(3.3V)等,不同Bank的IO电压可能不同。例如,I2C0位于VCCIO1域(3.3V),而I2C1位于VCCIO2域(1.8V)。在连接外部传感器时,必须确认其工作电压与对应Bank的IO电压一致,否则需要增加电平转换电路。

常见误区:初学者常将核心板上的eMMC和底板上的SD卡混淆。eMMC是核心板上的焊接存储,作为系统的主存储介质;SD卡是底板上的可插拔设备,通常用于扩展存储或系统备份。在Buildroot中,默认根文件系统应放在eMMC上,SD卡可作为可移动存储挂载到 /mnt/sd 目录。若将根文件系统放在SD卡上,启动速度会明显变慢,且SD卡寿命有限,不适合频繁读写。

3.2 启动流程:从ROM Code到Linux内核

3.2.1 芯片级启动链路

RK3568的启动流程遵循Rockchip标准的四级启动模型:

  1. BootROM:芯片内部固化的只读代码,上电后首先执行。BootROM根据Boot Mode引脚(BOOT0/BOOT1)和eFUSE配置,决定从哪个介质加载下一级代码。支持eMMC、SPI NOR/NAND、SD卡、USB烧录模式。
  2. SPL (Secondary Program Loader):即U-Boot SPL,从存储介质加载到SRAM中执行。SPL负责初始化DDR控制器、时钟和部分外设,然后将完整的U-Boot加载到DDR中。
  3. U-Boot (TPL+SPL):完整的U-Boot运行在DDR中,负责加载内核镜像(boot.img)、设备树(dtb)和ramdisk。U-Boot支持交互式命令行,可通过串口中断进入。
  4. Linux Kernel:内核解压后初始化各子系统,挂载根文件系统,最终执行init进程。

在Buildroot中,我们通常使用U-Boot作为Bootloader。Buildroot会自动编译U-Boot,并生成 u-boot.bin、u-boot.img 和 spl/u-boot-spl.bin 等文件。烧录时需要按照Rockchip的镜像格式进行打包。

3.2.2 启动介质选择与优先级

RK3568的启动介质优先级由BootROM中的eFUSE和外部Boot Mode引脚共同决定。默认情况下,优先级为:eMMC → SPI NOR → SD卡 → USB烧录。在底板设计时,通常提供RECOVERY按键,按下后强制进入USB烧录模式(Loader模式),方便通过 rkdeveloptool 或 upgrade_tool 烧录镜像。

# 查看当前启动介质(在U-Boot命令行中)
mmc list
# 输出示例:
# mmc@fe2b0000: 1 (eMMC)
# mmc@fe2c0000: 0 (SD)

# 设置启动介质为eMMC
setenv boot_targets 'mmc1 mmc0'
saveenv

在Buildroot的U-Boot配置中,可以通过 CONFIG_BOOTCOMMAND 指定默认启动命令。例如,从eMMC启动内核:

setenv bootcmd 'mmc dev 1; ext4load mmc 1:1 ${kernel_addr_r} boot.img; ext4load mmc 1:1 ${fdt_addr_r} rk3568-evb.dtb; booti ${kernel_addr_r} - ${fdt_addr_r}'

3.2.3 启动流程中的关键时序参数

启动过程中,DDR初始化是最容易出问题的环节。RK3568的DDR频率由PMIC的DCDC输出电压和SoC内部的PLL配置共同决定。在Buildroot中,U-Boot的DDR初始化代码由Rockchip提供的 rk3568_ddr_1560MHz_v1.08.bin 等二进制文件控制,这些文件在U-Boot编译时被嵌入。如果DDR频率设置过高或电压不足,会导致启动崩溃或内存校验错误。

排障经验:当遇到U-Boot启动后DDR初始化失败(表现为串口输出 DDR Version ... 后卡死),首先检查PMIC的DCDC1输出电压是否在0.9V-1.2V范围内。使用万用表测量核心板上的VDD_CPU测试点,若电压低于0.8V,则可能是PMIC配置错误或负载过大。另外,检查DDR芯片的焊接质量,特别是BGA封装的核心板,虚焊会导致随机崩溃。

3.3 存储布局:分区规划与镜像烧录

3.3.1 标准分区表设计

RK3568的eMMC存储布局通常采用GPT分区表,但Rockchip的烧录工具使用自定义的parameter文件来定义分区。在Buildroot中,我们可以在 board/rockchip/rk3568/ 目录下找到 parameter-buildroot.txt 文件,其内容定义了各分区的起始位置、大小和名称。

FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3568
MACHINE_ID: 007
MANUFACTURER: Rockchip
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00010000@0x00008000(boot),0x00010000@0x00018000(recovery),0x00020000@0x00028000(backup),0x00040000@0x00048000(cache),0x00080000@0x00088000(system),0x00080000@0x00108000(vendor),0x00080000@0x00188000(oem),0x00040000@0x00208000(rootfs),0x00040000@0x00248000(userdata),-@0x00288000(user)

上述分区表中,每个分区的大小以扇区(512字节)为单位。例如,0x00002000 表示8192个扇区,即4MB。分区名称和用途如下:

分区名偏移(扇区)大小(扇区)实际大小用途
uboot0x40000x20004MBU-Boot主镜像
misc0x60000x20004MB系统切换标志
boot0x80000x1000032MB内核+dtb+ramdisk
recovery0x180000x1000032MB恢复模式
backup0x280000x2000064MB系统备份
cache0x480000x40000128MB缓存分区
system0x880000x80000256MB系统只读分区
vendor0x1080000x80000256MB厂商私有库
oem0x1880000x80000256MBOEM定制
rootfs0x2080000x40000128MB根文件系统
userdata0x2480000x40000128MB用户数据
user0x288000-剩余全部用户扩展

在Buildroot中,默认的rootfs分区大小可能不足以容纳完整的系统。建议将rootfs分区调整为512MB或更大,或者直接将根文件系统放在user分区中。修改parameter文件后,需要重新打包烧录镜像。

3.3.2 镜像烧录方法

RK3568支持两种烧录方式:USB烧录(Loader模式)和SD卡烧录。USB烧录是最常用的方式,步骤如下:

  1. 安装驱动:Windows下安装Rockchip USB驱动,Linux下使用 upgrade_tool 或 rkdeveloptool。
  2. 进入Loader模式:按住RECOVERY键,然后上电,等待系统识别到设备。
  3. 烧录镜像:使用 upgrade_tool 烧录整个update.img,或分别烧录各个分区。
# Linux下使用rkdeveloptool烧录
sudo rkdeveloptool db rk3568_loader_v1.15.112.bin
sudo rkdeveloptool wl 0 uboot.img
sudo rkdeveloptool wl 0x4000 boot.img
sudo rkdeveloptool wl 0x208000 rootfs.img
sudo rkdeveloptool rd
风险提示:烧录过程中严禁断电或拔插USB线,否则可能导致eMMC分区表损坏。如果烧录失败,可以尝试重新进入Loader模式并执行 rkdeveloptool ef 擦除整个eMMC,然后重新烧录。但擦除操作会丢失所有数据,务必提前备份。

3.4 串口与网络接口

3.4.1 调试串口(UART0)

RK3568的调试串口默认使用UART0,引脚为GPIO2_C0(TX)和GPIO2_C1(RX),电平为3.3V TTL。在底板设计时,通常引出4针排针:VCC、GND、TX、RX。连接USB转串口模块时,注意交叉连接:底板TX接模块RX,底板RX接模块TX。

串口参数固定为:1500000波特率,8数据位,无校验,1停止位。这是Rockchip平台的默认调试波特率,与常见的115200不同。在Buildroot中,内核的 earlycon 参数需要指定正确的波特率:

# 内核启动参数中添加earlycon
setenv bootargs 'console=ttyS0,1500000n8 earlycon=uart8250,mmio32,0xfe660000'

如果使用115200波特率连接,串口会输出乱码或完全无输出。在Buildroot的U-Boot配置中,可以通过 CONFIG_BAUDRATE=1500000 设置默认波特率。

3.4.2 千兆以太网接口

RK3568内置两个GMAC控制器,GMAC1支持RGMII接口,通常外接RTL8211F千兆PHY;GMAC2支持RMII接口,可外接百兆PHY或直接使用内置的百兆MAC。在Buildroot中,设备树需要配置PHY的地址、复位GPIO和时钟。

&gmac1 {
    status = "okay";
    phy-mode = "rgmii";
    clock_in_out = "input";
    snps,reset-gpio = &gpio3 RK_PB0 GPIO_ACTIVE_LOW;
    snps,reset-active-low;
    snps,reset-delays-us = <0 10000 50000>;
    pinctrl-names = "default";
    pinctrl-0 = <&gmac1_rgmii_pins>;
    phy-handle = <&phy0>;
};

&mdio1 {
    phy0: ethernet-phy@0 {
        reg = <0x0>;
        compatible = "ethernet-phy-ieee802.3-c22";
        reset-gpios = <&gpio3 RK_PB0 GPIO_ACTIVE_LOW>;
    };
};

网络接口的调试要点:

  • PHY地址冲突:RTL8211F的默认地址为0x0,如果底板上有多个PHY,需要修改设备树中的 reg 属性。
  • 时钟方向:RGMII接口的TX/RX时钟方向必须正确配置。通常由MAC提供TX时钟,PHY提供RX时钟,即 clock_in_out = "input"。
  • 复位时序:PHY复位后需要等待至少10ms才能访问MDIO总线,否则会导致PHY识别失败。

3.4.3 网络性能验证

在Buildroot系统启动后,使用 iperf3 测试网络吞吐量:

# 在开发主机上启动iperf3服务器
iperf3 -s

# 在RK3568目标板上运行客户端
iperf3 -c 192.168.1.100 -t 30 -i 5

正常情况下,千兆网口的吞吐量应达到900Mbps以上。如果吞吐量低于500Mbps,可能的原因包括:

  1. 网线质量差或长度超过100米。
  2. PHY的TX/RX延迟配置不正确,导致RGMII时序不满足。
  3. 内核未启用TCP分段卸载(TSO)或校验和卸载。
  4. CPU频率被限制在低功耗模式,导致网络中断处理不及时。
实战建议:在Buildroot中启用网络性能优化选项。内核配置中开启 CONFIG_TCP_CONG_ADVANCED、CONFIG_TCP_CONG_BBR 和 CONFIG_NET_SCH_FQ,可以显著提升高延迟网络环境下的吞吐量。同时,在U-Boot中设置 ethaddr 环境变量,确保MAC地址唯一,避免网络冲突。

3.5 案例拆解:从零搭建最小系统并验证启动

下面通过一个完整案例,演示如何基于RK3568核心板和底板,使用Buildroot构建最小系统并验证硬件功能。

背景与约束:某工业控制项目需要一块RK3568核心板,底板需要提供1路千兆网口、1路调试串口、1路USB Host和1路HDMI显示。系统要求启动时间小于5秒,根文件系统采用只读挂载以增强可靠性。

初始现象:使用默认Buildroot配置编译后,烧录到eMMC,上电后串口无输出,HDMI无显示,网络指示灯不亮。

分析过程:

  1. 首先检查电源:测量核心板VDD_CPU(1.0V)、VDD_LOGIC(0.9V)、VCC3V3_SYS(3.3V)均正常。
  2. 检查串口连接:确认USB转串口模块的TX/RX交叉连接正确,波特率设置为1500000。
  3. 检查启动介质:使用RECOVERY按键进入Loader模式,通过 rkdeveloptool rd 读取设备信息,确认eMMC已识别。
  4. 检查U-Boot日志:重新烧录U-Boot后,串口输出 U-Boot 2017.09 信息,说明BootROM和SPL工作正常。
  5. 检查内核启动:U-Boot加载内核后,串口输出 Starting kernel ... 后卡死,说明内核崩溃。

关键日志:

Starting kernel ...
[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x412fd050]
[    0.000000] Linux version 5.10.110 (buildroot@host) (gcc version 10.3.0) #1 SMP
[    0.000000] Machine model: Rockchip RK3568 EVB
[    0.000000] earlycon: uart0 at MMIO32 0x00000000fe660000 (options '1500000n8')
[    0.000000] printk: bootconsole [earlycon0] enabled
[    0.000000] Reserved memory: created DMA memory pool at 0x0000000010000000, size 64 MiB
[    0.000000] OF: fdt: Ignoring memory range 0x10000000 - 0x14000000
[    0.000000] Memory: 1024MB 2048MB total
[    0.000000] Kernel panic - not syncing: No working init found.  Try passing init= option to kernel.