RK3568 DDR

1、环境介绍

硬件:飞凌ok3568-c开发板

软件:原厂rk356x sdk(Linux)

2、前言

本文将记录如何修改ddr bin从而实现对片外DDR的适配。

3、ddr概念理清

DDR = Double Data Rate,意思是在时钟的上升沿和下降沿都传输一次数据。ddr涉及的单位有:频率,速率,位宽,带宽。

频率:指 DRAM 内部时钟的工作频率,单位 MHz。

速率:指每秒传输多少百万次数据(Mega Transfers per Second),单位 MT/s。等于 频率 × 2。

位宽:指总线位宽,例如16bit、32bit、64bit。

带宽:等于 速率 * 总线位宽 / 8。

举例,比如一个DDR4-3200:

  • 时钟频率(Fclk) = 1600 MHz
  • 速率(Data rate) = 3200 MT/s
  • 总线位宽 = 64bit
  • 带宽 = 3200 * 64 / 8 = 25600 = 25.6 GB/s

4、系统启动流程

我们从RK的启动流程来引入对ddr bin的了解。

# 启动流程
BOOTROM => TPL(ddr bin) => SPL(miniloader) => TRUST => U-BOOT => KERNEL
  • BOOTROM:一段固化程序。负责片内SRAM、部分时钟等基础配置的初始化。加载TPL/SPL;
  • TPL:运⾏在 sram 中,负责完成 ddr 初始化;
  • SPL:运⾏在 ddr 中,负责完成系统的 lowlevel 初始化、后级固件加载(trust.img和uboot.img);
  • U-Boot proper:运⾏在ddr中,即我们通常所说的"U-Boot",它负责引导kernel;

可见TPL(ddr bin)主要功能就是初始化ddr。

5、ddr bin文件介绍

DDR bin文件,用于开机时,初始化DDR。通过RK提供的工具,可以修改DDR bin文件,达到修改DDR初始化参数、DDR频率、关闭串口、串口波特率等功能。

ddr bin文件以xxx.bin的形式存在如下路径:

<sdk>/rkbin/bin/rkxx/xxx.bin

6、MINIALL.ini文件介绍

ddr bin文件会被xxxMINIALL.ini文件引用,如rk3568默认使用的是RK3568MINIALL.ini

<sdk>/rkbin/RKBOOT/xxxMINIALL.ini

也可以在板级方案配置文件中指定:

RK3568MINIALL.ini文件内容如下,主要用来描述芯片类型、ddr bin文件、SPL、Loader组合方式:

[CHIP_NAME]
NAME=RK3568
[VERSION]
MAJOR=1
MINOR=1
[CODE471_OPTION]
NUM=1
Path1=bin/rk35/rk3568_ddr_1560MHz_v1.19.bin
Sleep=1
[CODE472_OPTION]
NUM=1
Path1=bin/rk35/rk356x_usbplug_v1.17.bin
[LOADER_OPTION]
NUM=2
LOADER1=FlashData
LOADER2=FlashBoot
FlashData=bin/rk35/rk3568_ddr_1560MHz_v1.19.bin
FlashBoot=bin/rk35/rk356x_spl_v1.13.bin
[OUTPUT]
PATH=rk356x_spl_loader_v1.19.113.bin
[SYSTEM]
NEWIDB=true
[FLAG]
471_RC4_OFF=true
RC4_OFF=true

届时编译uboot,会同步生成uboot.imgrk356x_spl_loader_v1.19.113.bin。其中rk356x_spl_loader_v1.19.113.bin就包括了TPL(ddr bin)和SPL,可用于单独更新。

7、生成ddr bin文件

这里使用rk提供的windows下的ddr bin工具,位于:

<sdk>/tools/windows/rk_ddrbin_tool_V1.01.7z

解压后打开软件rk_ddrbin_tool.exe。需要根据实际使用的ddr去修改频率,这里只是罗列了使用步骤:

将生成的ddr bin文件放到<sdk>/rkbin/bin/rk35/目录下,同时修改RK356MINIALL.ini,重新编译uboot即可。

将镜像烧录到板卡后,板卡上电,会打印ddr初始化信息:

8、ddr测试

8.1、带宽测试

# 安装工具
sudo apt-get install mbw -y

# 测试内存带宽 (256MB块大小,10次迭代)
mbw -n 10 256

# 测试结果关注"AVG"行,特别是:
# MEMCPY - 内存复制带宽
# DUMB - 简单赋值操作带宽
# MCBLOCK - 块复制带宽

8.2、压力测试

# 如果是ubuntu系统
git clone https://github.com/stressapptest/stressapptest.git
cd stressapptest
./configure
make
sudo make install

# 如果是buildroot系统,看menuconfig是否有该工具可以勾选。
# 如果没有,就在编译机交叉编译
git clone https://github.com/stressapptest/stressapptest.git
cd stressapptest
./configure --host=arm-linux-gnueabihf
make
sudo make install
# 可执行文件在 src/stressapptest

# 查看cpu核心数
nproc
# 查看当前剩余内存
free -m | awk '/Mem:/ {print $7}'

# stressapptest压力测试12小时
# stressapptest -s <测试时间,单位秒> -i <cpu核心数> -C <cpu核心数> -W --stop_on_errors -M <剩余内存*0.8> >> ddr.log &
stressapptest -s 43200 -i 4 -C 4 -W --stop_on_errors -M 2984 >> ddr.log &

9、ddr定频

root@rk3568:/sys/class/devfreq/dmc# cat available_frequencies
324000000 528000000 780000000 1560000000
root@rk3568:/sys/class/devfreq/dmc# cat cur_freq
324000000
root@rk3568:/sys/class/devfreq/dmc# echo userspace > governor
root@rk3568:/sys/class/devfreq/dmc# echo 1560000000 > userspace/set_freq
root@rk3568:/sys/class/devfreq/dmc# cat cur_freq
1560000000

10、总结

参考文章:

《Rockchip_Developer_Guide_DDR_CN.pdf》

RK3588开发笔记-DDR4降频实战与系统稳定性优化_3588 ddr 降频-CSDN博客

嵌入式Linux学习交流群:424571391

在配置 RK3568 开发板的 DDR 内存时,需要考虑硬件支持、初始化代码的编写、内存时钟频率设置以及后续的性能优化。以下是一些关键步骤和方法: ### DDR 初始化配置 在 RK3568 平台上,DDR 内存的初始化通常通过预编译的二进制文件完成。例如,在 SPL(Secondary Program Loader)阶段,可以使用 `rk3568_ddr_1560MHz_v1.08.bin` 这个固件文件来初始化 DDR 内存。具体操作是将该文件复制到 TPL(Tertiary Program Loader)镜像中: ```bash copy rk3568_ddr_1560MHz_v1.08.bin tpl.bin ``` 此步骤确保在进入 U-Boot 或操作系统之前,DDR 已经被正确配置并可用[^2]。 ### 内存频率与时序调整 RK3568 支持多种 DDR 频率配置,如 1560MHz 等。可以通过修改 DDR 初始化固件来调整频率和时序参数,以匹配具体的硬件设计和 PCB 布线特性。这通常需要参考 Rockchip 提供的 DDR 配置工具和文档,进行参数的调优。 ### 内存校验与稳定性测试 配置完成后,应进行内存稳定性测试。可以使用 U-Boot 中的 `memtester` 工具对 DDR 进行压力测试,确保内存访问的稳定性和可靠性。测试内容包括地址线、数据线的完整性,以及内存块的读写能力。 ### 性能优化与调试 在系统运行过程中,可以使用 Linux 内核提供的工具(如 `perf`、`vmstat`)来监控内存使用情况和性能瓶颈。此外,通过调整内核的内存管理参数(如页面分配策略、交换分区设置等),可以进一步提升系统性能。 ### 内存泄漏检测 如果在应用程序中动态分配内存(使用 `malloc`、`new` 等),需要特别注意内存泄漏问题。可以使用 `valgrind` 工具对应用程序进行内存泄漏检测,确保所有分配的内存都能被正确释放[^3]。 ### 相关问题 1. 如何在 RK3568 上使用 DDR 内存进行裸机开发? 2. RK3568DDR 初始化文件如何生成和修改? 3. 如何测试 RK3568 开发板上的 DDR 内存性能? 4. 如何在 Linux 内核中优化 RK3568 的内存管理? 5. 使用 DDR 内存时,如何避免内存泄漏问题?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值