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

一、 内核基础调试工具

1. dmesg
适用场景:Panel probe失败、上电电源报错、GPIO申请失败、MIPI时序参数校验报错、内核崩溃等相关显示问题。
# 实时持续抓取内核日志,适合复现闪屏、上电异常adb shell "dmesg -w"# 过滤显示相关打印adb shell "dmesg -w | grep -iE 'drm|panel|dsi|lcm...'"
根据不同客制化log关键词搜索。
坑点:
内核环形缓冲区容量有限,偶现问题复现之后,日志容易被冲掉。遇到间歇性问题,优先实时抓取,或者开后台log抓取,复现问题后截图或者按下按键标记时间点。
2. sysfs 文件系统 /sys/class/drm/
sysfs是内核暴露给用户态的文件接口,无需安装额外工具,可以直接读取DRM设备状态。
# 查看所有DRM card、connector连接器ls /sys/class/drm/# 查看DSI连接器当前状态 connected/disconnectedcat /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初始化序列、硬件信号。
参数完整说明
命令模板:
modetest -M <drm驱动名> -s <conn>:<mode> -F <pattern>
|
参数
|
含义
|
如何确认获取
|
|
-M xxx
|
指定DRM内核驱动模块名
|
通过lsmod
|
|
-s <conn>:<mode>
|
set,设置连接器与时序,输出画面
|
先不带‑s执行modetest,打印Connector、Mode列表
|
|
<conn>
|
Connector ID连接器编号
|
modetest输出Connectors段落,DSI会给出数字ID
|
|
<mode>
|
显示时序,分辨率+刷新率
|
Connector下方Modes列表,例如1080x2400@60
|
|
-F <pattern>
|
选择内置帧缓冲测试图案
|
填入数字编号
|
1)怎么确认 -M 后面的DRM驱动名
lsmod | grep drm
输出示例:
rockchip_drm 65536 0drm_kms_helper 196608 1 rockchip_drmdrm 458752 2 rockchip_drm,drm_kms_helper
示例中驱动名为rockchip_drm,命令写:modetest -M rockchip_drm
也可以查看模块目录:
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:棋盘格图案,适合检查花屏、色块错位
完整可用示例:
modetest -M rockchip_drm -s 12:1080x2400@60 -F 0
含义:rockchip_drm驱动,连接器ID=12,时序1080x2400@60Hz,输出彩条测试画面。
完整实操步骤
Step1:先查询硬件资源,不输出画面
测试显示输出时要把系统其他的显示关掉(方法请对应平台提供),因为drm只能允许一个显示输出程序。./modetest -M rockchip_drm
会输出三大块信息:CRTCs、Encoders、Connectors。重点看Connectors。
示例输出片段:
Encoders:id 8: DSI encoder type DSICRTCs:id 32Connectors: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:执行输出测试彩条
modetest -M rockchip_drm -s 12:1080x2400@60 -F 0
终端输出示例:
setting mode 1080x2400@60 on connector 12set 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
dumpsys SurfaceFlinger
适用场景:modetest底层点亮正常,但系统画面撕裂、掉帧、图层合成异常。 可以查看当前所有图层、HWC合成状态、VBlank中断计数。
2. perfetto trace(https://ui.perfetto.dev/)
抓取内核中断、调度、图形子系统事件。
适合:偶现闪屏、随机掉帧、VBlank延迟这类很难复现的间歇性问题。单纯dmesg无法抓到时序类问题。dmesg是离散日志;perfetto是完整时间线。
四、总线、寄存器调试工具
i2c‑tools
大部分Panel、TCON通过I2C读写寄存器,用来下发初始化序列、读取Panel ID。
# 扫描I2C总线设备i2cdetect -y 1# 读取寄存器i2cget -y 1 0x40 0x00# 写入寄存器i2cset -y 1 0x40 0x01 0x05
可以单独验证:I2C通信是否正常,panel寄存器初始化序列是否成功下发,判断是时序问题还是寄存器下发失败。
五、硬件测量仪器
软件工具只能看软件下发的配置和日志。 如果是高温、压力测试下才偶发的花屏/闪屏,大概率是硬件信号完整性问题:MIPI差分信号。
● 示波器:测量上电时序、复位、电源波形
● MIPI协议分析仪:抓取MIPI数据包,解析LP/HS切换,定位链路层错误。(有必要的话需要将AP发命令改为LP低速)