Page suivante - Page précédente - Table des matières

15. Gestion de la mémoire vidéo avec plusieurs écrans

Cette partie du document a été fournie gracieusement par Frederick A. Niles qui conserve tous ses droits sur les informations données.

15.1 Introduction

Les quelques pages qui suivent sont censées permettre une première prise en main des configurations à deux écrans sous Linux. Bien que le processus se déroule naturellement, les occasions de se tromper ne manquent pas.

Je me suis focalisé sur la mise en place d'un serveur X sur un second moniteur. L'intérêt en est que l'on croise de temps à autre des personnes se débarrassant de vieux moniteurs de 19 ou 20 pouces à fréquence fixe car ils ne peuvent plus s'en servir. On peut ainsi démarrer avec un petit moniteur multisync et disposer de X sur un moniteur de grandes dimensions.

Comme il s'agit d'un domaine en plein développement, l'information évolue rapidement. Le contenu de ce document pourrait très bien être dépassé, voire complètement faux, lorsque vous le lirez.

** ATTENTION ** Ce texte a été rédigé avant la sortie de la version 4.0 de la XFree86 qui devrait modifier pas mal de choses. Essayez d'obtenir une nouvelle version de ce document si elle existe.

15.2 Retour

Le retour de la part des utilisateurs sera plus que certainement le bienvenu. Sans vos remarques et vos questions, ce document n'existerait pas. N'hésitez donc pas à me contacter à l'adresse suivante : Frederick.A.Niles@gsfc.nasa.gov.

15.3 Contributions

Les personnes suivantes ont participé à l'élaboration de ce Mini-HOWTO :

  • Petr Vandrovec vandrove@vc.cvut.cz
  • Andreas Ehliar ehliar@lysator.liu.se (x2x)
  • Marco Bizzarri m.bizzarri@icube.it (multiple X servers)

15.4 Avertissements

L'auteur de ce document dégage toute responsabilité quant à son contenu. Vous employez les notions, exemples et tout ce qui figure ici à vos risques et périls. S'agissant d'une nouvelle version de ce document, des informations erronées ou inadéquates peuvent très bien entraîner la dégradation de votre matériel. Faîtes-y attention et, bien que ce soit hautement improbable, je me décharge de toute responsabilité à cet égard.

15.5 Propriété du document

Copyright (c) 1999 Frederick Niles

La distribution de ce document doit se conformer aux termes de la licence LDP tels que définis à l'adresse : sunsite.unc.edu/LDP/COPYRIGHT.html>.

15.6 Matériel supporté

La plupart des cartes vidéos supposent qu'elles assument seules cette fonction au sein du système. Elles occupent donc en permanence l'espace d'adressage de l'adaptateur graphique primaire. Il existe quelques exceptions :

  • les cartes Matrox : Matrox Millennium, Matrox Millennium II, Matrox Mystique, Matrox Mystique 220, Matrox Productiva G100, Matrox Mystique G200, Matrox Millennium G200, Matrox Marvel G200.
  • MDA : il s'agit essentiellement des cartes graphiques monochromes Hercules. Évidemment, on ne dispose que du mode texte.
Remarque : seul le second adaptateur graphique doit figurer dans la liste précédente.

15.7 Logiciels commerciaux

Ce Mini-HOWTO traite avant tout de logiciel libre. Certains serveurs X commerciaux sont néanmoins capables de gérer plusieurs moniteurs tels le serveur Metro-X de Metro Link (www.metrolink.com) et Accelerated-X de Xi Graphics (www.xig.com).

15.8 Logiciels nécessaires

Les patches et programmes suivants sont nécessaires :

15.9 Mise en route

Commencez par patcher votre version du noyau avec le patche "fbaddon". Ensuite, vous configurerez le noyau et activerez la gestion de la mémoire vidéo. Si vous disposez de cartes Matrox, incluez le pilote d'accélération unifié Matrox. Excluez le gestionnaire de mémoire vidéo VESA. Activez bien sûr la gestion de plusieurs adaptateurs, recompilez le noyau et réinitialisez le système.

A présent, installez l'utilitaire "fbset" et lisez attentivement la documentation relative à son paramètrage. La mise en place d'un fichier "/etc/fb.modes" est vivement recommandé une fois que vous vous serez décidé sur une configuration. Le paquetage fbset comprend un script Perl de conversion du fichier XF86Config en paramètres pour fb.modes. Vous trouverez mon script en shell Bourne dans les annexes A et B.

Vous devez vous mettre au point sur l'emploi du pilote de mémoire vidéo avec un seul adaptateur et bien identifier tout ce qui n'a rien à voir avec la gestion de plusieurs. Vous vous épargnerez ainsi pas mal de noeuds au cerveau. Je me focalise surtout sur la mise en place de X au niveau du second moniteur vu que la plupart des autres opérations de configuration en forment un sous-ensemble.

Déplacement d'une console

Compilez le programme "con2fb". Lancé sans arguments, il fournit le message suivant : "usage: con2fb fbdev console". Une commande telle que "con2fb /dev/fb1 /dev/tty6" attacherait la console virtuelle numéro 6 au second gestionnaire de mémoire vidéo. Ctrl-Alt-F6 vous basculera dans cette console qui s'affichera sur le second moniteur.

"fbset" et le paramètrage du second moniteur

La mise en place des paramètres "fbset" doit se cantonner au moniteur avec lequel "fbset" est employé. Faîtes donc attention à bien employer l'option "-fb" avec le second moniteur. Plus précisément, si vous ne voulez rien faire d'autre qu'accorder la résolution verticale virtuelle avec la résolution verticale réelle : "fbset -fb /dev/fb1 -vyres 600" (par exemple). L'affichage en mode texte en est sérieusement ralenti mais sans cela X reste vraiment hideux.

X et le gestionnaire de mémoire vidéo

Le fichier framebuffer.txt explique bien mieux que je ne puis le faire mais voici les deux points essentiels :

  • vérifiez que le lien "X" pointe bien vers "XF86_FBDev",
  • ajoutez une section Monitor à votre fichier XF86Config pour le gestionnaire de mémoire vidéo.
Par exemple :
# Serveur X s'appuyant sur le gestionnaire de mémoire vidéo.
Section "Screen"
 Driver      "fbdev"
 Device      "Millennium"
 Monitor     "NEC MultiSync 5FGp"
 Subsection "Display"
 Depth       8
 Modes       "default"
 ViewPort    0 0
 EndSubsection
 Subsection "Display"
 Depth       16
 Modes       "default"
 ViewPort    0 0
 EndSubsection
 Subsection "Display"
 Depth       24
 Modes       "default"
 ViewPort    0 0
 EndSubsection
 Subsection "Display"
 Depth       32
 Modes       "default"
 ViewPort    0 0
 EndSubsection
EndSection

Restreignez vous aux modes "default" car je ne pense pas qu'il y en ait d'autres qui fonctionnent avec le pilote de mémoire vidéo Matrox.

Exécution du serveur X sur le second moniteur

Positionnez la variable d'environnement FRAMEBUFFER sur le second périphérique de mémoire vidéo : "export FRAMEBUFFER=/dev/fb1" ou : "setenv FRAMEBUFFER /dev/fb1" X doit être lancé avec des paramètres lui spécifiant à la fois la profondeur souhaitée au niveau des couleurs et un numéro correspondant à la console virtuelle employée. Par exemple : "startx -- :0 -bpp 16 vt06". Le serveur X en 16 bits par pixel d'identifiant ":0" est attaché à la console virtuelle numéro 6. Utilisez ":1" au lancement d'un autre serveur X en le liant à une console dépendant de l'autre gestionnaire de mémoire vidéo et vous disposerez de deux serveurs X fonctionnant simultanément.

15.10 Résumé

Les étapes de mise en place d'un serveur X sur un second moniteur peuvent être ainsi résumées :

  • se procurer le patch du noyau, fbset et con2fb;
  • appliquer le patch, configurer le noyau, recompiler et reinitialiser;
  • ajouter une section XF86_FBDev au fichier XF86Config et fixer le lien de X.
A chaque redémarrage :
  • créer une console : "con2fb /dev/fb1 /dev/tty6";
  • paramétrer : "fbset -fb /dev/fb1 1280x1024";
  • positionner la variable FRAMEBUFFER : "export FRAMEBUFFER=/dev/fb1";
  • lancer X : "startx -- -bpp 16 vt06".
Un alias de shell permet d'automatiser ces tâches. Un script ne conviendrait pas puisqu'on a besoin de déterminer le numéro de la console courante. Voici mon alias (en C-shell) :
alias startxfb = "
setenv FRAMEBUFFER /dev/fb\!*;  # l'argument passe a l'alias est recupere
con2fb $FRAMEBUFFER /dev/$tty;  # positionne le pilote sur la console courante
fbset -fb $FRAMEBUFFER 1280x1024@62;  # Cf /etc/fb.modes
startx -- :\!* -bpp 16 vt0`echo $tty | cut -dy f 2`' # execution de X
"

Ces lignes correspondent au contenu de mon .cshrc aux commentaires près mais ils aident, avec les sauts de ligne, à en faciliter la lecture. Je fournis le numéro du pilote de mémoire vidéo comme argument à l'alias.

Si quelqu'un me fournit un équivalent pour bash, je l'incluerai ici. La commande tty vous fournira le nom de la console courante.

15.11 Remarques et problèmes

  • fbset et startx DOIVENT être invoqués depuis une même console qui sera contrôlée par le pilote de mémoire vidéo. L'automatisation au moyen de scripts en est diminuée d'autant.
  • la version 4.0 de la XFree86 gérera correctement les adaptateurs multiples mais la 3.3.1 en est encore incapable. Vous pouvez cependant disposer de deux serveurs avec la 3.3.1 et passer de l'un à l'autre avec x2x.
  • Le pilote de mémoire vidéo non-actif conserve la dernière image sans la mettre à jour.
  • L'écran qui n'est pas sélectionné ne conserve pas toujours son état durant ses périodes d'inactivité (mais en général il le fait). Geert Uytterhoeven, qui assure l'évolution du pilote de mémoire vidéo, et Linus Torvalds sont en désaccord sur les changements pour la gestion des adaptateurs multiples liés aux consoles (i.e. fbaddon) et ceux ci pourraient très bien ne jamais se retrouver dans l'arborescence officielle du noyau (cette information a une forte composante de type bruit de couloir).
  • Si vous exécutez X de n'importe où, votre machine peut se retrouver dans un état passablement dégradé qui mélange les évènements de la souris et ceux du clavier.
  • Le fichier framebuffer.txt dans l'arborescence du noyau mentionne la possibilité de modifier les paramètres Modeline du XF86Config alors que X fonctionne. Le gestionnaire de mémoire vidéo Matrox semble obliger le serveur X à tous les ignorer. On ne dispose donc que d'un paramètrage, celui qui est employé lors du basculement depuis le mode texte.
  • XF86_FBDev ne dispose pas d'accélération. Des patches pour les cartes Matrox existent : http://www.in-berlin.de/User/kraxel/xfree86/>

Fonctionnement avec xdm

Je n'ai pas encore trouvé comment passer au niveau 5 dans une configuration à deux adaptateurs avec un serveur sur le second moniteur ou sur les deux. Bien que l'ajout d'une ligne au fichier Xservers de xdm/gdm soit aisé, la contrainte de démarrer le serveur X depuis la console gérée par le pilote de mémoire vidéo interdit cette solution. Si quelqu'un a une idée, qu'il m'en fasse part afin que je puisse l'ajouter.

L'utilitaire x2x

x2x vous permet de passer d'un serveur X à l'autre lorsque vous atteignez le bord d'un écran. Aux dernières nouvelles, ce programme se trouvait à l'adresse suivante : http://ftp.digital.com/pub/DEC/SRC/x2x/>. La distribution Debian en propose un paquetage. Je n'ai pas eu l'occasion de l'essayer mais plusieurs utilisateurs ont fait part d'expériences réussies.

Autres commandes utiles

Il est bon de garder présente à l'esprit l'existence de certaines commandes quand on dispose de plusieurs adaptateurs (surtout quand on écrit des scripts). * "chvt" permet de passer d'une console virtuelle (VT) à une autre. * "openvt" exécute un programme dans une console différente. * "tty" renvoie le nom de la console courante.

Annexe A. Script cvtmode.m pour Octave

Notez le positionnement de bpp.

#!/usr/bin/octave -q
bpp = 16;
DCF = sscanf(argv(1,:), "%f");
HR  = sscanf(argv(2,:), "%f");
SH1 = sscanf(argv(3,:), "%f");
SH2 = sscanf(argv(4,:), "%f");
HFL = sscanf(argv(5,:), "%f");
VR  = sscanf(argv(6,:), "%f");
SV1 = sscanf(argv(7,:), "%f");
SV2 = sscanf(argv(8,:), "%f");
VFL = sscanf(argv(9,:), "%f");
pixclock = 1000000 / DCF;
left_margin = HFL - SH2;
right_margin = SH1 - HR;
hsync_len = SH2 - SH1;
# 3) vertical timings:
upper_margin = VFL - SV2;
lower_margin = SV1 - VR;
vsync_len = SV2 - SV1;
RR = DCF / (HFL * VFL) *1e6;
HSF = DCF / HFL * 1e3;
printf("mode \"%dx%d\"\n",HR,VR);
printf("   # D: %3.2f MHz, H: %3.2f kHz, V: %2.2f Hz\n", DCF, HSF, RR);
printf("   geometry %d %d %d %d %d\n", HR, VR, HR, VR, bpp);
printf("   timings %d %d %d %d %d %d %d\n", ...
 pixclock, left_margin, right_margin, ...
 upper_margin, lower_margin, ...
 hsync_len, vsync_len);
printf("endmode\n");

Annexe B. Script "cvtfile" en Shell Bourne

Le script Octave "cvtmode" est utilisé.

#!/bin/sh
# Shell script to convert XF86Config file to fb.modes file.
# Uses octave script cvtmode.m
if [ -z $1 ]; then
 FILE=/etc/X11/XF86Config
else
 FILE=$1
fi
i=1
LEN=`grep Modeline $FILE | wc -l`
while expr $i \< $LEN> /dev/null ;
do
 CURLINE=`grep Modeline $FILE | cut -d'"' -f 3-20 | head -$i | tail -1 `
 ./cvtmode.m $CURLINE
 echo " "
 i=`expr $i + 1`
done


Page suivante - Page précédente - Table des matières