IMX6ULL开发板DDR初始化参数修改实战:从官方EVK到自定义板卡的uboot移植
IMX6ULL开发板DDR初始化参数修改实战:从官方EVK到自定义板卡的uboot移植
在嵌入式系统开发中,DDR内存的正确初始化是系统稳定运行的基础。当我们将uboot从NXP官方EVK开发板移植到自定义硬件平台时,DDR参数的适配往往成为第一个需要攻克的难题。本文将带你深入理解DDR初始化机制,并手把手教你完成从参数生成到验证的全流程。
1. 理解IMX6ULL的DDR初始化机制
IMX6ULL处理器上电后,ROM代码会首先执行,然后加载并运行uboot。但在这之前,必须确保DDR控制器和内存芯片被正确初始化。这个初始化过程由DCD(Device Configuration Data)数据完成,它包含在uboot镜像的头部信息中。
DCD数据本质上是一系列寄存器配置命令,主要包含以下关键部分:
- DDR控制器配置:设置DDRC(DDR Controller)的工作模式、时序参数等
- PHY配置:调整DDR物理层接口的阻抗匹配、驱动强度等
- 内存芯片参数:包括容量、bank数量、行列地址宽度等
在官方EVK开发板上,这些参数已经针对板载DDR芯片优化好了。但当使用不同型号或容量的DDR芯片时,这些预设参数很可能不再适用。
2. 获取自定义板卡的DDR参数
要为自定义板卡生成正确的DDR参数,我们需要使用NXP提供的ddr_stress_tester工具。这个工具通过自动测试和校准,可以生成最优的DDR配置。
2.1 准备工作
首先确保你已准备好以下环境:
- 安装了
ddr_stress_tester工具的Linux主机 - 可通过USB OTG连接的IMX6ULL开发板
- 串口调试终端
2.2 生成DDR配置
运行ddr_stress_tester工具的基本流程如下:
./ddr_stress_tester \ -b imx6ull \ -m 256 \ # DDR容量,单位MB -f DDR3 \ # DDR类型 -t 16bit \ # 数据总线宽度 -o ddr_config.inc # 输出文件名工具会通过以下步骤生成配置:
- 基础参数设置:根据输入的DDR类型、容量等生成基础配置
- 时序校准:自动测试并优化tRFC、tWR等关键时序参数
- 阻抗校准:调整DDR PHY的驱动强度和ODT设置
- 验证测试:运行内存测试确保配置可靠
注意:这个过程可能需要多次重启开发板,请确保串口终端保持连接以观察调试信息。
3. 修改uboot中的DDR配置
生成的ddr_config.inc文件包含了所有必要的寄存器配置。接下来需要将这些配置移植到uboot的imximage.cfg文件中。
3.1 理解配置文件结构
imximage.cfg文件位于uboot源码的板级目录中,例如:
board/freescale/mx6ull_custom_board/imximage.cfg文件主要包含以下几个部分:
DATA 4 0x020C4068 0xFFFFFFFF # DDR控制器配置开始 DATA 4 0x020C406C 0x00000000 ... DATA 4 0x021B001C 0x00008000 # PHY配置开始 ...3.2 关键参数对照表
下表列出了DDR配置中最关键的寄存器及其作用:
| 寄存器地址 | 功能描述 | 典型值范围 |
|---|---|---|
| 0x021B0000 | DDR控制器版本 | 只读 |
| 0x021B000C | DDR类型配置 | 0xC3190000(DDR3) |
| 0x021B0010 | DDR时序控制1 | 取决于频率 |
| 0x021B001C | PHY控制0 | 0x00008000 |
| 0x021B002C | PHY阻抗控制 | 0x00400040 |
3.3 移植步骤
- 打开生成的
ddr_config.inc文件,复制所有DATA 4开头的行 - 替换
imximage.cfg文件中对应的DDR配置部分 - 特别注意修改以下关键参数:
- 内存大小相关寄存器(如
0x021B0004) - 时序参数(如
tRFC、tWR) - PHY阻抗设置
- 内存大小相关寄存器(如
4. 验证与调试
修改完成后,重新编译uboot并烧写到开发板:
make clean make mx6ull_custom_board_defconfig make -j4烧录后,通过uboot命令行验证DDR配置:
=> bdinfo arch_number = 0x00000000 boot_params = 0x80000100 DRAM bank = 0x00000000 -> start = 0x80000000 -> size = 0x10000000 # 应显示正确的DDR容量如果遇到问题,可以通过以下方法调试:
- 降低DDR频率:在
imximage.cfg中减小时钟相关参数 - 放宽时序:增加tRFC、tWR等时序参数的值
- 检查电源:确保DDR供电电压稳定且符合规格
5. 实战案例:256MB DDR3L移植
最近在一个客户项目中,我们需要将uboot从512MB DDR3配置改为256MB DDR3L。以下是关键修改点:
- 在
ddr_stress_tester中指定-m 256和-f DDR3L - 修改
imximage.cfg中的内存大小相关寄存器:DATA 4 0x021B0004 0x00010000 # 修改为256MB配置 - 调整PHY驱动强度以适应DDR3L的低电压特性:
DATA 4 0x021B002C 0x00300030 # 降低驱动电流
经过3次参数调整后,系统稳定运行,内存测试通过率100%。这个案例表明,即使是相同类型的DDR芯片,容量变化也需要仔细调整相关参数。
