目录
1. 显示输出时存在几个概念及关系

在链接显示器之前,存在图示几个设备crtc 、encoder、connector,modetest 命令即是对这几个设备进行参数控制,包括:
1)控制输出图像的内容
2) 通过哪个显示口进行输出
3) 输出格式等。
2. 查询输出
modetest -M dc ,此处红色的参数和具体的显卡驱动相关。
通过下述命令的输出,我们可以看到当前设备上存在encoders \connectors\crtc的个数等信息:
1) 通过encoder 信息,可以看到encoder ID 53 相连接的CRTC ID为 48
2)通过 connectors信息,可以看到connector ID 54 与 encoder 53相链接。并且链接状态(第三列),同时可以看到支持的显示模式,1440x900等等。
通过上述信息,我们知晓:

Encoders:
id crtc type possible crtcs possible clones
49 0 TMDS 0x00000001 0x00000000
51 0 TMDS 0x00000002 0x00000000
53 48 TMDS 0x00000004 0x00000000
Connectors:
id encoder status name size (mm) modes encoders
50 0 disconnected DP-1 0x0 0 49
props:
1 EDID:
flags: immutable blob
blobs:
value:
2 DPMS:
flags: enum
enums: On=0 Standby=1 Suspend=2 Off=3
value: 3
5 link-status:
flags: enum
enums: Good=0 Bad=1
value: 0
6 non-desktop:
flags: immutable range
values: 0 1
value: 0
19 CRTC_ID:
flags: object
value: 0
52 0 disconnected DP-2 0x0 0 51
props:
1 EDID:
flags: immutable blob
blobs:
value:
2 DPMS:
flags: enum
enums: On=0 Standby=1 Suspend=2 Off=3
value: 3
5 link-status:
flags: enum
enums: Good=0 Bad=1
value: 0
6 non-desktop:
flags: immutable range
values: 0 1
value: 0
19 CRTC_ID:
flags: object
value: 0
54 53 connected DP-3 410x260 20 53
modes:
index name refresh (Hz) hdisp hss hse htot vdisp vss vse vtot)
#0 1440x900 59.89 1440 1520 1672 1904 900 903 909 934 106500 flags: nhsync, pvsync; type: preferred, driver
#1 1280x1024 75.02 1280 1296 1440 1688 1024 1025 1028 1066 135000 flags: phsync, pvsync; type: driver
#2 1280x1024 60.02 1280 1328 1440 1688 1024 1025 1028 1066 108000 flags: phsync, pvsync; type: driver
#3 1440x900 74.98 1440 1536 1688 1936 900 903 909 942 136750 flags: nhsync, pvsync; type: driver
#4 1280x960 60.00 1280 1376 1488 1800 960 961 964 1000 108000 flags: phsync, pvsync; type: driver
#5 1280x800 59.81 1280 1352 1480 1680 800 803 809 831 83500 flags: nhsync, pvsync; type: driver
#6 1152x864 75.00 1152 1216 1344 1600 864 865 868 900 108000 flags: phsync, pvsync; type: driver
#7 1024x768 75.03 1024 1040 1136 1312 768 769 772 800 78750 flags: phsync, pvsync; type: driver
#8 1024x768 70.07 1024 1048 1184 1328 768 771 777 806 75000 flags: nhsync, nvsync; type: driver
#9 1024x768 60.00 1024 1048 1184 1344 768 771 777 806 65000 flags: nhsync, nvsync; type: driver
#10 832x624 74.55 832 864 928 1152 624 625 628 667 57284 flags: nhsync, nvsync; type: driver
#11 800x600 75.00 800 816 896 1056 600 601 604 625 49500 flags: phsync, pvsync; type: driver
#12 800x600 72.19 800 856 976 1040 600 637 643 666 50000 flags: phsync, pvsync; type: driver
#13 800x600 60.32 800 840 968 1056 600 601 605 628 40000 flags: phsync, pvsync; type: driver
#14 800x600 56.25 800 824 896 1024 600 601 603 625 36000 flags: phsync, pvsync; type: driver
#15 640x480 75.00 640 656 720 840 480 481 484 500 31500 flags: nhsync, nvsync; type: driver
#16 640x480 72.81 640 664 704 832 480 489 492 520 31500 flags: nhsync, nvsync; type: driver
#17 640x480 66.67 640 704 768 864 480 483 486 525 30240 flags: nhsync, nvsync; type: driver
#18 640x480 59.94 640 656 752 800 480 490 492 525 25175 flags: nhsync, nvsync; type: driver
#19 720x400 70.08 720 738 846 900 400 412 414 449 28320 flags: nhsync, pvsync; type: driver
props:
1 EDID:
flags: immutable blob
blobs:
value:
00ffffffffffff004c2d60053931594d
2b13010368291a782ade95a3544c9926
0f5054bfef80950f81808140714f8100
0101010101019a29a0d0518422305098
360098ff1000001c000000fd00384b1e
510e000a202020202020000000fc0053
796e634d61737465720a2020000000ff
00485647534130383336330a2020006f
2 DPMS:
flags: enum
enums: On=0 Standby=1 Suspend=2 Off=3
value: 0
5 link-status:
flags: enum
enums: Good=0 Bad=1
value: 0
6 non-desktop:
flags: immutable range
values: 0 1
value: 0
19 CRTC_ID:
flags: object
value: 48
CRTCs:
id fb pos size
34 0 (0,0) (0x0)
#0 nan 0 0 0 0 0 0 0 0 0 flags: ; type:
props:
20 ACTIVE:
flags: range
values: 0 1
value: 0
21 MODE_ID:
flags: blob
blobs:
value:
18 OUT_FENCE_PTR:
flags: range
values: 0 18446744073709551615
value: 0
41 0 (0,0) (0x0)
#0 nan 0 0 0 0 0 0 0 0 0 flags: ; type:
props:
20 ACTIVE:
flags: range
values: 0 1
value: 0
21 MODE_ID:
flags: blob
blobs:
value:
18 OUT_FENCE_PTR:
flags: range
values: 0 18446744073709551615
value: 0
48 78 (0,0) (1440x900)
#0 59.89 1440 1520 1672 1904 900 903 909 934 106500 flags: nhsync, pvsync; type:
props:
20 ACTIVE:
flags: range
values: 0 1
value: 1
21 MODE_ID:
flags: blob
blobs:
value:
04a00100a005f0058806700700008403
87038d03a60300000000000006000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000
18 OUT_FENCE_PTR:
flags: range
values: 0 18446744073709551615
value: 0
Planes:
id crtc fb CRTC x,y x,y gamma size possible crtcs
28 0 0 0,0 0,0 0 0x00000001
formats: AR30 AB30 RA30 BA30 AR24 AB24 RA24 BA24 XR24 XB24 RX24 BX24 AR12 AB12 RA12 BA12 XR12 XB12 RX12 BX12 AR15 AB15 RA15 BA15 XR15 XB15 RX15 BX15 RG16 BG16 YUYV UYVY
props:
7 type:
flags: immutable enum
enums: Overlay=0 Primary=1 Cursor=2
value: 1
16 FB_ID:
flags: object
value: 0
17 IN_FENCE_FD:
flags: signed range
values: -1 2147483647
value: -1
19 CRTC_ID:
flags: object
value: 0
12 CRTC_X:
flags: signed range
values: -2147483648 2147483647
value: 0
13 CRTC_Y:
flags: signed range
values: -2147483648 2147483647
value: 0
14 CRTC_W:
flags: range
values: 0 2147483647
value: 0
15 CRTC_H:
flags: range
values: 0 2147483647
value: 0
8 SRC_X:
flags: range
values: 0 4294967295
value: 0
9 SRC_Y:
flags: range
values: 0 4294967295
value: 0
10 SRC_W:
flags: range
values: 0 4294967295
value: 0
11 SRC_H:
flags: range
values: 0 4294967295
value: 0
27 IN_FORMATS:
flags: immutable blob
blobs:
value:
01000000000000002000000018000000
03000000980000004152333041423330
52413330424133304152323441423234
52413234424132345852323458423234
52583234425832344152313241423132
52413132424131325852313258423132
52583132425831324152313541423135
52413135424131355852313558423135
52583135425831355247313642473136
59555956555956590000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
in_formats blob decoded:
AR30:
AB30:
RA30:
BA30:
AR24:
AB24:
RA24:
BA24:
XR24:
XB24:
RX24:
BX24:
AR12:
AB12:
RA12:
BA12:
XR12:
XB12:
RX12:
BX12:
AR15:
AB15:
RA15:
BA15:
XR15:
XB15:
RX15:
BX15:
RG16:
BG16:
YUYV:
UYVY:
30 rotation:
flags: bitmask
values: rotate-0=0x1
value: 1
31 0 0 0,0 0,0 0 0x00000001
formats: AR24
props:
7 type:
flags: immutable enum
enums: Overlay=0 Primary=1 Cursor=2
value: 2
16 FB_ID:
flags: object
value: 0
17 IN_FENCE_FD:
flags: signed range
values: -1 2147483647
value: -1
19 CRTC_ID:
flags: object
value: 0
12 CRTC_X:
flags: signed range
values: -2147483648 2147483647
value: 0
13 CRTC_Y:
flags: signed range
values: -2147483648 2147483647
value: 0
14 CRTC_W:
flags: range
values: 0 2147483647
value: 0
15 CRTC_H:
flags: range
values: 0 2147483647
value: 0
8 SRC_X:
flags: range
values: 0 4294967295
value: 0
9 SRC_Y:
flags: range
values: 0 4294967295
value: 0
10 SRC_W:
flags: range
values: 0 4294967295
value: 0
11 SRC_H:
flags: range
values: 0 4294967295
value: 0
27 IN_FORMATS:
flags: immutable blob
blobs:
value:
01000000000000000100000018000000
00000000200000004152323400000000
in_formats blob decoded:
AR24:
33 rotation:
flags: bitmask
values: rotate-0=0x1
value: 1
35 0 0 0,0 0,0 0 0x00000002
formats: AR30 AB30 RA30 BA30 AR24 AB24 RA24 BA24 XR24 XB24 RX24 BX24 AR12 AB12 RA12 BA12 XR12 XB12 RX12 BX12 AR15 AB15 RA15 BA15 XR15 XB15 RX15 BX15 RG16 BG16 YUYV UYVY
props:
7 type:
flags: immutable enum
enums: Overlay=0 Primary=1 Cursor=2
value: 1
16 FB_ID:
flags: object
value: 0
17 IN_FENCE_FD:
flags: signed range
values: -1 2147483647
value: -1
19 CRTC_ID:
flags: object
value: 0
12 CRTC_X:
flags: signed range
values: -2147483648 2147483647
value: 0
13 CRTC_Y:
flags: signed range
values: -2147483648 2147483647
value: 0
14 CRTC_W:
flags: range
values: 0 2147483647
value: 0
15 CRTC_H:
flags: range
values: 0 2147483647
value: 0
8 SRC_X:
flags: range
values: 0 4294967295
value: 0
9 SRC_Y:
flags: range
values: 0 4294967295
value: 0
10 SRC_W:
flags: range
values: 0 4294967295
value: 0
11 SRC_H:
flags: range
values: 0 4294967295
value: 0
27 IN_FORMATS:
flags: immutable blob
blobs:
value:
01000000000000002000000018000000
03000000980000004152333041423330
52413330424133304152323441423234
52413234424132345852323458423234
52583234425832344152313241423132
52413132424131325852313258423132
52583132425831324152313541423135
52413135424131355852313558423135
52583135425831355247313642473136
59555956555956590000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
in_formats blob decoded:
AR30:
AB30:
RA30:
BA30:
AR24:
AB24:
RA24:
BA24:
XR24:
XB24:
RX24:
BX24:
AR12:
AB12:
RA12:
BA12:
XR12:
XB12:
RX12:
BX12:
AR15:
AB15:
RA15:
BA15:
XR15:
XB15:
RX15:
BX15:
RG16:
BG16:
YUYV:
UYVY:
37 rotation:
flags: bitmask
values: rotate-0=0x1
value: 1
38 0 0 0,0 0,0 0 0x00000002
formats: AR24
props:
7 type:
flags: immutable enum
enums: Overlay=0 Primary=1 Cursor=2
value: 2
16 FB_ID:
flags: object
value: 0
17 IN_FENCE_FD:
flags: signed range
values: -1 2147483647
value: -1
19 CRTC_ID:
flags: object
value: 0
12 CRTC_X:
flags: signed range
values: -2147483648 2147483647
value: 0
13 CRTC_Y:
flags: signed range
values: -2147483648 2147483647
value: 0
14 CRTC_W:
flags: range
values: 0 2147483647
value: 0
15 CRTC_H:
flags: range
values: 0 2147483647
value: 0
8 SRC_X:
flags: range
values: 0 4294967295
value: 0
9 SRC_Y:
flags: range
values: 0 4294967295
value: 0
10 SRC_W:
flags: range
values: 0 4294967295
value: 0
11 SRC_H:
flags: range
values: 0 4294967295
value: 0
27 IN_FORMATS:
flags: immutable blob
blobs:
value:
01000000000000000100000018000000
00000000200000004152323400000000
in_formats blob decoded:
AR24:
40 rotation:
flags: bitmask
values: rotate-0=0x1
value: 1
42 48 78 0,0 0,0 0 0x00000004
formats: AR30 AB30 RA30 BA30 AR24 AB24 RA24 BA24 XR24 XB24 RX24 BX24 AR12 AB12 RA12 BA12 XR12 XB12 RX12 BX12 AR15 AB15 RA15 BA15 XR15 XB15 RX15 BX15 RG16 BG16 YUYV UYVY
props:
7 type:
flags: immutable enum
enums: Overlay=0 Primary=1 Cursor=2
value: 1
16 FB_ID:
flags: object
value: 78
17 IN_FENCE_FD:
flags: signed range
values: -1 2147483647
value: -1
19 CRTC_ID:
flags: object
value: 48
12 CRTC_X:
flags: signed range
values: -2147483648 2147483647
value: 0
13 CRTC_Y:
flags: signed range
values: -2147483648 2147483647
value: 0
14 CRTC_W:
flags: range
values: 0 2147483647
value: 1440
15 CRTC_H:
flags: range
values: 0 2147483647
value: 900
8 SRC_X:
flags: range
values: 0 4294967295
value: 0
9 SRC_Y:
flags: range
values: 0 4294967295
value: 0
10 SRC_W:
flags: range
values: 0 4294967295
value: 94371840
11 SRC_H:
flags: range
values: 0 4294967295
value: 58982400
27 IN_FORMATS:
flags: immutable blob
blobs:
value:
01000000000000002000000018000000
03000000980000004152333041423330
52413330424133304152323441423234
52413234424132345852323458423234
52583234425832344152313241423132
52413132424131325852313258423132
52583132425831324152313541423135
52413135424131355852313558423135
52583135425831355247313642473136
59555956555956590000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
in_formats blob decoded:
AR30:
AB30:
RA30:
BA30:
AR24:
AB24:
RA24:
BA24:
XR24:
XB24:
RX24:
BX24:
AR12:
AB12:
RA12:
BA12:
XR12:
XB12:
RX12:
BX12:
AR15:
AB15:
RA15:
BA15:
XR15:
XB15:
RX15:
BX15:
RG16:
BG16:
YUYV:
UYVY:
44 rotation:
flags: bitmask
values: rotate-0=0x1
value: 1
45 48 82 0,0 0,0 0 0x00000004
formats: AR24
props:
7 type:
flags: immutable enum
enums: Overlay=0 Primary=1 Cursor=2
value: 2
16 FB_ID:
flags: object
value: 82
17 IN_FENCE_FD:
flags: signed range
values: -1 2147483647
value: -1
19 CRTC_ID:
flags: object
value: 48
12 CRTC_X:
flags: signed range
values: -2147483648 2147483647
value: 1292
13 CRTC_Y:
flags: signed range
values: -2147483648 2147483647
value: 806
14 CRTC_W:
flags: range
values: 0 2147483647
value: 32
15 CRTC_H:
flags: range
values: 0 2147483647
value: 32
8 SRC_X:
flags: range
values: 0 4294967295
value: 0
9 SRC_Y:
flags: range
values: 0 4294967295
value: 0
10 SRC_W:
flags: range
values: 0 4294967295
value: 2097152
11 SRC_H:
flags: range
values: 0 4294967295
value: 2097152
27 IN_FORMATS:
flags: immutable blob
blobs:
value:
01000000000000000100000018000000
00000000200000004152323400000000
in_formats blob decoded:
AR24:
47 rotation:
flags: bitmask
values: rotate-0=0x1
value: 1
Frame buffers:
id size pitch
设置输出

默认输出
根据第二节获取的信息
modetest -M dc -s 54@48:1440x900
参数说明:
-s <connector_id>[,<connector_id>][@<crtc_id>]:[#<mode index>]<mode>[-<vrefresh>][@<format>]:用于在指定的 pipeline 上以某个 mode 显示某个 pattern 的画面。54: connector id- 48: crtc id
1440x900:显示 mode;
指定输出内容
如果有多个显示器,可能期望在每个显示器上输出不同内容。目前modetest支持以下四种图形:
1. TILES: 是彩色斜条纹
2. PLAIN: 简单灰度图形,看起来像没有输出
3. SMPTE :默认的输出类型,竖着的彩色条纹
4. GRADIENT: 黑白灰度渐变图形。
enum util_fill_pattern {
UTIL_PATTERN_TILES,
UTIL_PATTERN_PLAIN,
UTIL_PATTERN_SMPTE,
UTIL_PATTERN_GRADIENT,
};
指定某种图形输出,例如彩色斜条纹
modetest -M dc -s 54@48:1440x900 -Ftiles
常见问题
failed to set mode: Permission denied
1)控制显示输出的命令即第三节中的命令,需要在非图形界面下操作。例如ubuntu进入图形界面后,首先要切换到字符界面,否则会报错,提示没有权限打开。
failed to set mode: Permission denied
modetest -M dc -s 54@48:1440x900
setting mode 1440x900-59.89Hz@XR24 on connectors 54, crtc 48
failed to set mode: Permission denied
原因: 一个显卡只对应一个设备节点,图形界面已经占用此节点。如果此时再通过modetest获取显卡控制节点,则报此错误。
解决方法:
# ubuntu 20.04 关闭当前图形界面管理
sudo systemctl stop gdm3
[sudo] password for user:
# 再次测试控制输出
modetest -M dc -s 54@48:1440x900
setting mode 1440x900-59.89Hz@XR24 on connectors 54, crtc 48
failed to set gamma: Invalid argument
^C
#测试完毕后重新开启图形基本管理 sudo systemctl start gdm3
此外,还可以通过下述命令开启关闭图形界面,只是此方法多一步重启,相对麻烦
# sudo systemctl set-default multi-user.target # sudo reboot # 开启用户图形界面。 # sudo systemctl set-default graphical.target # sudo reboot
2)同理,开启两个shell,同时运行两个设置命令,其中一个也会报权限问题。
failed to open device
./modetest -M i915
failed to open device 'i915': No such file or directory
例如,我们在intel显卡上运行此命令,显卡采用的驱动是i915,但是提示找不到设备。
原因:
桌面管理器占据了设备节点,将桌面管理器退出即可。
分析
源码路径:modetest属于libdrm的一个测试工具, Index of /libdrm
此处采用2.4.99的版本,更新的版本里面已经只支持meson编译。
编译及安装比较简单,直接configure make make install即可。
采用新库及放开打印,运行modetest命令
LIBGL_DEBUG=verbose LD_LIBRARY_PATH=/usr/local/lib ./tests/modetest/.libs/modetest -M i915
可以看到如下打印信息
drmOpenDevice: node name is /dev/dri/card0
drmOpenDevice: open result is 3, (OK) 这里说明正常打开了设备节点.
drmGetBusid returned 'pci:0000:00:02.0' (查看此字段有值,例如左侧这种情况,则标识显卡设备已经被占用。详见 xf86drm.c中的drmOpenByName)
drmOpenDevice: node name is /dev/dri/card1
对应代码
modetest.c -> kms.c (tests\util) util_open--> xf86drm.c drmOpen
以下函数代码均在 xf86drm.c中:
//此处的参数名字,即为modetest -M name的M参数值
drm_public int drmOpen(const char *name, const char *busid)
{
return drmOpenWithType(name, busid, DRM_NODE_PRIMARY);
}
此函数继续调用下面接口
static int drmOpenByName(const char *name, int type)
{
int i;
int fd;
drmVersionPtr version;
char * id;
int base = drmGetMinorBase(type);
if (base < 0)
return -1;
/*
* Open the first minor number that matches the driver name and isn't
* already in use. If it's in use it will have a busid assigned already.
*/
for (i = base; i < base + DRM_MAX_MINOR; i++) {
if ((fd = drmOpenMinor(i, 1, type)) >= 0) { //此处打开设备
if ((version = drmGetVersion(fd))) {
if (!strcmp(version->name, name)) { //此处用从驱动获取的名字和-M 传递进来的名字进行比较
drmFreeVersion(version);
id = drmGetBusid(fd);
drmMsg("drmGetBusid returned '%s'\n", id ? id : "NULL");
if (!id || !*id) { //如果没有获取到ID,则走此流程
if (id)
drmFreeBusid(id);
return fd;
} else {
drmFreeBusid(id);
}
} else {
drmFreeVersion(version);
}
}
close(fd);
}
}
GetBusid的实现 ,通过 DRM_IOCTL_GET_UNIQUE 调入到内核中。具体的内核实现待研究。总之,在有应用占据显卡时,此函数返回有效值;否则返回NULL。
drm_public char *drmGetBusid(int fd)
{
drm_unique_t u;
memclear(u);
if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u))
return NULL;
u.unique = drmMalloc(u.unique_len + 1);
if (drmIoctl(fd, DRM_IOCTL_GET_UNIQUE, &u)) {
drmFree(u.unique);
return NULL;
}
u.unique[u.unique_len] = '\0';
return u.unique;
}
modetest是一个用于测试Linux显示硬件的命令行工具,涉及显示器的crtc、encoder、connector等概念。它允许用户查询和设置输出,如显示模式、分辨率等。在使用过程中,可能会遇到权限问题,如'Permission denied',这通常是因为图形界面已占用设备。解决方法包括在字符界面操作或关闭图形管理器。此外,modetest还支持多种图形模式,如TILES、PLAIN、SMPTE和GRADIENT。
6226

被折叠的 条评论
为什么被折叠?



