Linha de comando do Ubuntu para alterar a fonte de entrada em um monitor de exibição?

3

Eu tenho dois PCs conectados ao monitor Dell U3415W, um com o Ubuntu 14.04 LTS OS com entrada HDMI e outro com o Windows 10 com entrada DP. O que eu quero fazer é alternar entre essas duas fontes de entrada sem usar os botões do menu na tela (OSD). Para windows, existe um gerenciador de exibição Dell que faz a comutação da entrada DP para HDMI da linha de comando. Mas eu não consegui encontrar nenhuma maneira ou ferramenta de monitor para mudar de HDMI para entrada DP no Ubuntu usando a linha de comando.

Eu tentei instalar o dell display manager e monitorar o driver (arquivos exe) usando wine no Ubuntu, mas não deu certo. Alguém já tentou alterar a fonte de entrada do monitor usando a linha de comando no Ubuntu?

    
por Saurabh Verma 15.12.2016 / 03:45

2 respostas

4

O comando que você está procurando é ddccontrol , disponível no repositório regular do Ubuntu.

AVISO! ddccontrol envia dados pelo barramento i2c, o que é inerentemente perigoso fazer. A maioria dos dispositivos i2c são de nível muito baixo e muito burros, um comando fora de lugar pode ser suficiente para bloqueá-los ou pelo menos congelar o computador. Dito isto, o DDC / CI é uma tecnologia um pouco padronizada, bastante estabelecida e bastante antiga, portanto os riscos não são muito altos.

Por esse motivo, por padrão, os dispositivos i2c são acessíveis apenas para o root. Você provavelmente precisará prefixar todos os comandos abaixo com sudo . (Eu não fiz isso voluntariamente para garantir que você leia as instruções e não as copie / cole cegamente).

Pesquisando seu monitor

A primeira coisa a fazer é investigar os vários barramentos i2c em seu computador (o meu tem 11 barramentos ...), procurando pelo que está realmente na placa gráfica, conectado à tela.

O comando ddccontrol -p faz isso e mostra o que encontrou. Exemplo de saída do meu computador:

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

Observe o aviso de E / S: significa apenas que seu monitor é desconhecido para ddccontrol , portanto, ele não sabe a descrição de todos os comandos e valores não padrão que ele pode suportar. Isso não impede que você emita os comandos, mas isso pode ser um processo de avaliações e erros.

Observe também o nome do barramento detectado: dev:/dev/i2c-4 no meu exemplo.

Listando todos os comandos

O comando ddccontrol -d dev:/dev/i2c-4 lê todos os controles possíveis (de 0x00 a 0xff) e mostra os valores encontrados. Claro, você deve usar o ônibus encontrado quando sondar.

ddccontrol também mostra uma descrição para os controles e valores que são conhecidos; padrões ou aqueles descritos em arquivos XML. No meu exemplo, não há arquivo XML para o meu monitor (veja o aviso de I / O acima).

Consultando um valor

O ddccontrol -r 0x10 dev:/dev/i2c-4 consulta o valor atual do controle 0x10. Exemplo de saída:

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

O valor atual é o número no meio, 21 no meu exemplo. O valor depois disso é suposto ser o máximo, mas isso parece funcionar apenas para valores de intervalo (como brilho e contraste), não tanto para itens de lista.

Definindo um valor

O ddccontrol -r 0x10 -w 25 dev:/dev/i2c-4 define o valor do controle 0x10. Exemplo de saída:

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

Observe que você pode definir valores em formatos hexadecimais ou decimais. No meu exemplo, usei decimal.

Alterando a fonte de entrada do monitor

Eu encontrei o comando e os valores para usar para alternar minhas entradas de monitor. Funciona bem, você precisará, é claro, experimentar para encontrar os valores para o seu monitor. O meu é um Dell UltraSharp U2515H.

Controle 0x60 [Seleção da Fonte de Entrada]

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

Os valores estão na mesma ordem que o menu Fonte de entrada no monitor.

Por exemplo, alternando para DP: ddccontrol -r 0x60 -w 15 dev:/dev/i2c-4

    
por Adrien Beau 15.12.2016 / 21:41
1

Além da resposta de Adrien Beau.

Alterando a fonte de entrada do monitor

O comando de origem de entrada de alteração padrão é 0x60. Então você quer usar tal comando:

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

Determinando valores para passar para monitorar

Mas como você sabe quais valores são responsáveis por qual fonte de entrada? Não sei se os fornecedores fornecem essas informações, mas encontrei uma maneira de conhecê-las sem perguntar ao fornecedor.

Apenas leia o valor atual do comando 0x60 (usando sudo ddccontrol -r 0x60 dev:/dev/i2c-X ). Ele retornará algo assim:

Caso o seu monitor esteja no banco de dados ddccontrol

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

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

Caso o seu monitor não esteja no banco de dados 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]

Vamos supor que seu monitor não esteja no banco de dados ddccontrol. Observe este valor 4369 . Este é um valor que você usará para mudar o monitor de volta ao estado atual através do cabo que você está atualmente falando para monitorar. Note que este valor será diferente quando você usar outro cabo de transporte (quero dizer, porta que você usa para falar para monitorar, por exemplo, via vga e via valores hdmi será diferente mesmo para a mesma fonte de entrada).

Agora, desabilite a seleção automática da fonte de entrada usando o menu OSD do monitor, porque não queremos isso por enquanto. Agora, mude a fonte de entrada usando o menu OSD do monitor e, em seguida, leia o valor atual. Para este exemplo, eu mudei o monitor para usar a fonte vga (a origem é proveniente de outro computador), enquanto ainda falando para monitorar via HDMI usando o primeiro computador, e o valor retornado é 4353. Faça o mesmo para todas as entradas que você planeja usar para trocar.

Ok, agora você conhece os valores do monitor em diferentes estados de origem. Agora você pode alternar a fonte de entrada para o monitor usando:

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

Os valores são apresentados em decimal, mas você pode usar valores hexadecimais como este:

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

Adicionando seu monitor ao banco de dados ddccontrol

Agora você quer que seu monitor esteja em ddccontrol-db. Você precisa explorar valores para todas as funções do seu monitor e quais valores são aplicados a qual estado. Então você deve criar um arquivo xml descrevendo todos esses valores. Note, haverá vários arquivos xml, devido a diferentes portas usam diferentes plug and play id. Por exemplo, para meu monitor DELL P2217H, vou criar dois arquivos: DELA0D7.xml (esse id é usado ao conectar via vga) e DELA0D9.xml (esse id é usado ao conectar via HDMI). O Dell P2217H tem um vga, um hdmi e um displayport. Como não tenho dispositivos displayport, não posso fazer explorações para criar o DELA0D8.xml (esse id é usado ao conectar-se via displayport).

Alguma descrição dos parâmetros xml pode ser encontrada na página Monitor Database Structure (arquivo: ///usr/share/doc/ddccontrol/html/apes02.html).
Capabilities (caps) e Plug and Play ID podem ser recebido usando sudo ddccontrol -c dev:/dev/i2c-X .
Quando estiver pronto, contribua para o repositório link .

Detectar monitor por número de série

Vamos supor que você tenha conectado vários monitores do mesmo modelo a um único computador. Então você precisa diferenciar monitores de alguma forma. Para este propósito, eu criei um script, que determina o número do barramento i2c pelo número de série do monitor. Eu faço isso usando o sudo get-edid -b $X 2>/dev/null | grep $TARGET_SERIAL
Veja meu repositório para mais detalhes: link

Script final para ligação de teclado

Agora, veja este script: link Você pode usá-lo da seguinte forma:

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

Agora você pode ligar dois últimos comandos ao atalho de teclado e usá-los para uma troca rápida. Incrível!

    
por Ashark 26.02.2018 / 23:02