xrandr 在具有多个显示器的扩展坞上随机失败,并显示“配置 crtc X 失败”

xrandr 在具有多个显示器的扩展坞上随机失败,并显示“配置 crtc X 失败”

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

我在扩展坞上安装了 Lenovo 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 [~]
-> %

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

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随机打开和停用/重新激活监视器才能达到其工作状态。直到现在我还无法弄清楚其中的任何模式。有时我只是放弃,重新启动我的机器并希望它之后能正常工作。

正如已经说过的,我在工作中有一个非常相似的设置,我的工作基本上是相同的。在工作中,至少当我在扩展坞上启动机器时,这是有效的。如果我启动机器,然后将其连接到扩展坞并运行上面的命令,我会收到相同的错误。这里的随机停用/重新激活监视器大多数时候也有效。

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

答案1

问题

我怀疑你的系统有只有 2 个像素时钟它可以使用驱动您的 3 台显示器。

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

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

99%的你都没有问题,但是如果您使用 USB-C 扩展坞,则使用不同的扩展坞(我认为USB-C使用独立时钟)。

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

像素时钟详细信息

像素时钟是您在某些输出中看到的 MHz 数。如果您受到(例如)2 个像素时钟的限制,则所有所需“模型线”(分辨率 + 刷新率 +) 最多只能引用像素时钟的 2 个不同频率。

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

xrandr: Configure crtc 1 failed

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

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

[drm:radeon_atom_pick_pll [radeon]] *ERROR* unable to allocate a PPLL
[drm:drm_crtc_helper_set_config [drm_kms_helper]] *ERROR* failed to set mode on [CRTC:44:crtc-1]

PLL 用于生成时钟周期。

解决方案

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

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

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

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

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

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

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

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

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

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

xrandr --output DisplayPort-0 --off \
       --output DVI-0 --off \
       --output DVI-1 --off \
       --output HDMI-0 --mode 0x5e

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

xrandr --output DVI-1 --mode 0x6f \
       --output DVI-0 --mode 0x10c1 \
       --output DisplayPort-0 --mode 0x5f

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

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

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

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

通常这就足够了:

xrandr --output W_BIGGEST_MON --auto
2.2.设置所有其他显示器

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

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

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

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

xrandr --verbose | egrep '^[^[:space:]]|current|preferred'

输出(缩短):

DisplayPort-0 connected primary 1920x1080+0+1080 (0x5a)
  1920x1080 (0x5a) 148.500MHz +HSync +VSync *current +preferred
HDMI-0 connected 1920x1080+1920+1080 (0x5a)
  1920x1080 (0x5a) 148.500MHz +HSync +VSync *current +preferred
DVI-0 connected 1920x1080+3600+0 (0x5a)
  1920x1080 (0x5a) 148.500MHz +HSync +VSync *current +preferred
DVI-1 connected 1152x864+1920+0 (0x6f)
  1680x1050 (0x6d) 146.250MHz -HSync +VSync +preferred

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

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

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


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

答案2

我的联想坞站也有同样的问题:当我将我的(正在运行的)笔记本电脑连接到它时,我无法通过一个xrandr命令同时启用两个外部显示器并禁用笔记本电脑显示器。它给出了相同的xrandr: Configure crtc 1 failed信息。

但我所做的不是随机停用/重新激活监视器,而是将其分为两个步骤,类似于 Niklas:

  1. 启用第一个外部显示器并禁用笔记本电脑显示器
  2. 启用第二个外部显示器

这对我来说是可重复的,但我也对正确的解决方案感兴趣!

答案3

如果您使用 arandr,尼克拉斯的回答为我指出了一个解决方案。您可能会发现(就像我一样),当您拔下扩展坞时,arandr 将仅显示主显示器(在本例中是我的笔记本电脑)。不过,xrandr 仍然会检测到您的其他两个显示器,因此您只需右键单击 GUI 的背景并打开两个显示器的“激活”即可重新激活其他两个显示器。

但是,如果您对两台显示器都执行此操作,您将收到 razr 提到的错误。只需一次激活每个监视器 - 通过单击激活之间的复选标记按钮 - 你应该很好:)

编辑:

似乎还找到了一种万无一失的方法来做到这一点,而无需通过 arandr 工作。激活第一个监视器:

xrandr --output DP2-1 --auto

然后,如果您像我一样,如果您尝试激活第二个监视器,它将不起作用(您仍然会收到提到的错误 razr):

xrandr --output DP2-2 --auto

相反,只需运行您保存的 arandr 脚本即可。这是针对我的情况:

./dual_monitor_home.sh

它自动检测到第二个屏幕并起作用了!

答案4

我的解决方案是在笔记本电脑仍在坞站上时暂停/睡眠笔记本电脑并将其唤醒,然后它就像魅力一样再次工作。

相关内容