要利用 DDR 参数文件生成 Linux 映像,需通过以下步骤将 DDR 配置集成到 U-Boot(或类似 Bootloader)中,最终形成完整的启动映像。此过程主要依赖 U-Boot 构建系统,以下是详细流程:
获取 DDR 参数文件
厂商(如 Rockchip、NXP)通常提供配置文件(如 lpddr4_timing.c、.bin 二进制或 .cfg 文本),或由 DDR 初始化工具生成。
将参数文件放入 U-Boot 源码
board/vendor/board_name/ddr_param.bin # 二进制格式
arch/arm/mach-soc/ddr_init.c # C 源码格式dram_init_banksize() 和 dram_init() 函数)。修改 U-Boot 的 Makefile/Kconfig
Makefile 中添加编译依赖:obj-$(CONFIG_TARGET_BOARD_NAME) += ddr_param.o配置 U-Boot 编译选项
在板级头文件(如 include/configs/board_name.h)中启用 DDR 初始化:
#define CONFIG_SPL_BOARD_INIT // 启用板级初始化(含 DDR)
#define CONFIG_CUSTOM_DDR_PARAM // 启用自定义参数编译 U-Boot
make _defconfig # 应用板级配置
make CROSS_COMPILE=aarch64-linux-gnu- # 编译生成包含 DDR 参数的映像 u-boot-spl.bin:含 DDR 参数的 Bootloader 第一阶段u-boot.itb:完整 U-Boot 映像(用于启动 Linux)生成最终 Linux 启动映像
组合 U-Boot、Linux 内核与设备树:
cat u-boot-spl.bin u-boot.itb > boot.img # 简单拼接
# 或使用厂商工具(如 Rockchip 的 rkdeveloptool)
tools/mkimage -f fit-image.its linux.img # 生成 FIT 映像rk3399_ddr_800MHz_v1.24.bin(Rockchip 提供)board/rockchip/evb_rk3399/ddr_param.binboard/rockchip/evb_rk3399/Makefile:obj-y += ddr_param.ovoid sdram_init() {
const struct dram_params *dram = rk3399_get_ddr_param();
rk3399_ddr_init(dram); // 调用 DDR 初始化函数
}make evb_rk3399_defconfig
make CROSS_COMPILE=aarch64-linux-gnu- -j4
cp spl/u-boot-spl.bin /output/| SoC 厂商 | DDR 参数格式 | 集成方式 |
|---|---|---|
| Rockchip | .bin 二进制文件 | 通过链接脚本嵌入到 U-Boot SPL |
| NXP i.MX | ddrphy_fw.bin | 作为单独固件加载(需 DCD 初始化脚本) |
| TI K3 | .cfg 配置脚本 | 被 SPL 源码包含(自动生成寄存器配置) |
| Allwinner | dram_para.h 头文件 | 通过宏定义初始化寄存器 |
J-Link/OpenOCD 调试 DDR 初始化流程。md(内存查看)验证 DDR 读写。通过以上步骤,DDR 参数将被编译进 Bootloader 映像,在 Linux 启动前初始化内存控制器,确保系统正常运行。
举报
更多回帖