2. 编译并烧录最小系统镜像

任务说明

本案例基于瑞芯微RK3568平台,使用官方SDK完成U-Boot、内核(Kernel)与根文件系统(Rootfs)的编译,生成可用于烧录的完整镜像文件,并通过RKDevTool烧录至开发板,最终上电启动进入系统命令行。

环境准备

宿主机需为Ubuntu 20.04/22.04 x86_64,已安装SDK(路径示例:~/rk3568_sdk)。SDK目录结构应包含:

rk3568_sdk/
├── u-boot/
├── kernel/
├── buildroot/
├── device/rockchip/
├── rockdev/          # 编译输出目录(自动生成)
└── build.sh          # 顶层编译脚本

首次使用需安装依赖:sudo apt install repo git ssh make gcc libssl-dev bc flex bison device-tree-compiler。

编译实现

SDK已提供一键编译脚本,以下命令在SDK根目录执行。整个过程约需30-60分钟(取决于机器性能),请确保磁盘剩余空间大于20GB。

# 1. 选择默认配置(RK3568 EVB板型)
source build/envsetup.sh
lunch rk3568_evb7-eng

# 2. 编译U-Boot
./build.sh uboot

# 3. 编译内核
./build.sh kernel

# 4. 编译根文件系统(Buildroot)
./build.sh rootfs

# 5. 打包生成统一烧录镜像(rockdev/目录下)
./build.sh updateimg

若需单独编译某个部分,可分别执行上述第2-4步;第5步必须最后执行,它将U-Boot、内核与Rootfs打包为update.img及分区镜像。

关键代码说明

SDK的build.sh内部通过device/rockchip/rk3568/BoardConfig.mk读取板型配置,核心编译流程如下(该文件为SDK自带,无需修改):

# BoardConfig.mk 关键配置项(节选)
export RK_CHIP=rk3568
export RK_UBOOT_DEFCONFIG=evb_rk3568
export RK_KERNEL_DEFCONFIG=rockchip_linux_defconfig
export RK_KERNEL_DTS=rk3568-evb1-ddr4-v10
export RK_ROOTFS_TYPE=ext4
export RK_ROOTFS_SIZE=512M

上述配置决定了编译目标:U-Boot使用evb_rk3568配置,内核使用rockchip_linux_defconfig并编译设备树rk3568-evb1-ddr4-v10.dtb,根文件系统为ext4格式、大小512MB。编译产物输出至rockdev/目录:

rockdev/
├── update.img          # 统一烧录镜像(含全部分区)
├── uboot.img
├── boot.img            # 内核+dtb
├── rootfs.img
└── parameter.txt       # 分区表

烧录与启动

使用Windows版RKDevTool(v3.15+)或Linux版upgrade_tool烧录。以RKDevTool为例:

1. 开发板进入MaskROM模式:按住BOOT键,接入USB,上电
2. 打开RKDevTool,点击"高级功能"→"烧录统一镜像"
3. 选择rockdev/update.img,点击"执行"
4. 等待进度条完成,开发板自动重启

若使用Linux工具:

sudo upgrade_tool uf rockdev/update.img

验证方法

烧录成功后,开发板串口(默认波特率1500000)应输出U-Boot启动日志,随后内核启动并挂载rootfs,最终出现登录提示符:

RK3568_EVB7 login: root
# uname -a
Linux RK3568_EVB7 5.10.110 #1 SMP ... aarch64 GNU/Linux

判定标准:

  1. 串口日志无FATAL或Kernel panic错误;
  2. 能够以root用户登录(默认无密码);
  3. 执行cat /proc/version可看到内核版本与编译时间。

常见问题

  • 编译报错mkimage: command not found:安装u-boot-tools包:sudo apt install u-boot-tools。
  • 烧录后无法启动:确认parameter.txt与镜像匹配,尝试擦除Flash后重新烧录(RKDevTool"擦除所有分区")。
  • Rootfs空间不足:修改BoardConfig.mk中RK_ROOTFS_SIZE后重新编译rootfs。