文章目录
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.img
和rk356x_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