marco@techie.com
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.
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...
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.
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).
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.
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 ""
}'
(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.