web-dev-qa-db-fra.com

Ligne de commande Ubuntu pour changer la source d'entrée sur un moniteur?

J'ai deux ordinateurs connectés au moniteur Dell U3415W, l'un avec OS Ubuntu 14.04 LTS avec entrée HDMI et l'autre avec Windows 10 avec entrée DP. Ce que je veux faire est de basculer entre ces deux sources d'entrée sans utiliser les boutons de menu à l'écran (OSD). Pour les fenêtres, le gestionnaire d’affichage Dell permet de passer de l’entrée DP à l’entrée HDMI à partir de la ligne de commande. Mais je n’ai trouvé aucun moyen ni outil de contrôle pour passer de l’entrée HDMI à l’entrée DP sur Ubuntu en utilisant la ligne de commande.

J'ai essayé d'installer le gestionnaire d'affichage Dell et le pilote de moniteur (fichiers exe) à l'aide de wine sur Ubuntu, mais cela n'a pas fonctionné. Quelqu'un a-t-il essayé de changer la source d'entrée du moniteur en utilisant la ligne de commande sur Ubuntu?

4
Saurabh Verma

La commande que vous recherchez est ddccontrol, disponible dans le référentiel Ubuntu habituel.

ATTENTION!ddccontrol envoie des données sur le bus i2c, ce qui est par nature une opération dangereuse. La plupart des périphériques i2c sont de très bas niveau et très stupides, une seule commande égarée peut suffire à les brider ou au moins à geler l'ordinateur. Cela dit, la technologie DDC/CI est une technologie quelque peu normalisée, bien établie et relativement ancienne, de sorte que les risques ne sont pas trop élevés.

Pour cette raison, par défaut, les périphériques i2c ne sont accessibles que par root. Vous aurez probablement besoin de préfixer toutes les commandes ci-dessous avec Sudo. (Je ne l'ai volontairement pas fait pour vous assurer de lire les instructions et de ne pas les copier/coller à l'aveuglette.)

Sonder votre moniteur

La première chose à faire est de sonder les différents bus i2c de votre ordinateur (le mien dispose de 11 bus de ce type ...), en recherchant celui qui se trouve réellement sur la carte graphique, connecté à l’écran.

La commande ddccontrol -p le fait et montre ce qu’elle a trouvé. Exemple de sortie de mon ordinateur:

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

Notez l'avertissement d'E/S: cela signifie simplement que votre moniteur est inconnu de ddccontrol; il ne connaît donc pas la description de toutes les commandes et valeurs non standard qu'il peut prendre en charge. Cela ne vous empêche pas d'émettre les commandes, mais il peut s'agir d'un processus d'essais et d'erreurs.

Notez également le nom du bus détecté: dev:/dev/i2c-4 dans mon exemple.

Lister toutes les commandes

La commande ddccontrol -d dev:/dev/i2c-4 lit tous les contrôles possibles (de 0x00 à 0xff) et affiche les valeurs trouvées. Bien sûr, vous devriez utiliser le bus trouvé lors de la vérification.

ddccontrol affiche également une description des contrôles et des valeurs qui lui sont connus. soit les standards, soit ceux décrits dans les fichiers XML. Dans mon exemple, il n'y a pas de fichier XML pour mon moniteur (voir l'avertissement d'E/S ci-dessus).

Interroger une valeur

ddccontrol -r 0x10 dev:/dev/i2c-4 interroge la valeur actuelle du contrôle 0x10. Exemple de sortie:

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

La valeur actuelle est le nombre au milieu, 21 dans mon exemple. La valeur qui suit est supposée être la valeur maximale, mais cela ne semble fonctionner que pour les valeurs à plage (telles que la luminosité et le contraste), pas tellement pour les éléments de la liste.

Définir une valeur

ddccontrol -r 0x10 -w 25 dev:/dev/i2c-4 définit la valeur du contrôle 0x10. Exemple de sortie:

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

Notez que vous pouvez définir des valeurs au format hexadécimal ou décimal. Dans mon exemple, j'ai utilisé décimal.

Changer la source d'entrée du moniteur

J'ai trouvé la commande et les valeurs à utiliser pour permuter les entrées de mon moniteur. Cela fonctionne bien, vous devrez bien sûr expérimenter pour trouver les valeurs de votre moniteur. Le mien est un Dell UltraSharp U2515H.

Control 0x60 [Sélection de la source d'entrée]

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

Les valeurs sont dans le même ordre que le menu Source d'entrée du moniteur.

Par exemple, basculement vers DP: ddccontrol -r 0x60 -w 15 dev:/dev/i2c-4

6
Adrien Beau

En plus d'Adrien Beau répondre.

Changer la source d'entrée du moniteur

La commande de source d'entrée de modification standard est 0x60. Donc, vous voulez utiliser une telle commande:

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

Détermination des valeurs à transmettre à surveiller

Mais comment savoir quelles valeurs sont responsables de quelle source d'entrée? Je ne sais pas si les fournisseurs fournissent de telles informations, mais j'ai trouvé un moyen de le savoir sans demander au vendeur.

Il suffit de lire la valeur actuelle de la commande 0x60 (en utilisant Sudo ddccontrol -r 0x60 dev:/dev/i2c-X). Il va retourner quelque chose comme ça:

Cas où votre moniteur est dans la base de données ddccontrol

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

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

Cas où votre moniteur n'est pas dans la base de données 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]

Supposons que votre moniteur ne soit pas dans la base de données ddccontrol. Notez cette valeur 4369 . C'est une valeur que vous utiliserez pour rétablir l'état actuel du moniteur via un câble avec lequel vous êtes actuellement en train de parler. Notez que cette valeur sera différente lorsque vous utiliserez un autre câble de transport (je veux dire le port que vous utilisez pour parler au moniteur, par exemple via vga et via hdmi, les valeurs seront différentes même pour une même source d’entrée).

Désactivez maintenant la sélection automatique de la source d'entrée à l'aide du menu osd du moniteur, car nous ne le voulons pas pour l'instant. Maintenant, changez la source d'entrée à l'aide du menu osd de votre moniteur, puis lisez la valeur actuelle. Pour cet exemple, j'ai changé le moniteur pour utiliser la source vga (la source provient d'un autre ordinateur), tout en parlant de surveiller via HDMI en utilisant le premier ordinateur. La valeur renvoyée est 4353. Faites la même chose pour toutes les entrées que vous prévoyez d'utiliser commutation.

Ok, alors maintenant vous connaissez les valeurs du moniteur dans différents états sources. Vous pouvez maintenant changer de source d’entrée pour moniteur en utilisant:

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

Les valeurs sont présentées en décimal, mais vous pouvez utiliser des valeurs hexadécimales comme ceci:

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

Ajout de votre moniteur à la base de données ddccontrol

Maintenant, vous voulez que votre moniteur soit dans ddccontrol-db. Vous devez explorer les valeurs de toutes les fonctions de votre moniteur et les valeurs appliquées à quel état. Ensuite, vous devriez créer un fichier XML décrivant toutes ces valeurs. Notez qu'il y aura plusieurs fichiers xml, en raison de différents ports, utilisez un identifiant Plug-and-Play différent pour votre moniteur. Par exemple, pour mon moniteur Dell P2217H, je vais créer deux fichiers: DELA0D7.xml (cet identifiant est utilisé lors de la connexion via vga) et DELA0D9.xml (cet identifiant est utilisé lors de la connexion via HDMI). Dell P2217H a un vga, un hdmi et un displayport. Comme je n'ai pas de périphérique d'affichage, je ne peux pas explorer DELA0D8.xml (cet identifiant est utilisé lors de la connexion via displayport).

Vous trouverez une description des paramètres xml sur la page Monitor Database Structure (fichier: ///usr/share/doc/ddccontrol/html/apes02.html).
Les capacités (majuscules) et les identifiants Plug and Play peuvent être reçus avec
Sudo ddccontrol -c dev:/dev/i2c-X.
Lorsque vous êtes prêt, contribuez à https://github.com/ddccontrol/ddccontrol-db .

Détecter le moniteur par numéro de série

Supposons que vous avez connecté plusieurs moniteurs du même modèle à un seul ordinateur. Ensuite, vous devez différencier les moniteurs en quelque sorte. À cette fin, j'ai créé un script qui détermine le numéro de bus i2c par numéro de série du moniteur. Je le fais en utilisant
Sudo get-edid -b $X 2>/dev/null | grep $TARGET_SERIAL
Voir mon référentiel pour plus de détails: https://github.com/Ashark/Ashark-bin/blob/master/i2c-bus-by-monitor-serial

Script final pour la liaison au clavier

Maintenant, voyez ce script: https://github.com/Ashark/Ashark-bin/blob/master/switch-monitor-source Vous pouvez l'utiliser comme suit:

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

Vous pouvez maintenant lier les deux dernières commandes au raccourci clavier et les utiliser pour un changement rapide. Incroyable!

1
Ashark