一、modetest -c 到底有什么作用?
(一)先认识 modetest
modetest 是 libdrm 中的显示调试工具。DRM 可以理解为 Linux 内核管理显卡和显示设备的框架;KMS 负责显示模式设置,例如分辨率、刷新率和输出通路。
如果把显示系统比作一条送货路线,连接器(Connector)就是画面送往屏幕的"出口"。HDMI、DP、eDP、DSI 等都可能对应连接器;它既可能是外接插口,也可能是设备内部连接屏幕的接口。
(二)-c 表示列出连接器
modetest -c
-c 的含义是 list connectors。它主要输出三类信息:连接器概况、可用显示模式(modes)、连接器属性(props)。这些内容来自所选 DRM 设备的驱动报告,而不是桌面设置界面的汇总。1
单独执行 -c 是查询操作,不会主动设置分辨率,也不会自动显示测试图案。若要执行模式设置测试,需要另用 -s 等参数。
二、怎样执行这条指令?
(一)先查询,再按需要处理权限
# 查看连接器
modetest -c
# 如果提示权限不足,并且你有管理权限
sudo modetest -c
不必一开始就加 sudo。是否需要提权取决于设备节点权限和运行环境。如果提示找不到命令,先确认系统是否安装或构建了包含 modetest 的 libdrm 工具;不同发行版的包名可能不同。
(二)多显卡或开发板上,明确查询对象
# 查看 DRM 设备节点
ls -l /dev/dri/
# 指定设备;card0 只是示例,请按实际节点修改
modetest -D /dev/dri/card0 -c
# 指定 DRM 驱动;rockchip 只是示例
modetest -M rockchip -c
-D 选择设备,-M 选择驱动。如果机器上有多个 DRM 设备,默认打开的设备未必连接着目标屏幕。查询显示输出应选对应的 card* 节点;renderD* 节点不用于这类 KMS 连接器查询。参数支持情况以本机 modetest 的帮助输出为准。
三、如何看懂 Connectors 输出?
(一)先看一段简化示例
下面的数据是教学示例,不是实际设备日志;为便于阅读,省略了详细时序和属性。不同版本的排版也可能有差异。
Connectors:
id encoder status name size (mm) modes encoders
32 31 connected HDMI-A-1 520x290 2 31
45 0 disconnected DP-1 0x0 0 44
modes:
#0 1920x1080 60.00 ... flags: phsync, pvsync; type: preferred, driver
#1 1280x720 60.00 ... flags: phsync, pvsync; type: driver
(二)各列分别代表什么?
| 字段 | 通俗解释 |
|---|---|
id |
连接器的 DRM 对象 ID。后续测试可能使用这个编号;不要把它当作固定的硬件端口号。 |
encoder |
当前关联的编码器 ID。为 0 表示当前没有关联编码器,不能单凭它认定接口损坏。 |
status |
驱动报告的连接状态:connected、disconnected 或 unknown。 |
name |
连接器名称,如 HDMI-A-1、DP-1、eDP-1、DSI-1。 |
size (mm) |
报告的物理宽高,单位是毫米,不是分辨率。0x0 可能只是没有有效尺寸信息。 |
modes |
列出的显示模式数量,不是显示器数量。 |
encoders |
该连接器可使用的编码器 ID 列表,与前面的当前 encoder 含义不同。 |
(三)connected 是否等于屏幕已经亮了?
不能画等号。 connected 表示驱动报告连接器已连接,并不保证整条显示通路已经启用、画面已经送出或背光已经打开。固定连接的内置屏,其状态也可能由驱动直接确定。
disconnected 表示当前未检测到连接;unknown 表示驱动无法确定连接状态。它们都需要结合接口类型和现场情况判断,不能只凭一个状态词下结论。
四、如何理解 modes 和 props?
(一)modes 是可选模式,不是当前模式
1920x1080 是模式名称,通常对应宽高;60.00 是刷新率,单位 Hz。带有 preferred 的模式表示首选模式,常用作默认选择的参考,但不代表当前一定正在使用它。
后面的 hdisp、hss、hse、htot 和对应的纵向字段描述有效像素、同步位置及总时序。有些版本还打印像素时钟数值,单位为 kHz。初学者先关注分辨率、刷新率和 preferred 即可;排查屏幕时序问题时,再逐项核对。
可用模式可能来自 EDID、固定面板配置或驱动提供的其他信息,并经过驱动检查。列表中有某个模式,不保证后续设置一定成功,还可能受显示通路组合等条件限制。要了解当前显示配置,可进一步查看 modetest -p 中的 CRTC 信息及相关属性。2
(二)props 是接口的附加信息
props 可以理解为连接器的"属性清单"。常见属性包括 EDID、DPMS、link-status 和 CRTC_ID;具体有哪些,取决于驱动及查询方式。
EDID 类似显示器的"说明书",保存设备身份及显示能力信息。modetest 通常以十六进制数据展示 EDID blob,并不会直接把它整理成完整的中文说明。内置面板可能没有 EDID;因此,缺少 EDID 不能直接判定屏幕异常。
属性里的 enums 是枚举值对照,value 才是报告的值。例如看到 Good=0 Bad=1 时,应再看 value 是多少。即使 link-status 为 Good,也不能单独证明画面已正常显示。
五、实际排查时应该怎样使用?
(一)按照"设备 → 接口 → 状态 → 模式"检查
- **确认 DRM 设备:**先确保查询的是目标显卡或显示控制器。
- **找到目标接口:**对照 HDMI-A-1、DP-1 或 DSI-1 等名称。
- **查看连接状态:**外接屏可比较插拔前后的输出。
- **查看模式列表:**确认是否包含所需分辨率和刷新率。
- **继续检查显示通路:**若已连接但黑屏,再查看 CRTC、Plane、驱动日志及屏幕供电、背光等情况。
(二)常见现象与下一步
| 现象 | 建议检查方向 |
|---|---|
| 找不到目标连接器 | 先检查是否选错 DRM 设备,再检查驱动是否已加载并注册该输出。 |
| 外接屏显示 disconnected | 检查线缆、显示器电源、输入源和转接器;结合热插拔及驱动日志判断。 |
| connected,但 modes 为 0 | 检查模式获取与验证过程;外接屏关注 EDID/DDC,固定面板关注配置时序和驱动。 |
| 列表缺少目标分辨率 | 检查显示器能力、转接链路及驱动筛选条件,不要只看显示器宣传参数。 |
| connected 且有模式,仍然黑屏 | 继续检查通路是否启用、帧缓冲是否有效,以及链路、供电和背光状态。 |
这些是排查方向,不是仅凭 -c 输出就能确定的故障原因。
(三)保存日志,方便对比
# 保存查询结果和错误信息
modetest -D /dev/dri/card0 -c > modetest-connectors.txt 2>&1
# 同时查看连接器、编码器、CRTC 和 Plane
modetest -D /dev/dri/card0 -c -e -p
建议分别保存插屏前、插屏后和异常发生时的结果。对比状态、模式数量和属性变化,比只看一次输出更容易找到线索。
六、记住这几个要点
(一)最常见的三个误区
- **误区一:-c 会点亮屏幕。**它用于查询,设置模式另有参数。
- **误区二:connected 就说明显示正常。**连接检测与实际出图是不同环节。
- **误区三:modes 就是当前分辨率。**它列出可选模式,当前状态需要进一步查看。
(二)一句话记忆
modetest -c 就像查看显示出口的登记表:先看有哪些出口,再看是否连接,最后看驱动给出了哪些可选显示模式。
七、参考资料
(一)源码与内核文档
1 libdrm modetest 源码(Android 源码树):参见 usage、dump_connectors、dump_mode。
2 Linux 内核 DRM/KMS 文档:参见连接器、模式与标准连接器属性。