2. MDP 硬件架构详解
MDP(Mobile Display Processor)是高通 SA8155 平台显示子系统的核心处理单元,负责将 GPU/VPU 渲染的帧数据经过合成、缩放、旋转、色彩处理等流水线操作后,最终输出到物理显示接口(DP、DSI、HDMI)或写入内存(Writeback)。理解 MDP 的内部模块划分、数据流路径以及时钟/复位域,是进行显示通路故障排查的基础。
排查要点: 80% 的显示异常(如花屏、闪屏、无显示)可追溯到 MDP 内部某个模块的时钟未使能、复位未释放或数据流路径上的 DMA 配置错误。本章内容将直接指导你在故障树中定位到具体模块。
2.1 MDP 内部模块划分
SA8155 的 MDP 内部由多个专用硬件模块组成,每个模块承担特定的图像处理任务。主要模块包括:
| 模块名称 | 缩写 | 核心功能 | 故障关联 |
|---|---|---|---|
| Layer Mixer | LM | 将多个输入图层(Layer)按 Z-order 进行 Alpha 混合,生成合成帧 | 图层顺序错乱、透明通道失效、合成花屏 |
| DMA Engine | DMA | 负责从系统内存(DDR)搬运帧数据到 MDP 内部管线,或从 MDP 写回内存 | 数据搬运超时、地址越界、带宽不足导致撕裂 |
| Writeback | WB | 将 MDP 处理完成的帧数据写回系统内存,用于截屏、录像或后处理 | 截屏黑屏、录像卡顿、WB 中断未触发 |
| Color Processing | CPP | 执行色彩空间转换、Gamma 校正、3D LUT、PCC(像素级色彩校正) | 偏色、对比度异常、色彩断层 |
| Scaler | SC | 对输入图层或合成帧进行缩放(Downscale/Upscale),支持多种滤波算法 | 图像模糊、锯齿、缩放比例错误 |
| Rotator | ROT | 支持 0°/90°/180°/270° 硬件旋转,减少 GPU 负载 | 旋转后图像裁切、方向错误 |
| Interface Packs | INTF | 将 MDP 内部像素流打包为物理接口(DP/eDP/DSI/HDMI)所需的时序和协议 | 无显示、信号不稳定、分辨率不匹配 |
关键概念: Layer Mixer 是 MDP 的“心脏”,它决定了最终显示内容的合成结果。在 SA8155 上,MDP 支持最多 8 个硬件图层(Layer)同时输入到 Layer Mixer,每个图层可以独立配置源地址、格式、透明度、裁剪区域和 Z-order。
2.2 数据流路径
MDP 内部的数据流遵循“源 → 处理 → 合成 → 输出”的流水线架构。理解数据流路径有助于在故障排查时快速判断问题发生在哪个阶段。
数据流路径的关键阶段:
- 源端(Source): GPU 或 VPU 将渲染完成的帧数据写入系统内存(DDR)中的特定 Buffer。
- DMA 搬运: DMA Engine 根据配置的源地址、行跨距(Stride)和像素格式,将数据从 DDR 搬运到 MDP 内部 FIFO。
- 预处理: 数据经过 Scaler(缩放)或 Rotator(旋转)进行几何变换。
- 合成: 多个图层的像素流进入 Layer Mixer,按照 Z-order 和 Alpha 值进行混合,生成最终的合成帧。
- 后处理: 合成帧经过 CPP 模块进行色彩校正和 Gamma 调整。
- 输出: 处理完成的像素流被 INTF 模块打包为物理接口时序,或由 Writeback 模块写回 DDR。
常见故障点: 如果 DMA 配置的 Stride 与实际 Buffer 的 Stride 不一致,会导致图像“错位”或“撕裂”。这是排查花屏问题时需要优先检查的参数。
2.3 时钟与复位域
MDP 内部模块分布在不同的时钟域(Clock Domain)和复位域(Reset Domain)中。每个域可以独立控制时钟门控和复位状态,以实现功耗优化和模块级故障隔离。
| 时钟/复位域 | 包含模块 | 时钟源 | 典型频率 | 故障影响 |
|---|---|---|---|---|
| MDP_CORE_CLK | Layer Mixer、CPP、Scaler、Rotator | GCC_MDP_CLK | 400~600 MHz | 合成花屏、色彩异常、缩放失败 |
| MDP_DMA_CLK | DMA Engine、Writeback | GCC_MDP_DMA_CLK | 200~400 MHz | 数据搬运超时、截屏黑屏、DMA 错误中断 |
| MDP_INTF_CLK | INTF Pack(DP/DSI/HDMI) | GCC_MDP_INTF_CLK | 根据分辨率动态调整 | 无显示、信号不稳定、链路训练失败 |
| MDP_AHB_CLK | 配置寄存器总线接口(AHB Slave) | GCC_MDP_AHB_CLK | 100~200 MHz | 寄存器读写超时、模块配置无效 |
排查技巧: 在 SA8155 平台上,MDP 的时钟使能由
mdss_mdp_clk_enable() 函数控制。如果某个模块功能异常,首先通过 clk_summary 或寄存器读取确认对应时钟域是否已使能且频率正确。复位域则通过 mdss_mdp_reset() 控制,复位释放顺序必须遵循硬件手册,否则可能导致模块死锁。
2.4 模块间交互与同步机制
MDP 内部模块之间通过以下机制实现数据同步和流控:
- FIFO 缓冲: 每个模块的输入/输出端口都带有深度可配置的 FIFO,用于吸收跨时钟域的数据速率差异。
- Start-of-Frame (SOF) 同步: Layer Mixer 以垂直消隐期(VBlank)为同步基准,所有图层必须在 SOF 之前完成配置更新,否则会出现“撕裂”。
- DMA 完成中断: DMA Engine 在完成一帧数据搬运后触发中断,通知软件更新下一帧的 Buffer 地址。
- Writeback 完成中断: Writeback 模块在将一帧数据完全写回 DDR 后触发中断,用于截屏或录像的帧同步。
调试建议: 在排查显示异常时,可以通过读取 MDP 内部的状态寄存器(如
MDP_INTF_STATUS、MDP_DMA_STATUS)来确认模块是否处于预期状态。例如,MDP_DMA_STATUS.BUSY 位如果长时间为 1,说明 DMA 搬运未完成,可能原因是时钟不足或地址配置错误。
2.5 故障排查要点总结
| 故障现象 | 可能涉及的模块 | 优先检查项 |
|---|---|---|
| 无显示(黑屏) | INTF、Layer Mixer、时钟域 | INTF 时钟是否使能、复位是否释放、DP 链路训练状态 |
| 花屏/错位 | DMA、Scaler、Layer Mixer | DMA Stride 配置、Buffer 地址对齐、Scaler 输入输出尺寸 |
| 图像撕裂 | DMA、Layer Mixer | VBlank 同步配置、DMA 完成中断是否及时更新 Buffer |
| 偏色/色彩异常 | CPP、Layer Mixer | CPP 色彩矩阵配置、Gamma LUT 是否加载、图层 Alpha 值 |
| 截屏黑屏/录像卡顿 | Writeback、DMA | Writeback 时钟使能、WB 输出 Buffer 地址、WB 完成中断 |