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

相关推荐
IAR Systems10 小时前
使用IAR Arm工具链开发和调试Zephyr RTOS
arm开发·嵌入式·iar·zephyr
l'm coming1 天前
[linux]内核启动加载驱动文件的流程
linux·arm开发·驱动开发·嵌入式
Code-keys1 天前
ARM NEON SIMD 编程实战:从音频信号处理到AI算子研发实战
arm开发·音视频·信号处理
有什么事1 天前
云手机多开哪个强?ARM架构:云手机多开的信任基石与性能核心
arm开发·智能手机·架构
头枝1 天前
ARM Cortex-M DWT CYCCNT 必须显式初始化,jlink调试时正常,使用时异常的问题
arm开发·stm32·单片机·问题·cyccnt
咖喱年糕1 天前
KEIL5 编译错误解决:MDK 5.37 及以上版本添加 AC5(ARM Compiler 5)编译器
arm开发·单片机·keil·嵌入式软件·ac5
振南的单片机世界1 天前
中央对齐PWM:边沿对齐EMI大,中央对齐更安静
arm开发·stm32·单片机·嵌入式硬件
三佛科技-187366133971 天前
GD32F103VDT6是什么芯片?GD32 ARM Cortex-M3微控制器MCU解析
arm开发·单片机·嵌入式硬件
都在酒里1 天前
【极致低延时】香橙派部署 MediaMTX 实现 WebRTC 推流,延时仅 500-800ms,比局域网 ffmpeg 拉流快近 10 倍!(附踩坑全记录)
linux·arm开发·ffmpeg·webrtc·orangepi·嵌入式软件
XINVRY-FPGA1 天前
XC7A100T-2CSG324I AMD Xilinx Artix-7 FPGA
arm开发·人工智能·嵌入式硬件·神经网络·fpga开发·硬件工程·fpga