一、说明
编译环境: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
以上生成的是内核Image、uboot.img。但是这里有确实文件,瑞芯微还需要trust.img 和 loader.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万+

被折叠的 条评论
为什么被折叠?



