ddr专题分析

1,ddr访问异常,怎么确认是ddr的问题还是cpu的问题场景如下:简单一点的例如系统起不来,报错ddr init failed,复杂一点的系统可以正常起来,但是交叉cpu和flash测试发现,定位发现过ddr的数据写进去的数据和写出来的数据不一致。

2,国产ddr厂家了解,以及ddr速率,ddr4,ddr5以及LPDDR的使用。

3,ddr异常的常见定位思路

DDR 初始化失败通常发生在开机启动阶段(Bootloader 或 Linux 内核初始化早期)。利用你提供的五个手段(关闭 AVS、调整调频、关闭 Cache 等),我们可以采用控制变量法,逐一隔离软硬件层面的故障原因。

以下是详细的定位分析过程:

第一阶段:电源与电压稳定性排查(AVS 相关)

DDR 对电源电压极其敏感。电压过高会烧毁芯片,电压过低会导致信号时序违例,初始化无法完成。

步骤 1:关闭 DDR PRI AVS (Primary AVS)
  • 分析逻辑: PRI AVS 试图根据芯片体质动态调整 DDR 控制器的电压。如果该批次芯片体质较差(SSD - Slow Silicon Die),AVS 算法可能给出了一个过低的电压值,导致 DDR 在初始化训练阶段无法通过物理层(PHY)的校验。
  • 操作: 在 Device Tree (DTS) 或 Bootloader 配置中,将 DDR AVS 功能关闭,强制将 DDR 电压锁定在标称值或略高于标称值。
  • 结果判定:
    • 若关闭后初始化成功: 说明问题在于 AVS 校准参数不准电压裕量不足。需要修复 AVS 的 Look-Up Table (LUT) 或在 AVS 基础上增加正向电压 Offset。
    • 若依然失败: 说明电压过低不是主因,或者电压高得离谱导致其他保护机制触发,转至下一步。
步骤 2:关闭 MDM AVS (Modem AVS)
  • 分析逻辑: Modem 和 DDR 通常共享大功率 PMIC 的电源轨。如果 Modem AVS 在 DDR 初始化的同时进行大幅电压调整,可能会造成电源轨上的电压跌落噪声/纹波增大,干扰 DDR 的初始化握手信号。
  • 操作: 关闭 Modem 的 AVS,或者通过代码逻辑让 Modem 初始化延后于 DDR 初始化。
  • 结果判定:
    • 若关闭后成功: 说明问题在于 电源耦合干扰。Modem 的动态调节拉跨了 DDR 的电源。
    • 若依然失败: 排除 Modem 电源干扰,转至下一步。

第二阶段:时钟与信号完整性排查(调频与 DVFS 相关)

频率越高,信号抖动和时序要求越严苛。初始化失败往往是 PLL 锁不住或 PHY 训练不过。

步骤 3:修改 DDR 调频控制 (频率锁定)
  • 分析逻辑: 初始化时,Bootloader 可能会尝试直接将 DDR 跳到高频,或者内核启动时会立即进行频率切换。如果高频下的 PCB 走线阻抗不匹配,或 PHY 的读写 leveling 参数在高压高频下失效,就会导致挂死。
  • 操作:
    1. 修改 Bootloader 或 Kernel 配置,将 DDR 初始频率锁定在一个安全低频(如 400MHz 或 533MHz)。
    2. 禁止启动过程中的自动调频(DFS)。
  • 结果判定:
    • 若低频锁定后成功: 说明问题在于 高频信号完整性PHY 训练参数在高频下失效。需要重新进行 DDR PHY Training,或调整高频下的时序参数。
    • 若低频依然失败: 说明连基础的低频都无法工作,问题可能出在硬件连接或基础电压上。
步骤 4:AVS 和 DVFS 细微调整
  • 分析逻辑: 这是步骤 1 和 3 的精细化。如果完全关闭 AVS 导致发热过大无法运行,或者频率调整过于粗暴,我们需要微调策略。
  • 操作:
    • AVS 调整: 不完全关闭,而是给 AVS 的基准值增加一个正的 Voltage Offset(例如 +50mV),人为增加电压裕量。
    • DVFS 调整: 修改 OPP 表。检查当前频率档位对应的电压是否足够。例如,将 1866MHz 档位的电压从 1.1V 强制提升到 1.15V。
  • 结果判定:
    • 若增加电压后成功: 确认是 电压不足 导致的时序违例。
    • 若调整时序后成功: 确认是 DVFS 策略过于激进,切换速度太快或电压爬升时间不足。

第三阶段:总线与架构一致性排查(System Cache 相关)

System Cache (L3 Cache) 是挂在 DDR 总线上的最大"客户"。

步骤 5:关闭 System Cache
  • 分析逻辑: 在某些 SoC 架构中,System Cache 的初始化可能先于 DDR 控制器的完全就绪,或者 System Cache 的控制器逻辑有 Bug,在访问 DDR 时发出了错误的协议信号,导致总线死锁。
    • *场景举例:* CPU 启动并尝试从 Cache 预取指令,但 DDR 还没准备好,导致 Bus Error 或 Hang。
  • 操作: 在 Kernel Bootargs 或 Defconfig 中关闭 L3 Cache/LLC(例如 l3cache=off 或修改 Device Tree 中 cache 节点的 status)。
  • 结果判定:
    • 若关闭后成功: 说明问题在于 Cache 一致性协议总线初始化顺序。CPU 或其它 Master 在 DDR Ready 之前就发起了访问。需要调整启动脚本中的初始化顺序,或修补 Cache 控制器驱动。
    • 若依然失败: 故障点确实在 DDR 控制器或 PHY 本身,与上层架构无关。

总结定位流程表

调试操作 预期现象 (若成功) 故障定位结论
关闭 PRI AVS 锁定电压后可启动 PRI AVS 电压设置过低,或芯片体质较差,需调整电压 Offset。
关闭 MDM AVS Modem 不干扰后可启动 电源轨纹波/跌落,Modem 动态调节拉跨了 DDR 供电。
锁定低频 400MHz 能启动,高频不行 高频信号完整性差,需重新做 DDR PHY Training 或检查 PCB。
AVS/DVFS 微调 加电压 Offset 后稳定 电压裕量不足,但硬件无硬伤,需微调软件参数。
关闭 System Cache 关闭 Cache 后可启动 总线/Cache 协议死锁,上层设备在 DDR 未就绪时非法访问。

建议的排查顺序

  1. 先软件后硬件: 先尝试关闭 System Cache(最容易被忽略,且不涉及物理层),看是否是上层逻辑死锁。
  2. 再电源: 关闭 PRI AVSMDM AVS,排除供电不足或干扰。
  3. 最后时序: 锁定 低频,排除高频信号问题。
  4. 最终微调: 结合上述结果,通过 AVS/DVFS 调整 找到平衡点。

1,ddr问题分析

(1)ddr初始化报错

2.123456\] ddr phy driver: DDR phy init start \[ 2.234567\] ddr controller: Starting DDR initialization sequence \[ 2.345678\] ddr_reg: Failed to write initial configuration to register 0x12345678 \[ 2.345680\] ddr controller: DDR init failed: Configuration write error

首先检查硬件连接,确保DDR芯片与主板之间的线路连接正常;其次,检查寄存器的权限设置,保证系统有足够的权限对该寄存器进行操作;最后,仔细核对初始化序列的配置参数,看是否存在参数设置错误。

(2)ddr老化测试

0.000000\] Booting Linux on physical CPU 0x0 \[1.234567\] DDR: Starting aging test \[2.345678\] DDR: Read error at address 0x12345678 \[2.345680\] DDR: Aging test failed: Read error detected

ddr频率查看,先查看是变频还是固定频率,可以先降频固定试试

cat /sys/kernel/debug/clk/bimc_clk/measure

cat /sys/class/aml_ddr/freq

若使用 cat /sys/class/aml_ddr/freq 命令后打印结果为 600 (单位通常为MHz),那么实际DDR频率在bootloader log中所显示的应为 1200MHz

获取的数值是bootloader log显示的一半(DDR的特性:双边沿传输)

设置频率,将频率固定为 800MHz,则需要设置为400

echo 400 > /sys/class/aml_ddr/set_freq

特殊类型举例,系统可以正常系统,但是有一台机器每次启动后都出现panic,分析后发现每次踩内存的地址不一致,此时可以怀疑是ddr的问题,也有可能是电源的问题,需要量一下电压是否稳定。

此外,检查一下ddr时钟设置,pll是否正常锁定,低温和高温ddr相关测试等等。

相关推荐
陌上花开缓缓归以10 小时前
W25N01KVZEIR flash烧写
arm开发
济6172 天前
ARM Linux 驱动开发篇----字符设备驱动开发(4)--- 编写chrdevbase 字符设备驱动开发实验--- Ubuntu20.04
linux·arm开发·驱动开发
代码游侠2 天前
学习笔记——I2C子系统
linux·arm开发·驱动开发·单片机·嵌入式硬件
陌上花开缓缓归以3 天前
mips架构uboot 启动流程分析
arm开发·架构
电脑小白技术3 天前
arm架构能装windows吗?arm架构安装Windows两种方法
arm开发·windows·架构·arm架构能装windows吗
ONLYOFFICE3 天前
如何在 openSUSE 16 ARM 上安装 ONLYOFFICE 桌面编辑器
arm开发·编辑器
梁洪飞3 天前
uboot spl学习
linux·arm开发·嵌入式硬件·arm
戏舟的嵌入式开源笔记3 天前
Arm2D使用教程(四):借助片外Flash放置图片资源
arm开发·stm32·arm2d
CQ_YM3 天前
ARM之多点触控与SPI
c语言·arm开发·单片机·嵌入式硬件·arm