第5篇:显示驱动必备调试工具浅析

前面讨论了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常见踩坑

  1. modetest: not found:Android固件默认不带该工具,需要自行编译libdrm,推到板子/vendor/bin。(如何修改客制化modetest后续篇章讨论)
  2. failed to set mode:mode时序与panel datasheet不匹配、DTS配置错误、MIPI速率不支持。
  3. 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低速)
相关推荐
维克兜率天1 小时前
【维克】配对交易的季节性:哪些品种适合长拿?
android·开发语言·笔记·python·算法·kotlin·量化
墨天梦2 小时前
B06_XML控件布局与ViewBinding
android·kotlin
晚风叙码2 小时前
MySQL 表的操作:从建表到删表,一篇讲清楚
android·mysql·oracle
事圆则缓3 小时前
Android 性能优化常见工具与使用场景:从症状到证据的排查指南
android·性能优化
avi91113 小时前
Unity 非后台,非自动构建,但统计报表 BuildReport ,构建自动化系统C#
android·webserver·ios打包·admin·c#后台·unity打包系统·unity自动构建
新鲜势力呀4 小时前
PHP 定时任务系统实战:从 Cron 混乱执行到任务调度中心 + Redis队列 + 失败重试
android·java·redis
YF02114 小时前
Android 16系统 如何修改 eth0 IP ?
android
其实防守也摸鱼4 小时前
渗透测试学习计划(全栈综合 · 零基础进阶)
android·数据库·学习·安全·oracle·自动化·学习方法
释厄6235 小时前
BSD 简单真理循环论——简单真理 × 复杂循环=大一统
android·开发语言·kotlin