xrandr 在多台显示器的底座上随机失败并显示“配置 crtc X 失败”

raz*_*azr 7 xorg xrandr graphics

TL;DR:xrandr 在我的系统上随机失败,并xrandr: Configure crtc X failed在我的设置上显示错误消息,其中有两个显示器连接到扩展坞。在我多次打开和关闭单个显示器后,我大部分时间都能正常工作。

我在扩展坞上安装了联想 Thinkpad。两台显示器通过显示端口连接到该扩展坞。这是输出xrandr

razr@notebook [~]
-> % xrandr
Screen 0: minimum 8 x 8, current 7680 x 1440, maximum 32767 x 32767
eDP1 connected 2560x1440+5120+0 (normal left inverted right x axis y axis) 340mm x 190mm
   2880x1620     59.96 +  50.00
   2560x1600     59.97
   2560x1440     59.95*
   2048x1536     60.00
   1920x1440     60.00
   1856x1392     60.01
   1792x1344     60.01
   2048x1152     60.00    59.90    59.91
   1920x1200     59.88    59.95
   1920x1080     59.96    60.00    59.93
   1600x1200     60.00
   1680x1050     59.95    59.88
   1400x1050     59.98
   1600x900      60.00    59.95    59.82
   1280x1024     60.02
   1400x900      59.96    59.88
   1280x960      60.00
   1440x810      60.00
   1368x768      60.00    59.88    59.85
   1280x800      59.81    59.91
   1280x720      59.86    60.00    59.74
   1024x768      60.00
   1024x576      60.00    59.90    59.82
   960x540       60.00    59.63    59.82
   800x600       60.32    56.25
   864x486       60.00    59.92    59.57
   640x480       59.94
   720x405       59.51    60.00    58.99
   640x360       59.84    59.32    60.00
DP1 disconnected (normal left inverted right x axis y axis)
DP2 disconnected (normal left inverted right x axis y axis)
DP2-1 connected 2560x1440+2560+0 (normal left inverted right x axis y axis) 610mm x 350mm
   3840x2160     60.00 +  30.00    29.97
   2560x1440     59.95*
   1920x1080     60.00    59.94
   1680x1050     59.95
   1600x900      60.00
   1280x1024     75.02    60.02
   1440x900      59.89
   1280x800      59.81
   1152x864      75.00
   1280x720      60.00    59.94
   1024x768      75.03    70.07    60.00
   832x624       74.55
   800x600       72.19    75.00    60.32    56.25
   640x480       75.00    72.81    66.67    60.00    59.94
   720x400       70.08
DP2-2 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 610mm x 350mm
   3840x2160     60.00 +  30.00    29.97
   2560x1440     59.95*
   1920x1080     60.00    59.94
   1680x1050     59.95
   1600x900      60.00
   1280x1024     75.02    60.02
   1440x900      59.89
   1280x800      59.81
   1152x864      75.00
   1280x720      60.00    59.94
   1024x768      75.03    70.07    60.00
   832x624       74.55
   800x600       72.19    75.00    60.32    56.25
   640x480       75.00    72.81    66.67    60.00    59.94
   720x400       70.08
DP2-3 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
razr@notebook [~]
-> %
Run Code Online (Sandbox Code Playgroud)

我的系统上没有 xorg.conf。我有一个lightdm在启动时调用的 shell 脚本,它检查这些显示器是否已连接(因此笔记本在扩展坞上),如果是这种情况,则执行以下命令:

xrandr --output eDP1 --mode "1920x1080" --output DP2-1 --mode auto --left-of eDP1 --output DP2-2 --mode auto --primary --left-of DP2-1

否则,它只是将笔记本显示器的模式设置为"1920x1080"

但这根本行不通。我总是收到类似的错误消息xrandr: Configure crtc 1 failed。我认为这个数字会不时变化。

我已经在工作中遇到过类似问题(见我的问题的结尾),所以我知道,在大多数情况下,我可以通过一次又一次地停用和重新激活显示器来解决这个问题。我arandr为此安装了它,因为它使一遍又一遍地执行此操作变得更容易一些。只有一台显示器和笔记本显示器激活它一直工作。哪个监视器处于活动状态并不重要。只有两个显示器(没有笔记本显示器)不起作用。

对于我在家的(新)设置,我无法使其正常工作。我有点让它工作,但只能"2560x1440"在两台显示器上使用模式。这也并非一直有效。有时,我必须再次arandr随机打开和取消/重新激活监视器,以达到其工作状态。直到现在我无法弄清楚那里的任何模式。有时我只是放弃,重新启动我的机器,然后希望它可以正常工作。

如前所述,我在工作时有一个非常相似的设置,在那里我做的基本相同。在工作中,这至少在我在扩展坞上启动我的机器时有效。如果我启动机器,然后将它连接到扩展坞并运行上面的命令,我会得到同样的错误。大多数情况下,在这里随机取消/重新激活监视器也能正常工作。

有谁知道为什么会发生这种情况以及我如何解决这个问题?

Rob*_*mer 9

问题

\n

我怀疑您的系统只有2 个像素时钟可用于驱动您的 3 个显示器。\xc2\xb9

\n

为了证实我的假设,请提供

\n
    \n
  • xrandr --verbose | egrep \'^[^[:space:]]|curr|pref\' | sed -e \'s/(norm.*)//\'当所有显示器都正确时
  • \n
  • 当出现问题时执行相同的命令
  • \n
  • 您尝试更正它的命令和您收到的错误
  • \n
  • 检查这些命令是否引发任何内核输出(中的新行dmesg
  • \n
  • xrandr --listproviders
  • \n
  • echo $XDG_SESSION_TYPE
  • \n
  • loginctl show-session -p Type $(loginctl session-status | head -1 | cut -d\' \' -f1)
  • \n
\n

99% 的人不会遇到这个问题,但如果您使用 USB-C 扩展坞(我认为 USB-C 使用独立时钟),则会出现不同的问题。

\n

我并不完全清楚在连接坞站的情况下重新启动对您有何帮助,但选项并--auto没有xrandr针对节省像素时钟进行优化,但这是可能的。(它只尝试监视器喜欢的内容。)

\n

像素时钟详细信息

\n

像素时钟是您在某些输出中看到的 MHz 数。如果您受到(例如)2 个像素时钟的限制,则所有所需 \xe2\x80\x9cmodelines\xe2\x80\x9d (分辨率 + 刷新率 +甚至更多)的并集必须仅引用最多 2 个不同的频率像素时钟。

\n

设置监视器时,xrandr尝试使用这些模型行中的时钟速率(重新)配置 CRTC(CRT 控制器),并且可能会因以下行的各种原因而失败(数量不同):

\n
xrandr: Configure crtc 1 failed\n
Run Code Online (Sandbox Code Playgroud)\n

失败的原因之一是缺少更多的空闲时钟脉冲发生器。(还有很多其他原因!)

\n

xrandr似乎没有得到问题的详细信息,但在我的系统上,我可以同时看到内核环形缓冲区中显卡驱动程序的错误(dmesg如果您收到以下消息,则消息可能会有所不同:

\n
[drm:radeon_atom_pick_pll [radeon]] *ERROR* unable to allocate a PPLL\n[drm:drm_crtc_helper_set_config [drm_kms_helper]] *ERROR* failed to set mode on [CRTC:44:crtc-1]\n
Run Code Online (Sandbox Code Playgroud)\n

PLL 用于生成时钟周期。

\n

解决方案

\n

使用更少的点时钟频率。在我的回答的其余部分中,我将重点讨论以不同方式处理监视器,最终目标是将数量减少到 1 或 2 个。阅读步骤,理解它们,使用您需要适应您的硬件的步骤。

\n

请注意,如果不使用相同的模型线,则具有相同刷新率的相同分辨率可能仍需要不同的时钟频率。而且:不同的模型行可能使用完全相同的像素频率。

\n
1. 将所有监视器放在一个带有标准模型线的时钟上
\n
1.1. 找到一个好的候选频率
\n
xrandr --verbose | grep MHz | sort --key 3 --numeric-sort --reverse | uniq\n
Run Code Online (Sandbox Code Playgroud)\n

该行显示了按点时钟排序的所有模型行。\xc2\xb3 一种方法是查找经常报告的频率,即使分辨率不同。我的频率为 108.000MHz:

\n
....\n  1600x900 (0x5e) 108.000MHz +HSync +VSync\n  1280x960 (0x10c1) 108.000MHz +HSync +VSync\n  1280x1024 (0x5f) 108.000MHz +HSync +VSync\n  1152x864 (0x6f) 108.000MHz +HSync +VSync\n....\n
Run Code Online (Sandbox Code Playgroud)\n
1.2. 检查候选人是否在所有显示器上可用
\n
xrandr --verbose | egrep \'^[^[:space:]]|108.000MHz\'\n
Run Code Online (Sandbox Code Playgroud)\n

108.000MHz 模型线适用于我的所有显示器:

\n
Screen 0: minimum 320 x 200, current 5520 x 2160, maximum 8192 x 8192\nDisplayPort-0 connected primary 1920x1080+0+1080 (0x184a) normal (normal left inverted right x axis y axis) 509mm x 286mm\n  1280x1024 (0x5f) 108.000MHz +HSync +VSync\n  1280x960 (0x10c1) 108.000MHz +HSync +VSync\n  1152x864 (0x6f) 108.000MHz +HSync +VSync\nHDMI-0 connected 1920x1080+1920+1080 (0x184a) normal (normal left inverted right x axis y axis) 527mm x 296mm\n  1600x900 (0x5e) 108.000MHz +HSync +VSync\n  1280x1024 (0x5f) 108.000MHz +HSync +VSync\nDVI-0 connected 1920x1080+3600+0 (0x5a) normal (normal left inverted right x axis y axis) 477mm x 268mm\n  1280x1024 (0x5f) 108.000MHz +HSync +VSync\n  1280x960 (0x10c1) 108.000MHz +HSync +VSync\n  1152x864 (0x6f) 108.000MHz +HSync +VSync\nDVI-1 connected 1680x1050+1920+0 (0x172a) normal (normal left inverted right x axis y axis) 433mm x 270mm\n  1280x1024 (0x5f) 108.000MHz +HSync +VSync\n  1152x864 (0x6f) 108.000MHz +HSync +VSync\n
Run Code Online (Sandbox Code Playgroud)\n

如果某些显示器没有显示模型线,请检查 1.1 起常见分辨率的其他频率。

\n
1.3. 将所有显示器设置为一个频率
\n

为了好玩,我什至使用了 4 种不同的分辨率,从 1.2 的输出中选择。但首先释放除一个时钟周期生成器之外的所有时钟周期生成器:

\n
xrandr --output DisplayPort-0 --off \\\n       --output DVI-0 --off \\\n       --output DVI-1 --off \\\n       --output HDMI-0 --mode 0x5e\n
Run Code Online (Sandbox Code Playgroud)\n

然后将其他时钟设置为相同:

\n
xrandr --output DVI-1 --mode 0x6f \\\n       --output DVI-0 --mode 0x10c1 \\\n       --output DisplayPort-0 --mode 0x5f\n
Run Code Online (Sandbox Code Playgroud)\n

由于临时使用 3 个不同的时钟,一次全部设置可能会失败。\xe2\x80\x94使用十六进制模式数字(括号中的 1.2. 开始)而不是分辨率名称,因为分辨率名称统一了多个模型行,并且自动操作可能会选择错误一。

\n
2. 将所有显示器设置为所需的分辨率
\n
2.1. 首先设置最具挑战性的
\n

从要求最高的显示器(即所需的最高像素时钟)开始,这几乎总是最高分辨率。检查推荐的模型行(在 中为每个监视器标有 \xe2\x80\x9c+\xe2\x80\x9d xrandr --verbose)。

\n

由于我们现在在单个点时钟上运行所有内容,因此您可以将任何监视器(但只有一个)设置为图形卡可以生成的任何内容。这将利用第二个时钟节拍生成器,我假设您的显卡至少有两个。

\n

通常这就足够了:

\n
xrandr --output W_BIGGEST_MON --auto\n
Run Code Online (Sandbox Code Playgroud)\n
2.2. 设置所有其他显示器
\n

检查其他监视器,看看是否找到带有已在使用的时钟的合适模型线。使用自定义模型行,您绝对应该使用两个时钟,除非您运行一系列完全不喜欢的监视器代!

\n
2.3. 如何创建和使用自定义模型行
\n

您最终可能会遇到这样的情况:您希望在辅助显示器上运行略低于 \xe2\x80\x9cbest\xe2\x80\x9d 显示器的分辨率。模型行可能具有较低的像素时钟,但很容易提高该时钟。这个技巧不能太过分,因为辅助显示器不会接受远远超出其最高分辨率所需的点时钟。

\n

示例:我最好的显示器都是全高清的,运行频率为 148.500MHz,但其中一台稍小,更喜欢 146.250MHz 的模式,如下所示:

\n
xrandr --verbose | egrep \'^[^[:space:]]|current|preferred\'\n
Run Code Online (Sandbox Code Playgroud)\n

输出(缩短):

\n
DisplayPort-0 connected primary 1920x1080+0+1080 (0x5a)\n  1920x1080 (0x5a) 148.500MHz +HSync +VSync *current +preferred\nHDMI-0 connected 1920x1080+1920+1080 (0x5a)\n  1920x1080 (0x5a) 148.500MHz +HSync +VSync *current +preferred\nDVI-0 connected 1920x1080+3600+0 (0x5a)\n  1920x1080 (0x5a) 148.500MHz +HSync +VSync *current +preferred\nDVI-1 connected 1152x864+1920+0 (0x6f)\n  1680x1050 (0x6d) 146.250MHz -HSync +VSync +preferred\n
Run Code Online (Sandbox Code Playgroud)\n

现在我需要一个具有 148.500MHz 点时钟的 1680x1050 模型线。有许多工具可以生成模型行。cvt不好你不能用那个来设置点时钟。但是这个xtiming网站已经足够好了:

\n
    \n
  • 将所有框留空/默认
  • \n
  • 设置所需的可见分辨率(对我来说是 1680 和 1050)
  • \n
  • 将刷新率设置为例如 60(在 50 和 75 之间移动以快速移动点时钟)
  • \n
  • 计算并检查生成的点时钟频率(我得到 154.19MHz)
  • \n
  • 微调水平同步时间(3.8 \xe2\x86\x92 3.7 \xe2\x86\x92 3.4 \xe2\x86\x92 3.35\xc2\xb5s)
  • \n
  • ...并重新计算并检查点时钟 (... ... ... 148.29MHz) 直到接近目标\n
      \n
    • 这个技巧最注重提高(或降低)点时钟,同时使模型行的所有其他方面几乎相同
    • \n
    • 它尽可能透明地改变线路之间的等待时间
    • \n
    • 大多数(全部?)LCD 在这一个(1-7\xc2\xb5s)上非常灵活,如果它们实际上可以处理生成的(更高?)点时钟
    • \n
    • (模型行“名称”点时钟 HDataEnd HSyncStart HSyncStop HFinish VDataEnd VSyncStart VSyncStop VFinish)
    • \n
    • 它改变了 HSyncStart 和 HSyncStop 之间的间隙
    • \n
    \n
  • \n
  • 现在终于将点时钟更改为确切的目标点时钟(148.500)并清除刷新率(这将保持时钟,同时几乎不调整刷新)并计算
  • \n
  • 我明白Modeline "1680x1050@60" 148.50 1680 1712 2208 2240 1050 1071 1081 1103(网页顶部)
  • \n
  • 在下面的命令中,我使用该行的最后 9 个数字(即所有数字)
  • \n
  • xrandr --newmode my-148.5MHz 148.50 1680 1712 2208 2240 1050 1071 1081 1103
  • \n
  • xrandr --addmode DVI-1 my-148.5MHz(根据需要添加显示器)
  • \n
  • xrandr --ouput DVI-1 --mode my-148.5MHz
  • \n
\n

瞧:您的决心和所需的时钟刷新。

\n
\n

\xc2\xb9 在我的系统上,我只有 2 个像素时钟来驱动 4 个显示器。
\n\xc2\xb3 点时钟是像素时钟的同义词

\n


小智 1

尝试将 xrandr 命令拆分为多个命令,如下所示:

xrandr --output eDP1 --mode "1920x1080" 
xrandr --output DP2-1 --mode auto --left-of eDP1 
xrandr --output DP2-2 --mode auto --primary --left-of DP2-1
Run Code Online (Sandbox Code Playgroud)

这是一个解决方法。