我使用的 uboot 主分支, commit: 8c98b57d72d5e5b94ed064fe1041e51216165334 , 由于我手上的板子是 brainypi , 基于 evb 配置, 我做了如下的修改, 主要是修改 DDR 类型为 LDDR4

diff --git a/arch/arm/dts/rk3399-evb-u-boot.dtsi b/arch/arm/dts/rk3399-evb-u-boot.dtsi
index 3fa5fc0c..b65dd5af 100644
--- a/arch/arm/dts/rk3399-evb-u-boot.dtsi
+++ b/arch/arm/dts/rk3399-evb-u-boot.dtsi
@@ -4,7 +4,7 @@
  */
 
 #include "rk3399-u-boot.dtsi"
-#include "rk3399-sdram-lpddr3-4GB-1600.dtsi"
+#inclide "rk3399-sdram-lpddr4-100.dtsi"
 
 / {
 	chosen {
diff --git a/configs/evb-rk3399_defconfig b/configs/evb-rk3399_defconfig
index 9481dfae..8ab3ad4a 100644
--- a/configs/evb-rk3399_defconfig
+++ b/configs/evb-rk3399_defconfig
@@ -71,3 +71,7 @@ CONFIG_VIDEO_ROCKCHIP=y
 CONFIG_VIDEO_ROCKCHIP_MAX_YRES=1200
 CONFIG_DISPLAY_ROCKCHIP_MIPI=y
 CONFIG_ERRNO_STR=y
+
+# As driver/ram/rockchip/Kconfig
+CONFIG_RAM_ROCKCHIP=y
+CONFIG_RAM_ROCKCHIP_LPDDR4=y

对应的 tpl 文件夹下有一个 u-boot-spl.lds , 可以知道入口是 arch/arm/cpu/armv8/start.otext 优先, 最后校验复制 spl 固件的大小是否符合要求,这里需要复制的段为 text rodatadata 是最基本的数据段。

__u_boot_list 查阅 https://docs.u-boot.org/en/latest/api/linker_lists.html

OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
ENTRY(_start)
SECTIONS
{
 . = 0x00000000;
 __image_copy_start = ADDR(.text);
 .text : {
  . = ALIGN(8);
  arch/arm/cpu/armv8/start.o (.text*)
  *(.text*)
 }
 .rodata : {
  . = ALIGN(8);
  *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
 }
 .data : {
  . = ALIGN(8);
  *(.data*)
 }
 __u_boot_list : {
  . = ALIGN(8);
  KEEP(*(SORT(__u_boot_list*)));
 }
 . = ALIGN(8);
 __image_copy_end = .;
 _end = .;
 _image_binary_end = .;
 .bss ALIGN(8) : {
  __bss_start = .;
  *(.bss*)
  . = ALIGN(8);
  __bss_end = .;
 }
 /DISCARD/ : { *(.dynsym) }
 /DISCARD/ : { *(.dynstr*) }
 /DISCARD/ : { *(.dynamic*) }
 /DISCARD/ : { *(.plt*) }
 /DISCARD/ : { *(.interp*) }
 /DISCARD/ : { *(.gnu*) }
}
ASSERT(__image_copy_end - __image_copy_start < (0x2e000), "TPL image too big");

启动流程

tpl 阶段, 初始化串口和ddr控制器, 将spl拷贝至ram, 跳转至spl阶段。

image.png

image.png

spl 阶段, tpl阶段的plus版本, 相比之下, 具有跟多的外设初始化, 主要是 mmc net 控制器, 用于读取文件系统。如果具有 video 那么您将拥有开机画面。最重要的是 mmc 驱动, 在 spl 启动之前具有一个 early_spl_init 阶段。

image.png

image.png

ddr 初始化