4. 显示硬件基础
在KMS(Kernel Mode Setting)故障排查中,绝大多数“黑屏、花屏、分辨率不对、外接屏不亮”的问题,最终都会落到显示硬件链路的某一环上。理解从GPU显示控制器到物理接口、再到显示器EDID与模式协商的完整通路,是定位问题的前提。本节把这条链路拆成四个可观测的层次:显示控制器(CRTC/Plane/Encoder)、显示接口(HDMI/DP/eDP/MIPI DSI)、EDID数据、以及显示模式。
一、核心原理:一条从帧缓冲到像素的链路
GPU显示控制器是KMS中的“显示引擎”,它负责从显存读取像素、合成多个图层、生成时序信号。在DRM抽象里,它被拆成几个对象:Plane(图层,承载framebuffer)、CRTC(扫描输出控制器,产生像素时钟与同步信号)、Encoder(把CRTC的并行像素流编码成某种接口协议)、Connector(物理接口,负责探测EDID与热插拔)。
数据流方向是:framebuffer → Plane → CRTC → Encoder → Connector → 线缆 → 显示器。任何一环配置错误或状态异常,都会表现为显示异常。例如CRTC未使能会导致黑屏,Encoder绑定错误会导致无信号,Connector探测失败会导致分辨率回退到默认值。
modetest 或 drm_info 查看当前状态,而不是盲目改配置。
二、显示接口:HDMI、DP、eDP、MIPI DSI的差异
不同接口在电气特性、协议层、热插拔能力、EDID读取方式上差异很大,这直接决定了排查手段。
| 接口 | 典型场景 | 热插拔 | EDID读取 | 常见故障 |
|---|---|---|---|---|
| HDMI | 外接显示器、电视 | 支持HPD | 通过DDC/I2C读取 | HPD抖动、EDID校验失败、TMDS时钟超限 |
| DP | 外接显示器、多屏 | 支持HPD | 通过AUX通道读取 | 链路训练失败、AUX超时、Lane数不匹配 |
| eDP | 笔记本内置屏 | 通常无HPD | 通过AUX读取 | 背光不亮、面板时序不匹配、PSR异常 |
| MIPI DSI | 手机、平板、嵌入式 | 无标准HPD | 通常由面板驱动固定 | Lane数/速率配置错误、初始化序列失败 |
HDMI与DP是“可探测”接口,内核能通过HPD和EDID自动发现显示器;eDP和MIPI DSI更依赖设备树或ACPI中的面板参数,属于“静态配置”接口。排查eDP黑屏时,先确认背光使能、面板供电、以及panel timing是否与datasheet一致,而不是先怀疑EDID。
三、EDID与显示模式:协商的起点
EDID是显示器写给主机的一份“能力清单”,包含厂商、型号、支持的分辨率、刷新率、像素时钟、时序参数等。KMS在Connector探测阶段读取EDID,解析出可用模式列表,再与CRTC/Encoder能力求交集,最终选出一个模式。
常见EDID问题包括:I2C读取失败(返回全0或全FF)、EDID校验和错误、扩展块缺失、以及“能读到但模式不被接受”。可以用以下命令快速验证:
# 查看连接器状态与EDID
modetest -c
# 读取原始EDID(以HDMI-A-1为例)
cat /sys/class/drm/card0-HDMI-A-1/edid | hexdump -C
# 解析EDID
edid-decode /sys/class/drm/card0-HDMI-A-1/edid
# 查看当前模式与CRTC绑定
cat /sys/kernel/debug/dri/0/state
如果EDID读取失败,内核通常会回退到安全模式(如1024x768),此时用户看到的是“分辨率不对”而非完全黑屏。若EDID正常但模式被拒绝,需要检查像素时钟是否超过Encoder上限、带宽是否足够(DP Lane数、HDMI TMDS时钟)。
四、案例与复盘:外接DP显示器间歇性黑屏
某工控机通过DP连接显示器,运行数小时后间歇黑屏,重新插拔可恢复。排查步骤:
- 查看内核日志,发现
dp_link_training failed与AUX timeout交替出现。 - 用
drm_info确认链路速率被协商到HBR2,但Lane数为1。 - 检查线缆,发现使用的是劣质DP线,屏蔽层不完整。
- 更换认证线缆后,链路稳定在HBR2 x2,故障消失。
复盘要点:DP链路训练是动态过程,受线缆质量、阻抗匹配、EMI影响。排查时应固定变量:换线、换口、换显示器,逐步缩小范围。对于eDP,则优先核对面板时序与背光电路。
五、方法流程:从现象到根因的排查顺序
建议按以下顺序推进,避免跳步:
- 确认接口类型:HDMI/DP/eDP/MIPI DSI,决定后续手段。
- 检查HPD与连接状态:
cat /sys/class/drm/card0-*/status。 - 读取EDID:确认是否成功、校验和是否正确。
- 查看可用模式:
modetest -c或drm_info。 - 检查CRTC/Encoder绑定:是否存在资源冲突。
- 查看内核日志:
dmesg | grep -i drm,关注link training、AUX、HPD。 - 验证硬件:换线、换显示器、换接口。
掌握这条链路后,面对任何显示异常,都可以先问三个问题:接口是什么?EDID读到了吗?CRTC和Connector绑定正确吗?这三个问题能覆盖大部分KMS故障场景,也能帮助你在驱动日志中快速定位到具体模块。