3、RK3568硬件基础:核心板与底板资源、启动流程、存储布局、串口与网络接口
在进入Buildroot系统构建之前,必须先建立对RK3568硬件平台的完整认知。很多初学者在编译阶段遇到“内核启动卡死”“根文件系统挂载失败”“网络不通”等问题,根源往往不是软件配置错误,而是对硬件资源边界、启动介质选择、存储分区布局以及调试接口物理连接缺乏清晰理解。本章将围绕RK3568核心板与底板的资源划分、芯片级启动流程、存储布局设计以及串口与网络接口的工程细节展开,为后续系统构建提供硬件层面的决策依据。
上图展示了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× RJ45 | GMAC1 + RTL8211F | 主网络接口,支持WOL |
| 百兆以太网 | 1× RJ45(可选) | GMAC2 + 内置PHY | 辅助网络/工业控制 |
| USB 3.0 Host | 1× Type-A | USB3.0 OTG控制器 | U盘、移动硬盘、4G模块 |
| USB 2.0 OTG | 1× Type-C | USB2.0 OTG | 烧录、ADB调试、USB网卡 |
| HDMI 2.0 | 1× Type-A | HDMI TX | 4K@60Hz显示输出 |
| MIPI-DSI | 1× 4-lane | DSI控制器 | MIPI屏幕显示 |
| MIPI-CSI | 2× 4-lane | CSI控制器 | 双摄像头输入 |
| PCIe 3.0 | 1× x1 插槽 | PCIe控制器 | NVMe SSD、扩展卡 |
| SATA 3.0 | 1× 标准接口 | SATA控制器 | 机械硬盘/SSD |
| 40-Pin GPIO | 1× 2.54mm排针 | GPIO/I2C/SPI/UART/PWM | 传感器、LED、按键等 |
| 调试串口 | 1× 3.3V TTL | UART0 | 内核日志、Bootloader交互 |
底板设计时需特别注意电平匹配。RK3568的GPIO电压域分为VCCIO1(3.3V)、VCCIO2(1.8V)、VCCIO3(3.3V)等,不同Bank的IO电压可能不同。例如,I2C0位于VCCIO1域(3.3V),而I2C1位于VCCIO2域(1.8V)。在连接外部传感器时,必须确认其工作电压与对应Bank的IO电压一致,否则需要增加电平转换电路。
3.2 启动流程:从ROM Code到Linux内核
3.2.1 芯片级启动链路
RK3568的启动流程遵循Rockchip标准的四级启动模型:
- BootROM:芯片内部固化的只读代码,上电后首先执行。BootROM根据Boot Mode引脚(BOOT0/BOOT1)和eFUSE配置,决定从哪个介质加载下一级代码。支持eMMC、SPI NOR/NAND、SD卡、USB烧录模式。
- SPL (Secondary Program Loader):即U-Boot SPL,从存储介质加载到SRAM中执行。SPL负责初始化DDR控制器、时钟和部分外设,然后将完整的U-Boot加载到DDR中。
- U-Boot (TPL+SPL):完整的U-Boot运行在DDR中,负责加载内核镜像(boot.img)、设备树(dtb)和ramdisk。U-Boot支持交互式命令行,可通过串口中断进入。
- 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频率设置过高或电压不足,会导致启动崩溃或内存校验错误。
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。分区名称和用途如下:
| 分区名 | 偏移(扇区) | 大小(扇区) | 实际大小 | 用途 |
|---|---|---|---|---|
| uboot | 0x4000 | 0x2000 | 4MB | U-Boot主镜像 |
| misc | 0x6000 | 0x2000 | 4MB | 系统切换标志 |
| boot | 0x8000 | 0x10000 | 32MB | 内核+dtb+ramdisk |
| recovery | 0x18000 | 0x10000 | 32MB | 恢复模式 |
| backup | 0x28000 | 0x20000 | 64MB | 系统备份 |
| cache | 0x48000 | 0x40000 | 128MB | 缓存分区 |
| system | 0x88000 | 0x80000 | 256MB | 系统只读分区 |
| vendor | 0x108000 | 0x80000 | 256MB | 厂商私有库 |
| oem | 0x188000 | 0x80000 | 256MB | OEM定制 |
| rootfs | 0x208000 | 0x40000 | 128MB | 根文件系统 |
| userdata | 0x248000 | 0x40000 | 128MB | 用户数据 |
| user | 0x288000 | - | 剩余全部 | 用户扩展 |
在Buildroot中,默认的rootfs分区大小可能不足以容纳完整的系统。建议将rootfs分区调整为512MB或更大,或者直接将根文件系统放在user分区中。修改parameter文件后,需要重新打包烧录镜像。
3.3.2 镜像烧录方法
RK3568支持两种烧录方式:USB烧录(Loader模式)和SD卡烧录。USB烧录是最常用的方式,步骤如下:
- 安装驱动:Windows下安装Rockchip USB驱动,Linux下使用
upgrade_tool或rkdeveloptool。 - 进入Loader模式:按住RECOVERY键,然后上电,等待系统识别到设备。
- 烧录镜像:使用
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
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,可能的原因包括:
- 网线质量差或长度超过100米。
- PHY的TX/RX延迟配置不正确,导致RGMII时序不满足。
- 内核未启用TCP分段卸载(TSO)或校验和卸载。
- CPU频率被限制在低功耗模式,导致网络中断处理不及时。
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无显示,网络指示灯不亮。
分析过程:
- 首先检查电源:测量核心板VDD_CPU(1.0V)、VDD_LOGIC(0.9V)、VCC3V3_SYS(3.3V)均正常。
- 检查串口连接:确认USB转串口模块的TX/RX交叉连接正确,波特率设置为1500000。
- 检查启动介质:使用RECOVERY按键进入Loader模式,通过
rkdeveloptool rd读取设备信息,确认eMMC已识别。 - 检查U-Boot日志:重新烧录U-Boot后,串口输出
U-Boot 2017.09信息,说明BootROM和SPL工作正常。 - 检查内核启动: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.