Ubuntu 命令行如何更改显示器上的输入源?

Ubuntu 命令行如何更改显示器上的输入源?

我有两台电脑连接到戴尔 U3415W 显示器,一台装有带 HDMI 输入的 ubuntu 14.04 LTS 操作系统,另一台装有带 DP 输入的 Windows 10 操作系统。我想要做的是在不使用屏幕菜单按钮 (OSD) 的情况下在这两个输入源之间切换。对于 Windows,有戴尔显示管理器,它可以通过命令行从 DP 输入切换到 HDMI 输入。但我找不到任何方法或显示器工具来使用命令行在 ubuntu 上从 HDMI 输入切换到 DP 输入。

我曾尝试在 ubuntu 上使用 wine 安装戴尔显示管理器和显示器驱动程序(exe 文件),但没有成功。 有人尝试过在 Ubuntu 上使用命令行更改监视器输入源吗?

答案1

您正在寻找的命令是ddccontrol,可从常规 Ubuntu 存储库获取。

警告! ddccontrol通过 i2c 总线发送数据,这本身就是一件危险的事情。大多数 i2c 设备都是非常低级和愚蠢的,一个错误的命令就足以让它们变砖或至少让计算机死机。话虽如此,DDC/CI 是一种有点标准化、相当成熟和相当古老的技术,所以风险不是太高。

因此,默认情况下,i2c 设备仅可供 root 访问。您很可能需要在以下所有命令前加上前缀sudo。(我自愿不这样做,以确保您阅读说明,而不是盲目复制/粘贴它们。)

探测你的显示器

首先要做的是探测计算机中的各种 i2c 总线(我的计算机有 11 个这样的总线......),寻找实际位于显卡上并连接到屏幕的总线。

ddccontrol -p命令执行此操作并显示其发现的内容。我的计算机的示例输出:

Detected monitors :
 - Device: dev:/dev/i2c-4
   DDC/CI supported: Yes
   Monitor Name: VESA standard monitor
   Input type: Digital
  (Automatically selected)
Reading EDID and initializing DDC/CI at bus dev:/dev/i2c-4...
I/O warning : failed to load external entity "/usr/share/ddccontrol-db/monitor/DELD070.xml"
Document not parsed successfully.

EDID readings:
        Plug and Play ID: DELD070 [VESA standard monitor]
        Input type: Digital

请注意 I/O 警告:它仅表示您的监视器对 来说是未知的ddccontrol,因此它不知道它可能支持的所有非标准命令和值的描述。这并不会阻止您发出命令,但这可能是一个反复试验的过程。

dev:/dev/i2c-4还请注意在我的示例中检测到的总线名称: 。

列出所有命令

ddccontrol -d dev:/dev/i2c-4命令读取所有可能的控件(从 0x00 到 0xff)并显示找到的值。当然,您应该在探测时使用找到的总线。

ddccontrol还显示了它所知道的控件和值的描述;可以是标准的,也可以是 XML 文件中描述的。在我的示例中,我的显示器没有 XML 文件(请参阅上面的 I/O 警告)。

查询值

查询ddccontrol -r 0x10 dev:/dev/i2c-40x10 控件的当前值。示例输出:

Reading 0x10...
Control 0x10: +/21/100 C [Brightness]

当前值是中间的数字,在我的示例中是 21。后面的值应该是最大值,但这似乎只适用于范围值(例如亮度和对比度),而不适用于列表项。

设置值

设置ddccontrol -r 0x10 -w 25 dev:/dev/i2c-40x10 控件的值。示例输出:

Writing 0x10, 0x19(25)...
Control 0x10: +/25/100 C [Brightness]

请注意,您可以以十六进制或十进制格式设置值。在我的示例中,我使用了十进制。

更改显示器输入源

我找到了用于切换显示器输入的命令和值。它运行良好,当然,您需要进行实验才能找到适合您的显示器的值。我的是 Dell UltraSharp U2515H。

控制 0x60 [输入源选择]

  • 值 15:DP
  • 值 16:mDP
  • 值 17:HDMI (MHL) 1
  • 值 18:HDMI (MHL) 2

这些值的顺序与显示器中的输入源菜单的顺序相同。

例如切换到DP:ddccontrol -r 0x60 -w 15 dev:/dev/i2c-4

答案2

ddccontrol 运行良好,但十多年来(2006 年)一直不受支持。这意味着每次使用它时,您都会收到一个闪烁的大红色警告,提示您的显示器不在数据库中。

有一款较新的实用程序 ddcutil,它与较新的显示器配合使用效果更好,因为它会询问显示器本身以获取其 VCP 功能代码。它还适用于非 pci 计算机,如 Raspberry-Pi,但有一些注意事项。

以下是比较: https://www.ddcutil.com/ddccontrol/

例如,我现在使用 ddcutil 创建了三个 shell 别名,以使用以下命令切换我的 DELL 显示器的输入:

ddcutil -b 6 setvcp 0x60 0x1b: 美国广播公司

ddcutil -b 6 setvcp 0x60 0x11:HDMI

ddcutil -b 6 setvcp 0x60 0x0f:显示端口

答案3

除了 Adrien Beau 的回答。

更改显示器输入源

标准更改输入源命令是 0x60。因此,您需要使用这样的命令:

ddccontrol -r 0x60 -w $some_value dev:/dev/i2c-X

确定要传递给监视器的值

但是你如何知道哪些值负责哪个输入源?我不知道供应商是否提供此类信息,但我找到了一种无需询问供应商即可知道的方法。

只需读取 0x60 命令的当前值(使用sudo ddccontrol -r 0x60 dev:/dev/i2c-X)。它将返回类似以下内容:

当您的监视器位于 ddccontrol 数据库中时

EDID readings:
        Plug and Play ID: DELA0D7 [DELL P2217H (VGA)]
        Input type: Analog

Reading 0x60...
Control 0x60: +/257/4626 C [Input Source Select]

当您的显示器不在 ddccontrol 数据库中时的情况

EDID readings:
        Plug and Play ID: DELA0D9 [VESA standard monitor]
        Input type: Digital
=============================== WARNING ===============================
There is no support for your monitor in the database, but ddccontrol is
using a basic generic profile. Many controls will not be supported, and
some controls may not work as expected.
Please update ddccontrol-db, or, if you are already using the latest
version, please send the output of the following command to
[email protected]:

LANG= LC_ALL= ddccontrol -p -c -d

Thank you.
=============================== WARNING ===============================

Reading 0x60...
Control 0x60: +/4369/4626 C [Input Source Select]

假设您的显示器不在 ddccontrol 数据库中。请注意4369值。这是您将用来通过您当前与显示器通信的电缆将显示器切换回当前状态的值。请注意,当您使用另一条传输电缆时,此值将有所不同(我的意思是您用于与显示器通信的端口,例如通过 vga 和通过 hdmi 的值将不同,即使对于相同的输入源也是如此)。

现在,禁用使用显示器的 OSD 菜单自动选择输入源,因为我们暂时不需要它。现在使用显示器的 OSD 菜单切换输入源,然后读取当前值。在这个例子中,我切换显示器以使用 VGA 源(源来自另一台计算机),同时仍然使用第一台计算机通过 HDMI 与显示器通话,返回值为 4353。对您计划用于切换的所有输入执行相同操作。

好的,现在您知道了不同源状态下显示器的值。现在您可以使用以下方式切换显示器的输入源:

sudo ddccontrol -r 0x60 -w 4353 dev:/dev/i2c-X # switch to vga input using hdmi cable on Dell P2217H
sudo ddccontrol -r 0x60 -w 4369 dev:/dev/i2c-X # switch to hdmi input using hdmi cable on Dell P2217H

值以十进制表示,但您可以使用十六进制值,如下所示:

sudo ddccontrol -r 0x60 -w 0x1101 dev:/dev/i2c-X # 0x1101 is 4353
sudo ddccontrol -r 0x60 -w 0x1111 dev:/dev/i2c-X # 0x1111 is 4369

将您的显示器添加到 ddccontrol 数据库

现在您希望您的显示器位于 ddccontrol-db 中。您需要探索显示器所有功能的值以及哪些值应用于哪个状态。然后您应该创建描述所有这些值的 xml 文件。注意,由于不同的端口使用不同的显示器即插即用 ID,因此将有多个 xml 文件。例如,对于我的 DELL P2217H 显示器,我将创建两个文件:DELA0D7.xml(通过 vga 连接时使用此 ID)和 DELA0D9.xml(通过 hdmi 连接时使用此 ID)。Dell P2217H 有一个 vga、一个 hdmi 和一个显示端口。因为我没有显示端口设备,所以我无法探索创建 DELA0D8.xml(通过显示端口连接时使用此 ID)。

可以在监控数据库结构页面 (file:///usr/share/doc/ddccontrol/html/apes02.html) 找到一些 xml 参数的描述。
可以使用 接收功能 (caps) 和即插即用 ID
sudo ddccontrol -c dev:/dev/i2c-X
当您准备好时,请贡献https://github.com/ddccontrol/ddccontrol-db存储库。

通过序列号检测显示器

假设您已将同一型号的多个显示器连接到一台计算机。然后您需要以某种方式区分显示器。为此,我创建了一个脚本,该脚本通过显示器序列号确定 i2c 总线号。我使用以下方法执行此操作:
sudo get-edid -b $X 2>/dev/null | grep $TARGET_SERIAL
查看我的存储库了解更多详细信息:https://github.com/Ashark/Ashark-bin/blob/master/i2c-bus-by-monitor-serial

键盘绑定的最终脚本

现在,看看这个脚本:https://github.com/Ashark/Ashark-bin/blob/master/switch-monitor-source 您可以按如下方式使用它:

switch-monitor-source -s 0G2TG7360DXB -u # get and cache i2c-id number for monitor with specified s/n
switch-monitor-source -s 0G2TG7360DXB -v # switch that monitor to vga input
switch-monitor-source -s 0G2TG7360DXB -h # switch that monitor to hdmi input

现在,您可以将最后两个命令绑定到键盘快捷键并使用它们进行快速切换。太棒了!

相关内容