内存配置
内存配置涉及到以下3部分:
- 内存配置参数
- 内存参数校准
- 内存大小自适应
内存配置参数
内存参数的配置在uboot/board/freescale/xxx/imximage.cfg
…
DATA 4 0x020c4068 0xffffffff
DATA 4 0x020c406c 0xffffffff
DATA 4 0x020c4070 0xffffffff
DATA 4 0x020c4074 0xffffffff
DATA 4 0x020c4078 0xffffffff
DATA 4 0x020c407c 0xffffffff
DATA 4 0x020c4080 0xffffffff
DATA 4 0x020E04B4 0x000C0000
DATA 4 0x020E04AC 0x00000000
DATA 4 0x020E027C 0x00000030
DATA 4 0x020E0250 0x00000030
…
下载DDR配置脚本文件(1个excel文件),点击这里下载,也可以进入NXP的官方社区搜索下载
根据实际使用的内存参数(需要查看内存芯片手册)进行配置,详细的说明文档点击这里可以下载
内存参数校准
内存参数校准目的:摘自官网论坛
It performs write leveling, DQS gating, read/write delay calibration on the target board to match the layout of the board and archive the best DDR performance.
说明校准与PCB设计相关
修改基础的配置文件,将Disable WDOG屏蔽,具体修改如下
wait = on
//=============================================================================
// Disable WDOG
//=============================================================================
//setmem /16 0x020bc000 = 0x30 //将一行屏蔽
修改原因(官网论坛有描述)
Q. I see an error message that states “ERROR: DCD addr is out of valid range.”, why is this and how do I resolve?
A. Sometimes, when using the register programming aid, there are registers writes that are not supported in the DCD range. Try looking for the following items and comment them out from the DDR initialization script:
wait = on
setmem /16 0x020bc000 = 0x30 // disable watchdog (note the address for this may be different between i.MX6x devices)
根据实际的硬件校准参数,需要下载校准工具NXP DDR Test Tool,目前最新版本2.7.0,点击这里下载
注意:使用该工具时,需要将设备切换到Serial Download模式
重新加载配置文件,进行压力测试,如果测试成功则可以将配置文件导入到uboot里
导入方法:手工对照一个一个复制,也可以用编辑工具编辑好再复制,总之只能手工
内存大小自适应
前面讲的内存参数配置里包含了大小,但这个大小只涉及内存控制器,相应的参数会填充到内存控制器里。
imx6的默认uboot代码,识别内存大小的方法是直接从控制器里读取配置,如果设备的内存大小是固定的,不同大小的内存对应不同的软件版本,这种方法是可行啊,但是…
我们希望一个软件版本能适应不同内存大小,这要怎么做呢?
首先要确认设备需要使用的最大内存是多少,内存大小参数按照最大的来填写
uboot代码里使用uboot官方的做法,使用get_ram_size去获取内存大小
kernel设备树里的内存配置,使用最大值
原理说明(感兴趣的可以阅读):
写入到内存控制器的参数(片选、bank数、位宽、行列地址等)会控制内存访问时发出正确的读写时序,细节可查看CPU datasheet;
不同容量同类型的DDR,一般只有行地址(Row Address)不同(有兴趣的可以看DDR手册),其他参数是一致的;
CPU访问内存时,imx6有2种地址映射方法(从高地址到低地址):
BANK-ROW-COL(bank interleaving off)
ROW-BANK-COL(bank interleaving on)
详情可查看CPU datasheet
当bank interleaving on里,行地址(ROW)被映射到最高位,访问高地址和低地址对就的时序是一样的
从原理可以看出,内存大小自适应是有前提的:
打开bank interleaving,在MMDC_MDMISC寄存器中(官方默认配置是打开的)
需要使用相同类型的内存:位宽bank数、列地址大小、页大小相同,关键的时序参数也要相同
最后编辑:SteveChen 更新时间:2025-06-21 01:13