RK3588-kernel BringUp记录(一)

一、说明

编译环境:Ubuntu22.04

kernel 版本(develop-6.6)、Uboot版本地址:
https://github.com/rockchip-linux

安装基础依赖包

sudo apt-get update
sudo apt-get install build-essential gcc-aarch64-linux-gnu binutils-aarch64-linux-gnu \
bc libssl-dev bison flex libncurses5-dev git make

二、编译过程

kernel编译脚本

#!/bin/bash
# ====================================================
# 项目:RK3588 Linux 6.6 内核一键编译脚本
# 描述:适用于跨平台交叉编译环境
# ====================================================

# 开启严格模式:任何一步出错(比如缺依赖),脚本立刻停止,防止带错编译
set -e

# 1. 设置环境变量(核心命脉)
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

# 自动获取当前机器的最大逻辑核心数
CORES=$(nproc)

echo "================================================="
echo "  🛠️ 启动 RK3588 内核自动编译流..."
echo "  ⚡ 当前分配的并发线程数: ${CORES}"
echo "================================================="

# 2. 加载原厂配置
echo -e "\n>>> [1/2] 正在加载默认配置 (rockchip_linux_defconfig)..."
make rockchip_linux_defconfig

# 3. 启动多线程编译
echo -e "\n>>> [2/2] 开始编译内核 Image 和 设备树 dtbs..."
# 记录开始时间
START_TIME=$(date +%s)

make Image dtbs -j${CORES}

# 记录结束时间并计算耗时
END_TIME=$(date +%s)
COST_TIME=$((END_TIME - START_TIME))

echo "================================================="
echo "  ✅ 编译流水线执行完毕!"
echo "  ⏱️ 总耗时: ${COST_TIME} 秒"
echo "  📦 内核镜像产物: arch/arm64/boot/Image"
echo "================================================="

uboot 编译

export ARCH=arm64
export CROSS_COMPILE=/usr/bin/aarch64-linux-gnu-

./make.sh rk3588

以上生成的是内核Imageuboot.img。但是这里有确实文件,瑞芯微还需要trust.imgloader.bin,去官方仓库下载rkbin,然后将rkbin目录放在和uboot同级目录。然后再次编译会输出如下日志:

*******boot_merger ver 1.35********

Info:Pack loader ok.

pack loader okay! Input: /home/tracy/RK3588/uboot/rkbin/RKBOOT/RK3588MINIALL.ini

/home/tracy/RK3588/uboot/u-boot-next-dev

Image(no-signed, version=0): uboot.img (FIT with uboot, trust...) is ready

Image(no-signed): rk3588_spl_loader_v1.19.113.bin (with spl, ddr...) is ready

pack uboot.img okay! Input: /home/tracy/RK3588/uboot/rkbin/RKTRUST/RK3588TRUST.ini

Platform RK3588 is build OK, with new .config(make rk3588_defconfig -j56)

/usr/bin/aarch64-linux-gnu-

Wed Apr  8 17:52:05 CST 2026

至此编译完成

三、烧录阶段

瑞芯微官方烧录工具需要一个parameter.txt 分区表,分区表的描述如下:

🧱 绝对禁区与地基(0x00000000 附近)

  • 1. Loader (底盘引导): 这是芯片上电后跑的第一段代码(你编译的 spl_loader.bin)。它运行在芯片内部极小的 SRAM 里,唯一的使命就是把庞大的 DDR 内存初始化好。它写在整个闪存最开头的绝对禁区。

  • 2. Parameter (系统地契): 就是刚才我们手写的 parameter.txt 文本文件。它也是烧录在底层的,U-Boot 启动时会读取它,从而知道整块闪存是怎么分区的。

🚀 启动与控制中枢(0x00004000 开始)

  • 3. Uboot (起动机): 系统的二级引导程序(你编译的 uboot.img)。它负责接管已经初始化好的 DDR,点亮串口,配置基础硬件,最后把 Linux 内核搬运到内存中并交接权力。

  • 4. trust (安全中心): ARM TrustZone 运行环境(TF-A 固件)。它掌握着芯片的最高运行权限(EL3),负责指纹、加密、支付等安全级别最高的操作。(注:在 RK3588 的新版 FIT 格式中,它已经被揉进 uboot.img 里了,所以这行可以不刷。)

⚙️ 系统配置与资源

  • 5. Misc (标志位信箱): 英文 Miscellaneous(杂项)的缩写。这是一个存放“开机状态标志”的小抽屉。比如,你在 Android 里点击了“恢复出厂设置”,系统就会往这里写个纸条;下次开机时 U-Boot 看到这个纸条,就不进正常系统了,而是拐弯去进 Recovery 模式。

  • 6. Resource (资源库): 通常存放 Linux 的 设备树 (DTB) 和开机 Logo 图片。U-Boot 会把这里的设备树读出来,作为“硬件接线图”喂给内核。

🏎️ 双核引擎区

  • 7. Kernel (V8 发动机): 最核心的 Linux 内核本体!你辛辛苦苦编译出来的那个几十兆的纯净 Image 二进制文件,就原封不动地拍在这个区域。

  • 8. Boot (打包版引擎): 也是用来放内核的,但格式不同。在 Android 系统或者某些 Linux 发行版里,官方喜欢把 Kernel 和一个叫 ramdisk(内存虚拟盘)的东西打包成一个叫 boot.img 的文件刷在这里。如果用了 Boot,通常就不单独刷 Kernel 那个区了。

🏥 抢救室与大本营

  • 9. Recovery (急救室): 这是一个极其精简的、独立的备用 Linux 系统。当你的主系统(System)崩溃了,或者你需要 OTA 连网刷机时,设备就会启动到这个分区。

  • 10. System (车厢与内饰): 也叫 RootFS (根文件系统)。这就是 Linux 的大本营!这里面装着 /bin, /etc, /usr 目录,装着 ls, cd, apt-get 这些基础命令,以及未来的 MPP 视频加速库和你写的业务代码。它是整个闪存里占地最大的区域。

💾 备份区

  • 11. Backup (备份仓库): 存放出厂时的重要数据备份。如果由于断电导致部分系统文件损坏,系统有时可以从这里恢复关键配置。

分区表地址定义:

FIRMWARE_VER: 1.0
MACHINE_MODEL: rk3588
MACHINE_ID: 007
MANUFACTURER: ROCKCHIP
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: rk3588
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00004000@0x00004000(uboot),0x00004000@0x00008000(trust),0x00002000@0x0000c000(misc),0x00008000@0x0000e000(resource),0x00020000@0x00016000(kernel),0x00020000@0x00036000(boot),0x00040000@0x00056000(recovery),0x00800000@0x00096000(system),0x00040000@0x00896000(backup),-@0x008d6000(userdata)

然后勾选loader parameter uboot 以及kernel选项就可以开始烧录

启动后的日志流程:

第一阶段:生命的最初脉动 (BootROM 与 Emmc 初始化)

Boot1 Release Time: Oct 17 2023 17:09:54, version: 1.11
Emmc IO init.
SetEmmcClk: 375000, 2, 64
SetEmmcClk: 200000000, 0, 3
UserCapSize=118000MB

  • 发生了什么? 芯片刚刚上电,内部死板的 BootROM 正在苏醒。它检测到启动介质是 eMMC,于是开始“盘道”。

  • 细节解读:它先用极其安全的 375kHz 极低时钟频率去敲门,等 eMMC 响应后,立刻挂上高速挡,把时钟飙到 200MHz。它成功认出了你这块容量大概是 128GB(118000MB)的 eMMC 闪存。这说明底层硬件的 eMMC 通信是完全正常的。

第二阶段:极其硬核的 DDR 内存训练 (SPL 阶段)

SoftReset, 3624403 us
 DDR ff1a08bde6 typ 25/03/13-15:39:39,fwver: v1.19
LPDDR4X, 2112MHz
channel[0] BW=16 Col=10 Bk=8 CS0 Row=17 CS1 Row=17 CS=2 Die BW=16 Size=4096MB
... (4 个 channel 打印)
Manufac turer ID:0xff

  • 细节解读:这是全场最壮观的一幕。它探测到你的板子上贴的是 LPDDR4X 内存,且拥有极度豪华的 4 个通道(Channel 0-3),每个通道 4096MB,总内存高达 16GB!

  • 硬核动作:随后的 DQ rds, TX Vref 是极其底层的信号眼图扫描(读写延时校准)。最后的 change to F1...F0 是内存的动态调频测试,它让内存从 528MHz 一路飙升到 2112MHz(等效频率 4266MHz)。

第三阶段:U-Boot SPL 的困境与挣扎

U-Boot SPL 2017.09-ge4e124926e-230922 #lxh (Sep 25 2023 - 10:58:38), fwver: v1.13
unknown raw ID 0 0 0
unrecognized JEDEC id bytes: 00, 00, 00
Trying to boot from MMC2
MMC: no card present
Trying to boot from MMC1

困境再现:它尝试去读 SPI Flash(JEDEC id bytes: 00),失败;它尝试去读 SD 卡(MMC2),没插卡,失败;最后,它终于在 eMMC(MMC1)里找到了归宿。

第四阶段:致命的“包裹解压”失败 (事故中心)

Trying fit image at 0x4000 sector
## Checking uboot 0x00200000 (gzip @0x00400000) ... 
uboot: decompress error, ret=-110
OK
## Checking optee 0x08400000 (gzip @0x08600000) ... 
optee: decompress error, ret=-110
OK
Jumping to U-Boot(0x00200000) via ARM Trusted Firmware(0x00040000)
Failed to stop decompress: decompress@fea80000, ret=-110

这里就出了问题:

这句话暴露了 U-Boot 在 DDR 内存里的工作轨迹:

  • 压缩包数据(Source)被加载到了物理内存的 0x00400000 处。

  • 解压后的本体(Destination)被设定必须放在 0x00200000 处。

而我们的镜像大小是4M,所以直接覆盖了源文件地址导致解压出错。

有两种方案解决

方案 A:减肥法

正常的 RK3588 U-Boot 镜像(包含了 trust 等)大小一般在 1.5MB - 2MB 左右。你的高达 4MB,绝对是因为开启了太多没用的功能(比如花里胡哨的 LCD 驱动、多余的调试符号),或者是没有 make clean 导致包里塞进了历史垃圾。 做法:在 U-Boot 源码里执行 make distclean,重新跑一遍 make rk3588_defconfig,然后再用 ./make.sh rk3588 重新编译。看看能不能瘦身到 2MB 以下。

方案 B:挪位置法

为什么要受制于这区区 2MB?我们直接修改底层的加载坐标,把收件台挪远一点,给解压留出 10MB 的太平洋宽阔空间!

我这边采用的是在uboot头文件rk3588_common.h

修改解压地址:
#define CONFIG_SYS_TEXT_BASE        0x02000000  //0x00200000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值