
                    Mini-HOWTO Linux de XFree vers XInside

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

   version 1.3 / septembre 1997
     _________________________________________________________________

   _Comment convertir une ligne de mode vido XFree86 en ligne de mode
   vido XInside/XiGraphics_
     _________________________________________________________________

1. Introduction

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

   J'avais dj valu le produit auparavant et j'avais encore sur mon
   disque dur cette version d'valuation: comme j'aime rsoudre des
   problmes, j'ai dcid de m'y mettre et, aprs quelques heures de
   ttonnements et de calculs, j'ai rdig un article cens tre
   intressant, qui fut rapidement post.

   Les discussions parlant de la conversion prirent subitement fin et
   j'ai reu 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 dcid 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 accs qu' leur version d'valuation 1.2 pour
   Linux. Je sais que maintenant (en mai 1997) AccelX a atteint le numro
   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 donnes prsentes ici ne
   soient pas tout  fait exactes. Comme vous le lirez plus loin, grce 
   l'avnement 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 rglages 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 rgler vos modes vido (comme xvidtune) et/ou pour
   importer vos modes vido 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'entre
   concernant le VESA 1024x768  70Hz dans les deux formats (et je suis
   presque ingnieur en lectronique ;-)) alors qu'un programmeur de chez
   XInside aurait pu crire un article comparatif en bien moins de
   temps...

   Je n'ai pas tlcharg les versions d'valuation  partir de la 1.3 et
   j'espre vraiment qu'ils ont rgl cela. Et si c'est le cas, on peut
   penser que ce mini HOWTO est devenu inutile mais puisque vous le
   lisez, esprons 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 mmes conditions: suivez les tapes
   prsentes ci-dessous et vous devriez pouvoir le faire; nous allons
   utiliser  titre d'exemple vcu mon mode vido par dfaut et je vais
   vous expliquer ce que vous devrez faire pour le convertir.

   Une entre 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 prcise:
   si vous le voulez, vous pouvez faire des recherches dans le "Guide du
   Rootard pour les modes vido sous X386/XFree86"
   (/usr/lib/X11/doc/VideoModes.doc) mais vous n'avez pas besoin de
   connatre toute la thorie sous-jacente pour raliser une conversion
   couronne de succs...

   Mon entre 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 entre dans le fichier
   Xtimings, qui devrait se trouver dans etc/ ( partir de maintenant,
   nous supposerons que vous vous trouvez dans le rpertoire racine de
   Xaccel, qui devrait tre quelque chose comme
   /usr/X11/lib/X11/AcceleratedX).

!    Quelque part dans le fichier, mettez ici le nom dsir

[MODE_PRAJUST]
    NomDuModePrajust = "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 caractres, en pixels

!   ici, c'est DOT_CLK

    PixelClock        = 105.000;       // MHz
!
!
!   section des rglages 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 rglages 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 vido nouvellement cr
   dans les fichiers indiqus 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!

   Entre 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;

    [RSOLUTIONS]
    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 mme mettre cette entre 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;

    [RSOLUTIONS]
->      1168x876,
        1024x768;

   L'entre du mode correspondant pour XInside dans etc/Xtimings:

--------------------------------------------------------------
[MODE_PRAJUST]
    NomDuModePrajust = "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 caractres
    HorAddrTime       = 11.124;        // (usec) =  146 caractres
    HorBlankStart     = 11.124;        // (usec) =  146 caractres
    HorBlankTime      =  4.495;        // (usec) =   59 caractres
    HorSyncStart      = 11.962;        // (usec) =  157 caractres
    HorSyncTime       =  2.743;        // (usec) =   36 caractres
    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 vrifier votre conversion en lanant le programme vgaset
   sans paramtres alors que le serveur XInside tourne: cela produira une
   ligne  la XFree et, si tout s'est bien pass, cette ligne sera la
   mme que celle de laquelle vous tiez parti (sauf si b et c sont
   gaux, je n'ai pas russi  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'espre 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 rsolu tous les
   problmes de vitesse que je rencontrais avec mon humble carte vido
   Trio 64 ;)

   Il semble toutefois que le serveur XiGraphics reconnat un ensemble de
   puces et de cartes vido 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 prsente ici vous a t utile, si vous l'avez
   trouve trop complique, ou quoi que ce soit.

6. Rendre le processus automatique

   Le petit script qui suit automatise la plupart du travail. Faites trs
   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 flche.

   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 rsolution FAITES
   ATTENTION, vous pouvez assez facilement casser votre moniteur puisque
   le taux de rafrachissement 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 vido du format XF86Config au
# format XInside pour remplir les besoins du fichier etc/Xtimings.
#
# C'est une bidouille vite programme, n'en attendez pas des vrifications
# 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 crs comme expliqus 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 vido est ailleurs:
XF=/usr/X11/lib/X11/XF86Config
if [ $# -ne 1 ] ; then
  echo "utilisation: ${0##*/} <mode>"
  echo " exemple: ${0##*/} 1024x764"
  echo -e " rle: convertit une entre de ligne de mode vido 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_PRAJUST]"
  printf "  NomDuModePrajust = \"%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// *VRIFIEZ*"
  print "  HorSyncPolarity\t= NEGATIVE;\t\t\t// *VRIFIEZ*"
  print "  VerSyncPolarity\t= NEGATIVE;\t\t\t// *VRIFIEZ*"
  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 

     * Heike Claudia Zimmerer hcz@tazlwurm.bb.bawue.de pour m'avoir fait
       remarquer une petite contradiction et pour m'avoir envoy un
       script qui automatise une grande partie du travail.
     * Bartosz Maruszewski B.Maruszewski@zsmeie.torun.pl pour avoir
       traduit ce mini HOWTO en polonais et pour m'avoir fait remarquer
       une petite faute de frappe.

8. Copyright/point de vue lgal

   (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 dposes appartiennent  leurs propritaires. Aucune
   garantie ne couvre la justesse ou l'utilit de l'information que vous
   trouverez dans ce document.
