Mini-HOWTO Linux de XFree vers XInside

par Marco Melgazzi, marco@techie.com
Traducteur: S�bastien Blondeel ( sebastien.blondeel@lifl.fr)

version 1.3 / septembre 1997
Comment convertir une ligne de mode vid�o XFree86 en ligne de mode vid�o XInside/XiGraphics

1. Introduction

Au printemps 1996, j'ai lu dans comp.os.linux.x (groupe de discussion consacr� � la partie graphique du syst�me d'exploitation Linux) beaucoup d'articles demandant comment convertir les modes vid�o entre XFree86 et une de ses alternatives commerciales: XInside (d�sormais appel� XiGraphics, mais vous remarquerez que dans ce document j'utiliserai l'ancien nom de produit, puisque je me r�f�re principalement � cette version-l�).

J'avais d�j� �valu� le produit auparavant et j'avais encore sur mon disque dur cette version d'�valuation: comme j'aime r�soudre des probl�mes, j'ai d�cid� de m'y mettre et, apr�s quelques heures de t�tonnements et de calculs, j'ai r�dig� un article cens� �tre int�ressant, qui fut rapidement post�.

Les discussions parlant de la conversion prirent subitement fin et j'ai re�u 1 (un) courrier �lectronique me remerciant pour l'article de telle sorte que, puisque quelqu'un d'autre risque de se poser ces questions � l'avenir, j'ai d�cid� de transformer cet article en ce mini HOWTO.

Mettons tout de suite les choses au clair: je ne travaille PAS pour XInside et je n'ai eu acc�s qu'� leur version d'�valuation 1.2 pour Linux. Je sais que maintenant (en mai 1997) AccelX a atteint le num�ro de version 3.1, mais je pense que l'information contenue dans ce document est toujours utilisable, au prix peut-�tre de quelques modifications mineures.

Puisque ce HOWTO a �t� mis au point � l'aide d'une version de XInside assez vieille, il se peut que certaines donn�es pr�sent�es ici ne soient pas tout � fait exactes. Comme vous le lirez plus loin, gr�ce � l'av�nement de XFree 3.2, je n'ai pas achet� ce serveur commercial. Aussi, si vous l'avez achet�, et que vous remarquez des erreurs, veuillez prendre le temps de me les communiquer par courrier �lectronique.

Attention, bidouiller les r�glages d'un moniteur est assez dangereux et, pour cette raison, je ne garantis rien du tout. Si cela fonctionne pour votre ordinateur, tant mieux. Si vous le faites exploser, ne m'en tenez pas pour responsable.

2. En ai-je vraiment besoin?

Je ne comprends absolument pas le choix de XInside de ne pas proposer d'utilitaire pour r�gler vos modes vid�o (comme xvidtune) et/ou pour importer vos modes vid�o de XFree dans la version d'�valuation (qui est, pour autant que je sache, commerciale). J'ai pass� environ trois heures � mettre tout ceci au point (indice: j'ai compar� l'entr�e concernant le VESA 1024x768 � 70Hz dans les deux formats (et je suis presque ing�nieur en �lectronique ;-)) alors qu'un programmeur de chez XInside aurait pu �crire un article comparatif en bien moins de temps...

Je n'ai pas t�l�charg� les versions d'�valuation � partir de la 1.3 et j'esp�re vraiment qu'ils ont r�gl� cela. Et si c'est le cas, on peut penser que ce mini HOWTO est devenu inutile mais puisque vous le lisez, esp�rons qu'il vous aidera � mieux comprendre comment tout cela fonctionne...

3. Allons-y

Supposons que vous ayez votre mode XFree86 bien aim� et que vous vouliez �valuer XInside dans les m�mes conditions: suivez les �tapes pr�sent�es ci-dessous et vous devriez pouvoir le faire; nous allons utiliser � titre d'exemple v�cu mon mode vid�o par d�faut et je vais vous expliquer ce que vous devrez faire pour le convertir.

Une entr�e de XFree86 ressemble � ceci:

Modeline "blabla" DOTCLK  A B C D  a b c d

Chacun des nombres de A � D et de a � d a une signification pr�cise: si vous le voulez, vous pouvez faire des recherches dans le "Guide du Rootard pour les modes vid�o sous X386/XFree86" (/usr/lib/X11/doc/VideoModes.doc) mais vous n'avez pas besoin de conna�tre toute la th�orie sous-jacente pour r�aliser une conversion couronn�e de succ�s...

Mon entr�e dans /usr/lib/X11/XF86Config est:

Modeline "1168x876" 105  1168 1256 1544 1640  876 877 891 900
                     |     |    |    |    |    |   |   |   |
                  DOT_CLK  A    B    C    D    a   b   c   d

Sous XInside, il vous faut ajouter une entr�e dans le fichier Xtimings, qui devrait se trouver dans etc/ (� partir de maintenant, nous supposerons que vous vous trouvez dans le r�pertoire racine de Xaccel, qui devrait �tre quelque chose comme /usr/X11/lib/X11/AcceleratedX).

!    Quelque part dans le fichier, mettez ici le nom d�sir�

[MODE_PR�AJUST�]
    NomDuModePr�ajust� = "1168x876 @ 72Hz";

!
!    Les quatre lignes suivantes sont �videntes... pour qui parle anglais
!
    HorPixel          = 1168;         // pixels
    VerPixel          = 876;          // lignes
    PixelWidthRatio   = 4;            // taux de largeur des pixels
    PixelHeightRatio  = 3;            // taux de hauteur des pixels

!
!   hsync: DOT_CLK / D * 1000 [KHz]
!
!   hsync = 105 / 1640 * 1000 = 64.024 KHz
!
!   vsync: ( 1 / (( D / DOT_CLK ) * d) ) * 1,000,000 [Hz]
!
!   vsync: ( 1 / (( 1640 / 105 ) * 900) ) * 1,000,000
!           ( 1 / 14057.1428571 ) * 1,000,000 = 71.138 Hz
!

    HorFrequency      = 64.180;        // kHz
    VerFrequency      = 71.138;        // Hz

!   Type de balayage

    ScanType          = NONINTERLACED;

!
!   Mettez ici les options de XFree86 +/-hsync et +/-vsync
!
    HorSyncPolarity   = POSITIVE;
    VerSyncPolarity   = POSITIVE;

!   Cela ne devrait pas changer

    CharacterWidth    = 8;             // largeur des caract�res, en pixels

!   ici, c'est DOT_CLK

    PixelClock        = 105.000;       // MHz
!
!
!   section des r�glages horizontaux: [usec, ou microsecondes]
!
    HorTotalTime  = D / DOT_CLK                  = 15.619;
    HorAddrTime   = A / DOT_CLK                  = 11.124;
    HorBlankStart = A / DOT_CLK                  = 11.124;
    HorBlankTime  = HorTotalTime - HorBlankStart =  4.495;
    HorSyncStart  = B / DOT_CLK                  = 11.962;
    HorSyncTime   = C / DOT_CLK - HorSyncStart   =  2.743;

 !
 !  section des r�glages verticaux:    [msec, ou millisecondes]
 !

    VerTotalTime  = ( HorTotalTime * d ) / 1000  = 14.057;
    VerAddrTime   = ( HorTotalTime * a ) / 1000  = 13.682;
    VerBlankStart = ( HorTotalTime * a ) / 1000  = 13.682;
    VerBlankTime  = VerTotalTime - VerBlankStart =  0.375;
    VerSyncStart  = ( HorTotalTime * b ) / 1000  = 13.698;
    VerSyncTime   = ( HorTotalTime * ( c - b ) ) / 1000
                                                 = 0.219

 ! C'est tout !

Il vous faut maintenant positionner ce mode vid�o nouvellement cr�� dans les fichiers indiqu�s dans la section suivante, au bon endroit.

4. Mettre les choses au point

Dans les extraits ci-dessous, le signe -> vous indique ce qui a �t� modifi�: ne l'incluez PAS dans vos fichiers!

Entr�e du moniteur (la mienne est monitors/mfreq/mfreq64.vda)

    [MODES_�TABLIS]
        "640x480 @ 60Hz",
        "640x480 @ 72Hz",
        "640x480 @ 75Hz",
        "800x600 @ 56Hz",
        "800x600 @ 60Hz",
        "800x600 @ 72Hz",
        "800x600 @ 75Hz",
        "1024x768 Interlaced",
        "1024x768 @ 60Hz",
        "1024x768 @ 70Hz",
        "1024x768 @ 75Hz",
    "1152x900 Interlaced",
        "1152x900 @ 60Hz",
        "1152x900 @ 67Hz",
->      "1168x876 @ 72Hz",
        "1280x1024 Interlaced",
        "1280x1024 @ 60Hz",
    "1600x1200 Interlaced";

Dans le fichier d'informations propre � la carte (la mienne est (boards/s3/764-2.xqa, je me demande pourquoi ils ont presque toutes les cartes Hercules sauf la mienne: Terminator 64/Dram).

    [VISUEL]
    BitsPerPixel   = 8;
    MemoryModel    = Packed;
    ColorModel     = Indexed;
    BitsRGB        = 6;
    NumberOfColors = 256;

    [R�SOLUTIONS]
    640x480,
    800x600,
    1024x768,
->  1168x876,
    1152x900,
    1280x1024

    [BUREAUX]
    640x480,
    800x600,
    1024x768,
    1152x900,
->  1168x876,
    1280x1024,
    1600x1200

Si la carte le permet (ce qui n'est PAS le cas pour ma carte) vous pouvez m�me mettre cette entr�e dans les sections 16bpp et 32bpp (bpp: bit par pixel).

Le fichier etc/Xaccel.ini ressemblera � ce qui suit:

--------------------------------------------------------------
    Board   = "s3/764-2.xqa";
    Monitor = "mfreq/mfreq64.vda";
    Depth   = 8;
->  Desktop = 1168x876;

    [R�SOLUTIONS]
->      1168x876,
        1024x768;

L'entr�e du mode correspondant pour XInside dans etc/Xtimings:

--------------------------------------------------------------
[MODE_PR�AJUST�]
    NomDuModePr�ajust� = "1168x876 @ 72Hz";

    HorPixel          = 1168;          // pixels
    VerPixel          = 876;           // lignes
    PixelWidthRatio   = 4;
    PixelHeightRatio  = 3;
    HorFrequency      = 64.024;        // kHz
    VerFrequency      = 71.138;        // Hz
    ScanType          = NONINTERLACED;
    HorSyncPolarity   = POSITIVE;
    VerSyncPolarity   = POSITIVE;
    CharacterWidth    = 8;             // pixels
    PixelClock        = 105.000;       // MHz
    HorTotalTime      = 15.619;        // (usec) =  205 caract�res
    HorAddrTime       = 11.124;        // (usec) =  146 caract�res
    HorBlankStart     = 11.124;        // (usec) =  146 caract�res
    HorBlankTime      =  4.495;        // (usec) =   59 caract�res
    HorSyncStart      = 11.962;        // (usec) =  157 caract�res
    HorSyncTime       =  2.743;        // (usec) =   36 caract�res
    VerTotalTime      = 14.057;        // (msec) =  900 lignes
    VerAddrTime       = 13.682;        // (msec) =  876 lignes
    VerBlankStart     = 13.682;        // (msec) =  876 lignes
    VerBlankTime      =  0.375;        // (msec) =   24 lignes
    VerSyncStart      = 13.698;        // (msec) =  877 lignes
    VerSyncTime       =  0.219;        // (msec) =   14 lignes

Vous pouvez v�rifier votre conversion en lan�ant le programme vgaset sans param�tres alors que le serveur XInside tourne: cela produira une ligne � la XFree et, si tout s'est bien pass�, cette ligne sera la m�me que celle de laquelle vous �tiez parti (sauf si b et c sont �gaux, je n'ai pas r�ussi � reproduire cette situation dans XInside: le meilleur cas qui s'est produit �tant c=b+1).

5. La fin...

C'est tout pour cette fois-ci ! J'esp�re que cela vous sera utile. Je ne pense pas acheter le serveur XiGraphics dans un futur proche pour une raison simple: la sortie de XFree86 3.2 a r�solu tous les probl�mes de vitesse que je rencontrais avec mon humble carte vid�o Trio 64 ;)

Il semble toutefois que le serveur XiGraphics reconna�t un ensemble de puces et de cartes vid�o bien plus large que XFree, aussi est-il possible que l' "alternative commerciale" soit la seule disponible pour vous. Si c'est le cas, et si vous avez achet� le serveur XiGraphics, j'aimerais vraiment avoir de vos nouvelles afin de savoir si l'information pr�sent�e ici vous a �t� utile, si vous l'avez trouv�e trop compliqu�e, ou quoi que ce soit.

6. Rendre le processus automatique

Le petit script qui suit automatise la plupart du travail. Faites tr�s attention au ScanType (type de balayage) et aux deux lignes Polarity (polarit�): le script ne les positionne pas et, si vous avez la paresse de ne pas les corriger, les risques d'endommager votre moniteur augmentent en fl�che.

Remarquez que je ne sais pas si le drapeau "Doublescan" (balayage double) a une signification quelconque dans XInside: si vous tentez de convertir un mode de double balayage de faible r�solution FAITES ATTENTION, vous pouvez assez facilement casser votre moniteur puisque le taux de rafra�chissement que vous obtenez sera doubl� (en fait mon 400x300 � 72Hz est devenu un 400x300 � 144Hz!).

#!/bin/sh
##########################################################################
# XF2XInside
#
# Ce script convertit les lignes de mode vid�o du format XF86Config au
# format XInside pour remplir les besoins du fichier etc/Xtimings.
#
# C'est une bidouille vite programm�e, n'en attendez pas des v�rifications
# d'erreurs fines (et ne parlons pas de l'interface utilisateur).
#
# Si vous l'appelez sans argument, il devrait vous dire quoi faire.
#
#                               (juillet 1996, hcz@tazlwurm.bb.bawue.de)
#
# Au fait: Les nouveaux modes cr��s comme expliqu�s dans ce HOWTO
# fonctionnent, mais n'apparaissent pas dans le menu de Xsetup. Quelqu'un
# sait-il pourquoi ?
#
##########################################################################
#----------------------------------------------- On y va:
# Modifiez ceci si votre fichier de lignes de modes vid�o est ailleurs:
XF=/usr/X11/lib/X11/XF86Config
if [ $# -ne 1 ] ; then
  echo "utilisation: ${0##*/} <mode>"
  echo " exemple: ${0##*/} 1024x764"
  echo -e " r�le: convertit une entr�e de ligne de mode vid�o de $XF au\nformat XInside (stdout, ou la sortie standard)"
  exit 1
fi
egrep -i "^[\t ]*modeline.+\"$1\""  /usr/X11/lib/X11/XF86Config |
gawk '
NF < 11  { print "! mauvaise ligne:\n! " $0 "\n!"; next }
{
  print "//", $0  ":"
  name = $2
  DOT_CLK = $3;
  A = $4;
  B = $5;
  C = $6;
  D = $7;
  a = $8;
  b = $9;
  c = $10;
  d = $11;
  VerFrequency =  1000000 / ((D / DOT_CLK) * d)
  print "[MODE_PR�AJUST�]"
  printf "  NomDuModePr�ajust� = \"%dx%d @ %.0dHz\";\n", A, a, VerFrequency
  print "  HorPixel\t\t= " A ";"
  print "  VerPixel\t\t= " a ";"
  print "  PixelWidthRatio\t= 4;\n  PixelHeightRatio\t= 3;"
  print "  HorFrequency\t\t= " DOT_CLK / D * 1000 ";\t// kHz"
  print "  VerFrequency\t\t= " VerFrequency  ";\t// Hz"
  print "  ScanType\t\t= NONINTERLACED;\t\t// *V�RIFIEZ*"
  print "  HorSyncPolarity\t= NEGATIVE;\t\t\t// *V�RIFIEZ*"
  print "  VerSyncPolarity\t= NEGATIVE;\t\t\t// *V�RIFIEZ*"
  print "  CharacterWidth\t= 8;"
  print "  PixelClock\t\t= " DOT_CLK ";"
  HorTotalTime = D / DOT_CLK
  print "  HorTotalTime\t\t= " HorTotalTime ";"
  print "  HorAddrTime \t\t= " A / DOT_CLK ";"
  print "  HorBlankStart\t\t= " A / DOT_CLK ";"
  print "  HorBlankTime\t\t= " D / DOT_CLK - A / DOT_CLK ";"
  print "  HorSyncStart\t\t= " B / DOT_CLK ";"
  print "  HorSyncTime\t\t= " C / DOT_CLK - B / DOT_CLK ";"
  VerTotalTime  = ( HorTotalTime * d ) / 1000
  print "  VerTotalTime\t\t= " VerTotalTime ";"
  print "  VerAddrTime\t\t= " ( HorTotalTime * a ) / 1000 ";"
  VerBlankStart = ( HorTotalTime * a ) / 1000
  print "  VerBlankStart\t\t= " VerBlankStart ";"
  print "  VerBlankTime\t\t= " VerTotalTime - VerBlankStart ";"
  print "  VerSyncStart\t\t= " ( HorTotalTime * b ) / 1000 ";"
  print "  VerSyncTime\t\t= " ( HorTotalTime * ( c - b ) ) / 1000
  print ""
}'

7. Merci �

8. Copyright/point de vue l�gal

(c)opyright 1996-7 par Marco Melgazzi (marco@techie.com) - couvert par la GPL (licence publique de GNU). Pour obtenir une copie de cette licence, �crivez � la Fondation pour un Logiciel Libre, � l'adresse: Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

Les marques d�pos�es appartiennent � leurs propri�taires. Aucune garantie ne couvre la justesse ou l'utilit� de l'information que vous trouverez dans ce document.