我使用的 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.o
的 text
优先, 最后校验复制 spl
固件的大小是否符合要求,这里需要复制的段为 text
rodata
和 data
是最基本的数据段。
__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阶段。
spl 阶段, tpl阶段的plus版本, 相比之下, 具有跟多的外设初始化, 主要是 mmc
net
控制器, 用于读取文件系统。如果具有 video
那么您将拥有开机画面。最重要的是 mmc
驱动, 在 spl 启动之前具有一个 early_spl_init
阶段。