2、RK3588硬件平台基础
RK3588是瑞芯微推出的旗舰级八核应用处理器,采用三星8nm工艺制造,CPU部分为4×Cortex-A76(2.4GHz)+4×Cortex-A55(1.8GHz)的大小核架构,GPU为Mali-G610 MP4,NPU算力达6 TOPS。这颗芯片的特别之处在于其强大的异构计算能力和丰富的高速外设接口,使其在边缘计算、智能NVR、ARM PC、工业控制等领域都有广泛应用。对于uboot移植工作而言,理解芯片的内存映射、启动设备选择、时钟树和电源域管理是首要任务——uboot的本质就是"把硬件初始化到内核可以接管的状态",因此对硬件平台的熟悉程度直接决定了移植工作的效率和质量。
2.1 RK3588芯片架构概览
RK3588的内存映射和地址空间布局是uboot移植的第一份参考资料。芯片内部集成了丰富的外设控制器,每个控制器都映射到固定的物理地址范围。uboot的板级初始化代码(board_init)需要根据原理图配置对应的寄存器基地址和时钟门控。
| 模块 | 说明 | uboot关注点 |
|---|---|---|
| CPU簇 | 4×A76 + 4×A55,支持CCI/CMN一致性总线 | 多核启动(psci)、CPU频率调节 |
| GPU | Mali-G610 MP4,支持Vulkan/OpenGL ES | 无需uboot驱动,但需保证供电和时钟 |
| NPU | 6 TOPS算力,支持INT8/INT16 | 无需uboot驱动,但需初始化电源域 |
| 内存控制器 | 支持LPDDR4/4x/5,最大32GB | DDR初始化参数(频率、时序、训练) |
| 存储接口 | eMMC 5.1、SD 3.0、SPI NOR/NAND | 启动设备驱动、分区表 |
| 显示接口 | HDMI 2.1、DP 1.4、MIPI-DSI、eDP | 显示初始化(uboot logo) |
| 网络 | 2× GMAC(10/100/1000Mbps) | 网络驱动(TFTP下载内核) |
| 高速外设 | PCIe 3.0 x4、SATA 3.0、USB 3.1 | PCIe枚举、USB host/device |
2.2 关键外设详解
RK3588的外设控制器在uboot中的驱动代码主要位于drivers/目录下,包括mmc、net、usb、pci等子目录。每个外设的初始化顺序和依赖关系需要仔细梳理。
2.2.1 DDR内存
DDR初始化是uboot启动过程中最关键的步骤之一。RK3588的DDR控制器支持LPDDR4/4x/5,数据总线宽度为32bit或64bit,最高频率可达4266Mbps。在TPL阶段,uboot会执行DDR训练算法,根据板级配置的DDR颗粒型号和布线长度自动调整时序参数。
// 板级DDR配置示例 (rk3588-evb.dtsi)
&ddr_timing {
clock-frequency = <2133000000>; // DDR频率
tRCD = <18>;
tRP = <18>;
tRAS = <42>;
tRFC = <350>;
tWR = <18>;
tWTR = <6>;
};
2.2.2 eMMC与SD卡
eMMC和SD卡是uboot的主要启动介质。RK3588的eMMC控制器支持HS400模式,SD控制器支持UHS-I SDR104。在uboot中,需要配置对应的GPIO(如SD卡检测脚、电源使能脚)和时钟频率。
- eMMC:通常连接到SDHCI0控制器,数据线为8bit,需要配置
mmc0节点。 - SD卡:通常连接到SDHCI1控制器,数据线为4bit,需要配置
mmc1节点。 - 启动顺序:通过BOOT引脚的电平组合决定优先从哪个设备启动。
2.2.3 USB与PCIe
USB 3.1 Gen1(Type-C)和PCIe 3.0是RK3588的高速扩展接口。在uboot中,USB通常用于支持键盘、U盘等设备,PCIe则用于NVMe SSD或扩展网卡。
// USB控制器配置示例
&usb_host0_xhci {
status = "okay";
dr_mode = "host";
maximum-speed = "high-speed";
};
// PCIe控制器配置示例
&pcie2x1l0 {
reset-gpios = <&gpio3 RK_PB6 GPIO_ACTIVE_HIGH>;
status = "okay";
};
2.2.4 以太网
RK3588内置两个GMAC控制器,支持RGMII/RMII接口。在uboot中,网络驱动主要用于TFTP下载内核和设备树。需要配置PHY的复位GPIO、时钟源和MDIO总线地址。
2.2.5 显示接口
HDMI 2.1、DP 1.4、MIPI-DSI和eDP接口使得RK3588在显示方面非常灵活。uboot阶段通常只需要初始化HDMI或DP用于显示logo,需要配置对应的PHY和时钟。
2.3 开发板硬件资源与原理图阅读要点
以瑞芯微官方EVB为例,开发板集成了丰富的接口资源。阅读原理图时,建议按照以下顺序进行:
- 电源树:从DC输入开始,追踪每一路电源的转换路径(DC-DC/LDO),确认各电源域的电压值和上电时序。
- 启动配置:找到BOOT引脚相关的电阻配置,确认当前板卡的启动设备优先级。
- 时钟电路:确认24MHz主晶振、32.768kHz RTC晶振的连接,以及各PLL的参考时钟。
- 调试接口:找到UART2(调试串口)的TX/RX引脚,确认电平转换芯片的型号。
- 复位电路:确认全局复位(POR)和各个外设的复位信号连接。
2.4 启动流程概述
RK3588的启动流程分为四个阶段,每个阶段都有明确的职责和交接条件。
| 阶段 | 存储位置 | 主要任务 | 交接条件 |
|---|---|---|---|
| BootROM | 芯片内部ROM | 初始化SRAM、检测启动设备、加载TPL | TPL加载到SRAM并跳转 |
| TPL | eMMC/SD/SPI | 初始化DDR、加载SPL | SPL加载到DDR并跳转 |
| SPL | eMMC/SD/SPI | 初始化存储控制器、加载U-Boot | U-Boot加载到DDR并跳转 |
| U-Boot | DDR | 初始化外设、加载内核和设备树 | 跳转到内核入口 |
在uboot移植过程中,需要特别关注TPL和SPL的编译配置。TPL通常只包含DDR初始化和最基本的串口输出,SPL则负责加载完整的U-Boot。瑞芯微的构建系统会自动处理这些依赖关系。
2.5 实战场景:从零开始配置最小启动系统
假设我们拿到一块基于RK3588的自研板卡,需要完成uboot的最小系统移植。以下是具体步骤:
- 确认硬件配置:从原理图中提取DDR颗粒型号(如LPDDR4x 8GB)、eMMC型号(如三星KLUBG4G1CE)、PHY芯片型号(如RTL8211F)。
- 创建板级目录:在
u-boot/board/rockchip/下创建myboard_rk3588目录,复制EVB的配置作为起点。 - 修改设备树:在
arch/arm/dts/下创建rk3588-myboard.dts,修改内存节点、eMMC节点、网络节点和串口节点。 - 配置DDR参数:使用瑞芯微的DDR工具生成参数,填入
rk3588-ddr-timing.dtsi。 - 编译验证:执行
make myboard_rk3588_defconfig和make,生成uboot.img。 - 烧录测试:通过RKDevTool烧录到eMMC,观察串口输出,逐步排查问题。
2.6 常见误区与总结
- 误区一:忽略电源时序。RK3588对上电时序有严格要求,如果VDD_CPU先于VDD_LOGIC上电,可能导致芯片闩锁效应。
- 误区二:DDR参数照搬EVB。不同板卡的PCB布线长度、层叠结构不同,DDR训练参数必须重新生成。
- 误区三:SPL阶段初始化过多外设。SPL的代码大小受限于SRAM容量(RK3588的SRAM约192KB),应保持精简。
- 误区四:忽略时钟树配置。外设的时钟门控和分频配置错误会导致外设无法工作,且难以排查。
总结而言,RK3588的uboot移植是一个系统工程,需要硬件、软件和系统知识的综合运用。建议在动手之前,先花时间完整阅读芯片手册中的内存映射、时钟树和电源管理章节,同时对照原理图逐一确认每个引脚的连接。只有对硬件平台有了深入理解,才能高效地完成uboot移植和后续的Buildroot集成工作。