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相关测试等等。

相关推荐
代码游侠8 天前
STM32开发——基础外设
linux·运维·arm开发·stm32·单片机·嵌入式硬件·学习
代码游侠9 天前
Linux驱动复习——驱动
linux·运维·arm开发·笔记·学习
古译汉书9 天前
【IoT死磕系列】Day 6:工业控制底层大动脉—CAN总线
linux·网络·arm开发·单片机·物联网·tcp/ip
姜太公钓鲸2339 天前
STM32是ST公司基于ARM Cortex-M内核开发的32位微控制器。上述文字中的内核是什么意思?作用是什么?
arm开发·stm32·嵌入式硬件
日更嵌入式的打工仔9 天前
FIQ 与 IRQ
arm开发·笔记
The️10 天前
STM32-FreeRTOS操作系统-软件定时器
arm开发·stm32·单片机·嵌入式硬件·mcu·c#
szxinmai主板定制专家10 天前
RK3588 8个USB工控解决方案,适用于机器视觉,工业互联等
arm开发·人工智能·fpga开发
我在人间贩卖青春10 天前
ARM编程模型
arm开发·arm工作模式
安全二次方security²10 天前
【CVE-2025-0647】ARM CPU漏洞安全通告
arm开发·安全·cve-2025-0647·tlbi·cpp rctx 指令·c1-ultra·虚拟化漏洞
道亦无名11 天前
armBitRevIndexTable1024
arm开发