3. 显示硬件基础

在 Linux 图形栈故障诊断中,绝大多数“黑屏、花屏、分辨率不对、刷新率上不去、外接屏不亮”的问题,最终都会落到显示硬件链路的某一环。理解从 GPU 到面板的完整通路,是定位问题的第一步。本节把这条链路拆成可观测、可验证的若干环节,并给出显示时序的基础概念。

一、显示通路的整体结构

一次完整的显示输出,数据从 GPU 内部的渲染管线产生,经过显示控制器(Display Controller)扫描输出,再由 CRTC 生成时序,交给编码器(Encoder)转换为目标协议信号,通过连接器(Connector)与线缆到达显示器或面板。软件侧则由 DRM/KMS 框架用对象模型描述这条链路。

GPU → 显示控制器 → CRTC → 编码器 → 连接器 → 面板 数据通路 GPU 渲染管线 / 显存 Framebuffer 显示控制器 Display Controller 扫描 / 合成 / 缩放 CRTC 时序发生器 像素时钟 / 模式 编码器 Encoder DP / HDMI / eDP 连接器 Connector 状态 / EDID 面板 / 显示器 Panel / Monitor EDID / DPCD 线缆 软件对象(DRM/KMS) Framebuffer → Plane → CRTC → Encoder → Connector → 显示模式(Mode) 每个对象都有 id、状态、属性;链路必须完整且状态为 connected 才能点亮 诊断要点:先确认 Connector 状态(connected/disconnected),再查 EDID 是否可读,最后核对 CRTC 模式与像素时钟是否匹配。 常见断点:编码器与连接器不匹配、CRTC 数量不足、带宽超限、EDID 解析失败、面板自刷新未初始化。

二、各环节职责与关键参数

GPU 与显示控制器:GPU 负责渲染,显示控制器负责把 Framebuffer 扫描输出。现代 SoC 中显示控制器常包含多个 CRTC、多个 Plane 和缩放单元。若 Plane 数量不足,多图层合成会失败;若带宽不足,高分辨率高刷新率会掉帧或黑屏。

CRTC:CRTC 是“时序发生器”,决定像素时钟、行场同步、前后沿。一个 CRTC 同一时刻只能驱动一条输出链路。多屏场景下,CRTC 数量是硬约束。

编码器:把并行像素流转换为 DP、HDMI、eDP 等协议信号。编码器与连接器之间是多对多关系,软件需要选择一条可用路径。

连接器与 EDID:连接器代表物理接口,其状态由热插拔检测(HPD)决定。EDID 是显示器通过 DDC 通道提供的“能力清单”,包含支持的分辨率、刷新率、像素时钟上限和物理尺寸。EDID 读取失败时,内核常回退到安全模式(如 1024x768)。

面板与接口:eDP 多用于笔记本内置屏,支持面板自刷新(PSR);DP 支持多流传输(MST);HDMI 在消费显示中常见。接口不同,带宽、音频、HDR 能力都不同。

三、显示时序基础

一帧画面由有效像素区和消隐区组成。水平方向有 HActive、HFrontPorch、HSync、HBackPorch;垂直方向同理。像素时钟 = 总像素数 × 总行数 × 刷新率。若像素时钟超过链路带宽,就会出现“模式被拒绝”或黑屏。

# 查看连接器与模式
cat /sys/class/drm/card0-DP-1/status
cat /sys/class/drm/card0-DP-1/modes

# 查看 EDID 原始数据
cat /sys/class/drm/card0-DP-1/edid | hexdump -C | head

# 使用 modetest 查看 KMS 对象
modetest -M i915 -c -p -e -f

四、典型故障场景与排查清单

现象可能环节验证方法
外接屏无信号连接器 / HPD / 线缆查看 status 是否为 connected
分辨率只有 1024x768EDID 读取失败读取 edid 节点,检查校验和
刷新率上不去带宽 / 像素时钟核对 modes 与链路速率
多屏只能亮一个CRTC 数量不足modetest 查看 CRTC 资源
内屏闪烁eDP PSR / 背光关闭 PSR 对比测试
排查顺序建议:连接器状态 → EDID → 模式列表 → CRTC/编码器绑定 → 带宽与像素时钟。先确认“链路是否完整”,再怀疑“参数是否匹配”。
常见误区:把“显示器不亮”直接归因于 GPU 驱动崩溃。实际上大量案例是 EDID 读取失败、HPD 抖动或 CRTC 被占用。先看 dmesg 中 drm 相关日志,再动手改配置。

掌握这条硬件链路和时序概念后,后续的 DRM/KMS 调试、日志分析和故障定位都会变得有据可依。建议在实验机上用 modetest 和 sysfs 节点反复观察各对象状态,建立对显示通路的直观认识。