前言
做显示驱动开发,日常 90% 的 Bug 逃不出三类:黑屏、花屏、闪屏。
很多新手排查问题最大的误区:凭感觉改时序加log**、乱加延时、盲目替换 DTS**。
实际上:黑/花/闪 不是玄学,每一种现象都对应固定的故障层级。
本文给大家一套通用、自上而下的标准化排查方法论。
以后遇到任何屏幕异常,不用瞎猜,直接按流程走,快速锁定是:
硬件问题 / 时序问题 / 驱动初始化问题 / MIPI链路问题 / 安卓图形栈问题
一、先搞懂:三类故障的本质区别
很多人分不清三者,导致排查方向完全跑偏。先记死核心特征:
1. 黑屏:通路未通、未点亮
特征:完全无画面、无背光/有背光无图像
本质:APP、SurfaceFlinger或者HWC未正常送图、背光未正常设置,Panel 未正常上电、复位失败、初始化序列未下发、DRM 未启动、MIPI 未建链
- 花屏:数据错乱、时序不匹配
特征:画面撕裂、色块错乱、横纹、竖纹、马赛克
本质:像素时序不对、MIPI 速率不匹配、缓冲区对齐异常、图层叠加错误、信号干扰
- 闪屏:状态切换不稳定、时序竞争
特征:休眠唤醒闪、切换应用闪、低帧率闪、概率性闪烁
本质:电源/复位时序竞争、LP/HS 切换异常、VBlank 同步异常、atomic 提交超时、触发ESD check、应用自身闪烁。
一句话总结
黑屏=没跑通初始化流程
花屏=画面数据不对
闪屏=状态切换不稳定
二、黄金分层排查法
所有显示问题,优先分层,再定位细节。
不要一上来改驱动!
第1层:判断是【系统层问题】还是【底层驱动问题】
查看测试端上报问题反馈的自身录屏,确定问题现象自身录屏是否可见?
如果可见系统层问题请上层同事接力排查
如果不可见底层问题,需要继续深入研究
这是整个排查流程的分水岭。
另外,在开发新需求时遇到的必现问题可以使用工具:modetest
如果****modetest 可以正常出图(彩条正常)
结论:内核DRM、MIPI、Panel、上电时序、硬件全部正常
问题 100% 在 Android 上层:
- SurfaceFlinger 合成异常
- HWC 硬件合成器异常
- 帧缓冲区参数不匹配
- 系统刷新率策略异常
如果****modetest 依旧黑屏/花屏/闪屏
结论:问题锁定内核、驱动、DTS、硬件、MIPI链路
直接进入底层排查,不用浪费时间看安卓图形栈。
第2层:内核层状态核查(drm_debugfs 神器)
无需任何编译,内核自带,root 权限即可用。
路径:/sys/kernel/debug/dri/0/
1、查看屏幕真实连接状态
cat /sys/kernel/debug/dri/0/connectors
如果是 disconnected:直接锁定 上电时序、复位、DTS、Panel 检测机制 问题
如果是 connected:屏幕已识别,问题在时序/数据/链路
2、查看 CRTC 时序是否真正生效
cat /sys/kernel/debug/dri/0/crtc
核对:分辨率、像素时钟、刷新率、前后肩参数是否和屏 spec 一致
大量花屏,就是timing时序参数配错、对齐不匹配。
3、查看 DRM Atomic 状态(排查闪屏、黑屏超时)
cat /sys/kernel/debug/dri/0/state
闪屏、瞬间黑屏、切换画面异常:
- atomic commit 提交失败
- vblank 超时
- mode 校验不通过
第3层:日志精准定位(dmesg)
过滤关键日志:
dmesg | grep -i drm|panel|...
常见报错对应问题:
- panel probe failed:电源、复位、DTS 配置错误
- mipi dsi tx timeout:MIPI 链路不稳定、HS/LP 切换异常
- mode validation failed:显示时序参数非法
- atomic commit timed out:画面提交阻塞,闪屏、瞬黑元凶
第4层:硬件 & 时序层终极排查
软件日志无报错、但依旧异常,直接锁定硬件时序问题:
- 上电顺序:VCI数字电 -> VDDI模拟电顺序颠倒
- 复位延时不足、复位释放过早
- Panel 初始化指令下发时机不对
- MIPI 速率配置过高,信号完整性不足(高温花屏、压力花屏)
- 电源纹波过大,供电不稳定导致闪屏
三、三类问题定位对照表
1. 黑屏问题定位链路
无画面 → 查看 debugfs connectors → 未连接 → 核查上电/复位/DTS → 核查 panel 初始化序列 → 硬件供电测量
2. 花屏问题定位链路
画面错乱 → modetest 复现 → 核查 DTS 时序 → 核查 MIPI 速率 → 核查帧缓冲对齐 → 排查硬件信号干扰
3. 闪屏问题定位链路
概率闪烁/瞬黑 → 查看 atomic 状态 & vblank 日志 → 核查休眠唤醒时序 → 核查 LP/HS 切换 → 核查电源域开关时序
四、核心复盘
- 所有问题优先找到高概率复现路径,方便后续debug
- 先分层隔离,再细节排查,能节省 90% 的调试时间。
- modetest + drm_debugfs,是显示驱动调试的两大杀手锏,熟练掌握可以解决绝大多数问题。