2、RK3568 SDK开发-Uboot
一、Uboot概念和镜像烧录1、核心概念U-Boot的作用它是一个引导加载程序主要负责初始化硬件如DDR内存、时钟、存储设备并将Linux内核从Flash如eMMC加载到内存中运行。1.2 镜像描述uboot编译后主要使用到2个镜像文件uboot.img、rk356x_spl_loader_v1.13.112.binalexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot$fileuboot.img uboot.img: Device Tree Blob version17,size3584, bootCPU0, string blocksize197, DT structure blocksize2824alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot$filerk356x_spl_loader_v1.13.112.bin rk356x_spl_loader_v1.13.112.bin: data alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot$uboot.img 是一种FIT格式镜像多个固件组件打包成一个统一文件的镜像格式包括trust镜像ARM Trusted Firmware OP-TEE OS、u-boot镜像、u-boot.dtb再编译u-boot时会将这些镜像打包合并成uboot.img。此固件烧录到rk3568芯片的uboot分区它的烧录地址和名称需要根据parameter.txt分区表中定义的进行配置。rk356x_spl_loader_v1.13.112.bin也称为MiniLoaderAll.bin它的烧录地址不用配置使用0x00000000因为该镜像有专门的烧录地址无需用户配置。1.3 分区表文件描述SDK板级配置文件中定义了RK3568 linux系统所使用的分区表文件export RK_PARAMETERparameter-buildroot-fit.txtlexalex-virtual-machine:~/workspace/rk3568/linux_sdk/device/rockchip/rk356x$catBoardConfig-rk3568-atk-evb1-ddr4-v10.mk#!/bin/bash# Target archexportRK_ARCHarm64# Uboot defconfigexportRK_UBOOT_DEFCONFIGrk3568# Uboot image format type: fit(flattened image tree)exportRK_UBOOT_FORMAT_TYPEfit# Kernel defconfigexportRK_KERNEL_DEFCONFIGrockchip_linux_defconfig# Kernel defconfig fragmentexportRK_KERNEL_DEFCONFIG_FRAGMENT# Kernel dtsexportRK_KERNEL_DTSrk3568-atk-evb1-ddr4-v10-linux# boot image typeexportRK_BOOT_IMGboot.img# kernel image pathexportRK_KERNEL_IMGkernel/arch/arm64/boot/Image# kernel image format type: fit(flattened image tree)exportRK_KERNEL_FIT_ITSboot.its# parameter for GPT tableexportRK_PARAMETERparameter-buildroot-fit.txt# Buildroot configexportRK_CFG_BUILDROOTrockchip_rk3568# Recovery configexportRK_CFG_RECOVERYrockchip_rk356x_recovery# Recovery image format type: fit(flattened image tree)exportRK_RECOVERY_FIT_ITSboot4recovery.its# ramboot configexportRK_CFG_RAMBOOT# Pcba configexportRK_CFG_PCBA# Build jobsexportRK_JOBS24# target chipexportRK_TARGET_PRODUCTrk356x# Set rootfs type, including ext2 ext4 squashfsexportRK_ROOTFS_TYPEext4# Set debian version (debian10: buster, debian11: bullseye)exportRK_DEBIAN_VERSIONbuster# yocto machineexportRK_YOCTO_MACHINErockchip-rk3568-evb# rootfs image pathexportRK_ROOTFS_IMGrockdev/rootfs.${RK_ROOTFS_TYPE}# Set ramboot image typeexportRK_RAMBOOT_TYPE# Set oem partition type, including ext2 squashfsexportRK_OEM_FS_TYPEext2# Set userdata partition type, including ext2, fatexportRK_USERDATA_FS_TYPEext2#OEM configexportRK_OEM_DIRoem_normal# OEM build on buildroot#export RK_OEM_BUILDIN_BUILDROOTYES#userdata configexportRK_USERDATA_DIRuserdata_normal#misc imageexportRK_MISCwipe_all-misc.img#choose enable distro moduleexportRK_DISTRO_MODULE# Define pre-build script for this boardexportRK_BOARD_PRE_BUILD_SCRIPTapp-build.sh alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/device/rockchip/rk356x$分区表文件详细描述alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/device/rockchip/rk356x$catparameter-buildroot-fit.txt FIRMWARE_VER:1.0#升级工具根据此信息识别固件版本号MACHINE_MODEL: RK3568#机器型号用于升级工具显示在recovery里面升级固件时可以用于判断固件和机器是否匹配MACHINE_ID: 007#产品开发IDMANUFACTURER: RK3568#厂商信息用于升级工具显示MAGIC: 0x5041524B#魔数 不可修改ATAG: 0x00200800#32bit DDR 地址MACHINE: 0xffffffff#内核识别使用不可修改此定义与内核匹配CHECK_MASK: 0x80#保留不能修改PWR_HLD:0,0,A,0,1 TYPE: GPT#GPT分区表标识烧录工具会根据CMDLINE里面的定义的分区创建GPT分区表paramter文件不会烧录到VNM(nand emmc等)存储器中。CMDLINE:mtdpartsrk29xxnand:0x000020000x00004000(uboot),0x000020000x00006000(misc),0x000200000x00008000(boot),0x000200000x00028000(recovery),0x000100000x00048000(backup),0x00c000000x00058000(rootfs),0x000400000x00c58000(oem),-0x00c98000(userdata:grow)#为了兼容目前所有AP都用rk29xxnand做标识#符号之前的数值是分区大小符号之后的数值是分区的起始地址中的字符是分区的名字。所有数值的单位是sector1sector 512 Byte。#为了性能每个分区起始地址需要32KB64 sectors对齐大小也需要32KB的整数倍#如果使用 sparse 格式的镜像升级时会擦除数据为了兼容性更好对应的分区最好按4MB对齐大小也按4MB整数倍配置#使用GPT分区时parameter 里面定义的地址都是真实的逻辑地址LBA例如 uboot 定义在0x4000那么烧录到 EMMC 和 NAND 里面时逻辑地址也是0x4000.#最后一个分区需要指定 grow 参数工具会把剩余的空间都分配给最后一个分区uuid:rootfs614e0000-0000-4b53-8000-1d28000054a9 alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/device/rockchip/rk356x$1.4 镜像文件烧录1.4.1 模式介绍Rockchip平台硬件设备运行在Maskrom、loader、recovery、normal boot模式Maskrom模式Flash未有镜像可进行初次镜像的烧录若无法进入Loader模式也可进入此模式下进行烧录Loader模式可进行镜像的烧写、更新、可以通过烧写工具单独烧写某一分区的镜像文件进入Maskron模式开发板未有镜像上电默认进入该模式开发板烧录过镜像在在 U-Boot 命令行下执行“rbrom”命令进入到 Maskrom 模式进入Loader模式开发板烧录过镜像 在 U-Boot 命令行下执行“download”命令进入到 Loader 模式开发板烧录过镜像 在 Linux 系统下通过串口或 ADB 执行命令“reboot loader”重启进入到 Loader 模式开发板烧录过镜像上电或复位后开发板正常启动进入到系统后瑞芯微开发工具也就是 RKDevTool 工具会显示“发现一个 ADB设备”然后点击“切换”按钮进入到 Loader模式切换成功如下图所示1.4.2 MiniLoaderAll.bin镜像烧写1.3.2 uboot镜像烧录验证开发板中的uboot是否运行成功通过观察到开发板输出的信息U-Boot 2017.09-g7ba1139 #alex (Jul 07 2026 - 12:06:41 0800)则uboot镜像从编译到运行整个流程都正常。U-Boot2017.09-g7ba1139#alex (Jul 07 2026 - 12:06:41 0800)Model: Rockchip RK3568 Evaluation Board MPIDR: 0x81000000 PreSerial:2, raw, 0xfe660000 DRAM:2GiB Sysmem: init Relocation Offset: 7d219000 Relocation fdt: 7b9f8ba8 - 7b9fecd8 CR: M/C/I Using default environment二、启动流程分析2.1、rk3568的二级启动流程一级Loader(TPL(Tiny Program Loader))运⾏在 芯片内部sram 中负责初始化ddr 内存控制器使DDR可用二级Loader(SPL(Secondary Program Loader))rk356x_spl_loader_v*.bin文件提供运⾏在 ddr 中负责完成系统的 lowlevel 初始化时钟、存储等、后级固件加载trust.img 和uboot.imgU-boot本体由uboot.img文件提供完成大部分硬件初始化并最终引导。TPL 和 SPL 是 Rockchip 特有的两级加载器不同于主线的 SPL/U-Boot 分工。TPL 体积极小只做 DDR 初始化目的是让后续代码能运行在 DDR 中。trust.img是 ARM TrustZone 固件包含 OP-TEE 或 BL32由 SPL 加载到安全内存中。uboot.img由SPL从存储介质eMMC、SD卡等加载到DDR并跳转执行。uboot运⾏在ddr中,通过CONFIG_BOOTCOMMAND 定义的启动命令引导kernel在执行CONFIG_BOOTCMD之前还会执行CONFIG_PREBOOT预启动命令通常此命令定义为空。CONFIG_BOOTCOMMAND定义U-boot自动启动时执行的命令序列通常在设备树的chosen节点或配置文件中定义。2.2、工作模式启动加载模式和下载模式启动加载模式是 U-Boot 的正常工作模式嵌入式产品发布时U-Boot 都工作在此模式下主要用于开机时把存储器中的内核加载到内存中启动操作系统。下载模式主要用于将固件下载到存储器2.3、源码目录alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot$lsapi bl31_0xfdcd0000.bin disk fit MAINTAINERS recovery.imgtestu-boot.dtb u-boot.sym arch bl31.elf doc fs Makefile rk356x_spl_loader_v1.13.112.bin tools u-boot-dtb.bin usb_update.txt bl31_0x00040000.bin board Documentation include make.sh scripts tpl uboot.img bl31_0x00068000.bin cmd drivers Kbuild net snapshot.commit u-boot u-boot.lds bl31_0x0006a000.bin common dts Kconfig post spl u-boot.bin u-boot.map bl31_0xfdcc1000.bin config.mkenvlib PREUPLOAD.cfg System.map u-boot.cfg u-boot-nodtb.bin bl31_0xfdcce000.bin configs examples Licenses README tee.bin u-boot.cfg.configs u-boot.srec alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot$三、配置方法3.1、默认配置大部分RK3568开发板使用rk3568_defconfig作为基础配置。编译前把默认配置写入 .config执行:makerk3568_defconfig alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot$makerk3568_defconfig## configuration written to .config#alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot$3.2、配置修改一般来说要适配一块新的板卡在U-boot中主要设计三部分的修改和添加分别是board目录下涉及板卡初始化的部分、 configs目录下对应板卡的配置文件、arch目录下与板级外设相关的文件。Kconfig在U-Boot源码目录下执行 make menuconfig可以进入图形化界面配置U-Boot功能如是否开启网络支持、特定命令等设备树 (Device Tree)硬件接口的定义如引脚、时钟、外设都在设备树文件中。需要在u-boot/arch/arm/dts/目录下找到对应的 rk3568-xxx.dts文件进行修改。U-Boot 中RK3568 的设备树文件是/arch/arm/dts/rk3568-evb.dts该设备树文件包含了 rk3568.dtsi 和 rk3568-u-boot.dtsi。原生的 U-Boot 只支持 U-Boot 自己的 DTBRK 平台在原生 U-Boot 基础上增加了 kernel DTB 机制的支持即 U-Boot 会使用 kernel DTB 去初始化外设。这样设计的目的主要是为了兼容外设板级差异譬如 power、clock、display 等。U-Boot 设备树负责初始化存储、调试串口等基础外设而kernel 设备树初始化存储、调试串口之外的外设譬如 LCD 显示、千兆网等。执行 U-Boot 代码时先用 U-Boot 的设备树完成存储、调试串口的初始化操作然后从存储上加载 kernel 的设备树并转而使用这份设备树继续初始化其余外设。进入配置界面makemenuconfig alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot$makemenuconfig HOSTCC scripts/kconfig/mconf.o HOSTCC scripts/kconfig/lxdialog/checklist.o HOSTCC scripts/kconfig/lxdialog/util.o HOSTCC scripts/kconfig/lxdialog/inputbox.o HOSTCC scripts/kconfig/lxdialog/textbox.o HOSTCC scripts/kconfig/lxdialog/yesno.o HOSTCC scripts/kconfig/lxdialog/menubox.o HOSTLD scripts/kconfig/mconf scripts/kconfig/mconf Kconfig *** End of the configuration. *** Executemaketo start the build or trymake help.alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot$如果执行了修改需要进行保存Save 然后 退出Exit。仅仅这样操作并不会修改 rk3568_defconfig需要进行以下操作makesavedefconfig#把配置信息保存到defconfig文件中cpdefconfig configs/rk3568_defconfig#使用defconfig文件替换rk3568_defconfig3.3、图形化配置界面基本操作指南导航菜单使用 ↑/↓ 方向键 选择菜单项。按 Enter 进入有子菜单的选项标注 — 的项。按 两下 Esc 返回上一级菜单。启用/禁用功能选中某项后按 Y编译进 U-Boot显示 *。按 N不编译显示 [ ]。按 M编译为模块显示 U-Boot 中较少使用。辅助功能按 ? 或 H查看当前选项的帮助信息。按 /打开搜索框输入关键词快速定位配置项如搜索 “DNS”。按 Tab在界面底部按钮间切换Select / Exit / Help / Save / Load。保存与退出修改完成后按 两下 Esc 返回主菜单。若有未保存更改系统会提示是否保存使用 ←/→ 键选择 Yes按 Enter 确认。保存后.config 文件会自动更新包含类似 CONFIG_CMD_DNSy 的配置项。重要注意事项不要使用清理脚本如 ./rx3568.sh 或其他包含 make clean 的编译脚本会删除 .config 文件导致所有图形化配置丢失。配置依赖关系某些选项可能因 depends on 限制而不可见或不可选需先满足其依赖项。配置生效修改后需重新编译 U-Boot 才能生效3.4、uboot设备树修改如果需要修改设备树在 SDK/u-boot/arch/arm/dts/ 目录下找到相应的设备树文件进行修改。3.5、具体功能修改3.5.1、修改启动延时修改配置文件第31行的数据CONFIG_BOOTDELAY 6修改后重新编译并烧录验证3.5.2 修改串口的波特率查看uboot使用哪一个调试串口一般 通过chosen节点或aliases节点来指定这里的uart2就 指明了调试串口是UART2。查看chosen节点alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot/arch/arm/dts$virk3568-u-boot.dtsi查看aliases节点此节点中会给串口分配别名通过uboot日志获取INFO: Preloader serial:2查看开发板波特率并修改DDR初始化阶段Preloader进行修改这是启动的最早期阶段它的波特率由 Rockchip 的闭源 DDR 初始化文件DDR Bin决定查看DDR bin文件alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/rkbin/RKBOOT$vimRK3568MINIALL.ini修改参数文件,修改此部分内容需要重新编译u-bootalexalex-virtual-machine:~/workspace/rk3568/linux_sdk/rkbin/tools$grep-nuartddrbin_param.txt12:uartid13:uartiomux14:uartbaudratealexalex-virtual-machine:~/workspace/rk3568/linux_sdk/rkbin/tools$ alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/rkbin/tools$vimddrbin_param.txt alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/rkbin/tools$grep-nuartddrbin_param.txt12:uartid13:uartiomux14:uartbaudrate115200alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/rkbin/tools$#重新打包 DDR Bin在 rkbin/tools 目录下执行 ddrbin_tool 命令来更新 DDR Bin 文件alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/rkbin/tools$ ./ddrbin_tool ddrbin_param.txt../bin/rk35/rk3568_ddr_1560MHz_v1.13.bin version v1.1020220506version2new bin config: uart baudrate:115200modify end alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/rkbin/tools$#注意bin 文件的名称rk3568_ddr_1560MHz_v1.xx.bin必须和 rkbin/RKBOOT/RK3568MINIALL.ini 文件中定义的一致。uboot阶段进行修改#修改配置文件alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot/configs$grep-rnCONFIG_BAUDRATErk3568_defconfig170:CONFIG_BAUDRATE1500000#修改成921600alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot/configs$grep-rnCONFIG_BAUDRATErk3568_defconfig170:CONFIG_BAUDRATE115200alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot/configs$修改设备树文件alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/u-boot/arch/arm/dts$vimrk3568-u-boot.dtsikernel阶段中进行修改alexalex-virtual-machine:~/workspace/rk3568/linux_sdk/kernel/arch/arm64/boot/dts/rockchip$vimrk3568-linux.dtsi修改后重新编译uboot和内核将新的固件MiniLoaderAll.bin-DDR阶段有内容修改、uboot.img、boot.img)烧录到开发板。开发板将串口波特率修改后可重新打印通过命令行查看#boot命令行模式下bdinfo arch_number0x00000000 boot_params0x00000000 DRAM bank0x00000000 -start0x00200000 -size0x08200000 DRAM bank0x00000001 -start0x09400000 -size0x76C00000 baudrate115200bps TLB addr0x7FFF0000 relocaddr0x7DC19000 reloc off0x7D219000 irq_sp0x7B9F8BB0 sp start0x7B9F8BB0 FB base0x00000000 Early malloc usage:3568/80000fdt_blob0000000008300000