前面讨论了DRM架构浅析、Panel驱动移植、MIPI‑DSI原理。本篇偏工程实操,面向嵌入式Linux / Android显示驱动工程师,新人可以当成调试手册,老手用作速查手册。
核心思路:显示类问题分层定位,工具不是背命令,而是知道在哪一层、用哪个工具,快速缩小问题范围。
前言
做Android/Linux显示驱动开发,大量工作在问题debug:黑屏、花屏、闪屏、VBlank异常、刷新率不对、MIPI链路不稳定等等。
很多新手一碰到黑屏,直接埋头反复修改DTS上电时序,反复刷机,效率极低。
编者建议:分层排查。内核日志 > sysfs节点 > DRM原生工具(重点modetest) > Android图形栈 > 总线/寄存器 >逻辑分析仪/协议分析仪/示波器。

- 内核基础调试工具

1. dmesg
适用场景:Panel probe失败、上电电源报错、GPIO申请失败、MIPI时序参数校验报错、内核崩溃等相关显示问题。
bash
# 实时持续抓取内核日志,适合复现闪屏、上电异常
adb shell "dmesg -w"
# 过滤显示相关打印
adb shell "dmesg -w|grep -iE 'drm|panel|dsi|lcm...'"
根据不同客制化log关键词搜索。
坑点:
内核环形缓冲区容量有限,偶现问题复现之后,日志容易被冲掉。遇到间歇性问题,优先实时抓取,或者开后台log抓取,复现问题后截图或者按下按键标记时间点。
2. sysfs 文件系统 /sys/class/drm/
sysfs是内核暴露给用户态的文件接口,无需安装额外工具,可以直接读取DRM设备状态。
bash
# 查看所有DRM card、connector连接器
ls /sys/class/drm/
# 查看DSI连接器当前状态 connected/disconnected
cat /sys/class/drm/card0‑DSI‑1/status
很多panel驱动会自定义sysfs节点,可以手动触发panel power on / power off,单独验证上电时序,不用每次重启整机,会大幅节省调试时间。
二、DRM核心工具|modetest
modetest 是 libdrm 自带用户态调试工具,显示驱动调试最核心利器。
原理:绕过Android SurfaceFlinger、HWComposer整套上层图形框架,直接在用户态调用DRM内核接口,设置CRTC、Encoder、Connector,直接输出测试画面。
最大用处:隔离问题边界
如果用modetest可以正常出图:内核DRM、DSI、Panel、MIPI时序、上电时序全部没问题,问题一定是在Android上层图形栈。
如果用modetest仍然黑屏/花屏:问题锁定在内核驱动、DTS、MIPI参数、panel初始化序列、硬件信号。
参数完整说明
命令模板:
bash
modetest -M <drm驱动名> -s <conn>:<mode> -F <pattern>
| 参数 | 含义 | 如何确认获取 | | --- | --- | --- | | -M xxx | 指定DRM内核驱动模块名 | 通过lsmod | | -s : | set,设置连接器与时序,输出画面 | 先不带‑s执行modetest,打印Connector、Mode列表 | | | Connector ID连接器编号 | modetest输出Connectors段落,DSI会给出数字ID | | | 显示时序,分辨率+刷新率 | Connector下方Modes列表,例如1080x2400@60 | | -F | 选择内置帧缓冲测试图案 | 填入数字编号 |
1)怎么确认 -M 后面的DRM驱动名
bash
lsmod | grep drm
输出示例:
bash
rockchip_drm 65536 0
drm_kms_helper 196608 1 rockchip_drm
drm 458752 2 rockchip_drm,drm_kms_helper
示例中驱动名为rockchip_drm,命令写:modetest -M rockchip_drm
也可以查看模块目录:
bash
ls /sys/module/ | grep drm
主流平台参考
- Rockchip:rockchip_drm
- Qualcomm:msm
- Mediatek: mediatek
- Allwinner:sun4i‑drm
- Exynos:exynos
2)‑F pattern 测试图案编号(不同libdrm版本略有差异)
- 0:彩条
- 1:灰度渐变条
- 2:纯色填充
- 3:棋盘格图案,适合检查花屏、色块错位
完整可用示例:
bash
modetest -M rockchip_drm -s 12:1080x2400@60 -F 0
含义:rockchip_drm驱动,连接器ID=12,时序1080x2400@60Hz,输出彩条测试画面。
完整实操步骤
Step1:先查询硬件资源,不输出画面
bash
测试显示输出时要把系统其他的显示关掉
(方法请对应平台提供),
因为drm只能允许一个显示输出程序。
.
/
modetest -M rockchip_drm
会输出三大块信息:CRTCs、Encoders、Connectors。重点看Connectors。
示例输出片段:
bash
Encoders:
id 8: DSI encoder type DSI
CRTCs:
id 32
Connectors:
id 12: DSI‑1 (connected)
Encoder ID: 8
Modes:
1080x2400@60 1080 2400 60Hz
1080x1920@60 1080 1920 60Hz
Properties:
......
本例得到:Connector ID=12,可用mode:1080x2400@60
Step2:执行输出测试彩条
bash
modetest -M rockchip_drm -s 12:1080x2400@60 -F 0
终端输出示例:
bash
setting mode 1080x2400@60 on connector 12
set crtc 32, mode 1080x2400@60
此时屏幕输出标准彩条画面:红、绿、蓝、白、黑交替竖彩条。

modetest常见踩坑
- modetest: not found:Android固件默认不带该工具,需要自行编译libdrm,推到板子/vendor/bin。(如何修改客制化modetest后续篇章讨论)
- failed to set mode:mode时序与panel datasheet不匹配、DTS配置错误、MIPI速率不支持。
- Connector状态显示disconnected:内核没有识别到panel,优先回头看dmesg的panel probe日志。

三、Android 图形栈工具
1. dumpsys SurfaceFlinger
bash
dumpsys SurfaceFlinger
适用场景:modetest底层点亮正常,但系统画面撕裂、掉帧、图层合成异常。 可以查看当前所有图层、HWC合成状态、VBlank中断计数。
2. perfetto trace **(Perfetto UI)**
抓取内核中断、调度、图形子系统事件。
适合:偶现闪屏、随机掉帧、VBlank延迟这类很难复现的间歇性问题。单纯dmesg无法抓到时序类问题。dmesg是离散日志;perfetto是完整时间线。
四、总线、寄存器调试工具
i2c‑tools
大部分Panel、TCON通过I2C读写寄存器,用来下发初始化序列、读取Panel ID。
bash
# 扫描I2C总线设备
i2cdetect -y 1
# 读取寄存器
i2cget -y 1 0x40 0x00
# 写入寄存器
i2cset -y 1 0x40 0x01 0x05
可以单独验证:I2C通信是否正常,panel寄存器初始化序列是否成功下发,判断是时序问题还是寄存器下发失败。
五、硬件测量仪器
软件工具只能看软件下发的配置和日志。 如果是高温、压力测试下才偶发的花屏/闪屏,大概率是硬件信号完整性问题:MIPI差分信号。
- 示波器:测量上电时序、复位、电源波形
- MIPI协议分析仪:抓取MIPI数据包,解析LP/HS切换,定位链路层错误。(有必要的话需要将AP发命令改为LP低速)