<!doctype linuxdoc system>

<!-- LinuxDoc file was created by LyX 1.0 (C) 1995-1999 by <jdd> Fri Nov 12 18:20:18 1999
 -->
 <article>
 <title>
Frame Buffer
 </title>
 <author>
Jean-Daniel Dodin
jdanield@linux-france.org
http://perso.club-internet.fr/jdanield
 
 </author>
 <date>
V 2.0 Novembre 1999
 </date>
 <abstract>
Quelques réflexions sur l'installation du Frame Buffer. Ayant programmé
 une conférence sur ce sujet, je vais essayer de l'expliciter un peu plus que
 prévu initialement.
 </abstract>
 <toc>
 <sect>
Préliminaire
 <p>
Le frame buffer ne fonctionne qu'avec des cartes video compatibles avec
 la norme VESA 2. Compte tenue de l'ancienneté de cette norme, je pensais que
 toutes les cartes actuelles étaient dans ce cas. Grave erreur !
 </p>
 <p>
Donc, si vous voulez utiliser le frame buffer avec une carte datant disons
 d'avant 97, il n'est pas du tout sur que ca marche. Ce n'est pas grave, puisque
 ces cartes sont supportées par Xfree, mais vous n'aurez pas de pinguouin au
 démarrage.
 </p>
 <p>
Il est donc souhaitable de vérifier la compatibilité de votre carte. Ce
 n'est pas si facile.
 </p>
 <p>
J'ai sous la main un utilitaire nommé vesachk que j'ai eu un jour avec
 un jeu video de golf (en 1991, ca ne nous rajeunit pas). MSD, le programme
 de diagnostic de msdos (versions 6, avant windows) donne le renseignement.
 Je présume sans l'avoir vérifié que MFT, le programme de diagnostic de QEMM
 (Quarterdeck) fait de même. Peut-être aussi le system info de windows, mais
 là il y a trop de versions pour que je puisse l'affirmer.
 </p>
 <p>
Peut-être tout simplement votre carte l'affiche-t-elle quand vous allumez
 votre ordinateur.
 </p>
 <p>
Avec Linux, je ne connais pas de moyen d'obtenir ce résultat. Si vous en
 connaissez un, je suis très intéressé, merci.
 </p>
 <sect>
Sources
 <p>
On commence à trouver pas mal d'informations sur le Frame Buffer. J'ai
 utilisé principalement deux documents :
 </p>
 <p>
Le mini HOWTO Vesafb, sans doute à <url url="http://www.freenix.org/unix/linux/HOWTO-vo/mini/Vesafb" name="mini-HOWTO"> (en anglais).
 </p>
 <p>
Un document en français dont je ne suis pas sur d'avoir l'adresse. Il s'appelle
 Frame Buffer et ATI 128. Il donne trois adresses de documents analogue :
 </p>
 <p>
<url url="http://www.uno.edu./~adamico/banshee" name="banshee">
 </p>
 <p>
<url url="http://ruff.cs.jmu.edu/~beetle/ragefury.htm" name="ragefury">
 </p>
 <p>
<url url="http://www.0wned.org/~cain/ragefury.htm" name="ragefury2">
 </p>
 <p>
Dans la documentation du noyau, vous avez également des fichiers dans file:/usr/src/linux-2.2.7/Documentation/fb.
 </p>
 <p>
Vous trouverez aussi des choses intéressantes dans les sources du noyau
 à Documentation/svga.txt et dans l'aide des options du noyau (quand vous sélectionnez
 une option dans make menuconfig, vous avez un menu d'aide)
 </p>
 <p>
vous pouvez aussi regarder dans les fichiers man, pour : bootparam, vidmode,
 fbset, fb.modes, XF86_FBDev (ou XF68...)
 </p>
 <p>
Bien sur il y a beaucoup d'anglais, mais pour jouer au plus fin avec linux,
 un peu d'anglais est indispensable.
 </p>
 <p>
Avec ça vous devriez vous y retrouver.
 </p>
 <sect>
Qu'est-ce que le Frame Buffer
 <p>
C'est une possibilité très répandue des cartes vidéo, depuis plusieurs
 années, appelé dans le monde windows "mode Vesa 2". Il permet d'utiliser les
 cartes sans pilote spécifique au prix d'une (légère) pénalité en vitesse.
 </p>
 <p>
Il est assez délicat à mettre en oeuvre, encore que, quand on connaît le
 truc, ça passe. Il faut un noyau 2.2.x, ce qui, aujourd'hui ne doit plus poser
 de problème.
 </p>
 <p>
Le Frame Buffer est constitué physiquement d'un espace mémoire réservé
 sur votre disque dans l'arborescence /dev. Le noyau se charge de connecter
 cet espace et la mémoire réelle de la carte vidéo.
 </p>
 <p>
Il est inévitable d'installer le fb dès l'initialisation, donc il faudra
 l'utiliser à la fois en mode console et en mode graphique. De plus, pour l'instant
 (Novembre 99), je ne suis pas arrivé à faire varier la définition sous x, bien
 que ce soit théoriquement possible. Donc vous aurez la même définition en mode
 console et en mode graphique. L'avantage c'est que le noyau va vous afficher
 un petit pingouin en haut à gauche de l'écran au démarrage, l'inconvénient
 est que pour les définitions élevées le mode console n'est pas terrible. Bien
 sur, on ne peut pas non plus changer de mode pour grossir l'image. Peut-être
 un jour...
 </p>
 <sect>
Mise en oeuvre
 <sect1>
Le noyau
 <p>
Il faut bien sur que vous ayez installé les sources du noyau et tou ce
 qu'il faut pour la compilation. En tout, ca doit faire pas loin de 100 Mo,
 quand même... Il doit être possible de créer un noyau monolytique (sans modules),
 pour pouvoir le faire passer d'une machine à l'autre, mais je n'ai pas essayé.
 </p>
 <p>
Le noyau (2.2.x minimum) doit être compilé avec des options spéciales qui
 ne figurent généralement pas par défaut. Donc, allez dans /usr/src/linux et
 tapez au choix make menuconfig (mode semigraphique) ou make xconfig (dans un
 xterm, par exemple après su (pour être root)- mais si vous installez le frame
 buffer, vous n'avez sans doute pas x).
 </p>
 <p>
Validez d'abord dans Code Maturity Level le Prompt for... (la seule option
 du menu).
 </p>
 <p>
Dans "console drivers", validez 
 </p>
 <p>
 <itemize>
  <item>
VGA text console
  <item>
Video mode selection support
  <item>
Support for frame buffer device (experimental)
  <item>
Vesa VGA graphic console
  <item>
si vous avez une carte matrox, il vous faudra peut-être cocher le support
 de cette carte (pas essayé)
 </itemize>
</p> <p>
Ensuite il est possible qu'il soir nécessaire de valider ce qui suit, mais
 je n'en suis pas sur.
 </p>
 <p>
 <itemize>
  <item>
Advanced low level drivers option, puis
  <itemize>
   <item>
monochrome support
   <item>
2, 4, 8, 16, 24, 32 bpp packed pixel support
   <item>
VGA character/attribute support
  </itemize>
 </itemize>
</p> <p>
Il faut maintenant compiler le noyau (make dep ; make bzImage ; make modules
 ; make modules_install). Je ne vous conseille PAS de faire make install, ce
 qui aurait pour effet de remplacer votre ancien noyau par le nouveau. Au contraire,
 allez chercher votre noyau dans /usr/src/linux/arch/i386/boot/bzImage et copiez-le
 par exemple dans /boot/vmlinuz-fb.
 </p>
 <p>
Vous n'avez plus qu'à ouvrir le fichier /etc/lilo.conf et recopier les
 3 ou 4 lignes concernant linux en changeant le nom du noyau et le nom de démarrage
 (mettez par exemple "fb").
 </p>
 <p>
Ces options n'empèchent pas le fonctionnement classique, il est donc tout
 à fait possible d'avoir deux options dans lilo pour démarrer avec ou sans le
 fb (pas testé).
 </p>
 <p>
<em>Chaque fois que vous modifiez lilo.conf, dès que la modification est enregistrée,
 il faut exécuter "lilo" (sans option) pour valider les changements.</em>
 </p>
 <p>
Essayez immédiatement pour voir si ce nouveau noyau marche toujours comme
 l'ancien (ça devrait, si les sources étaient bien celles du noyau en cours,
 sinon il faut configurer tout ce qui ne concerne pas le fb et qui dépend de
 votre configuration).
 </p>
 <sect>
le frame buffer lui-même
 <p>
Ben oui, il faut un device...
 </p>
 <p>
Faites :
 </p>
 <p>
mknod /dev/fb0 c 29 0 &num; 0 est le chiffre zéro
 </p>
 <p>
ln -s /dev/fb0 /dev/fb0current &num; pas sur que ce soit nécessaire.
 </p>
 <sect1>
La console
 <p>
Vous avez donc modifié /etc/lilo.conf. Vous allez à nouveau le modifier
 et ajouter l'option "vga=ask" dans votre configuration fb. Vous devez avoir un
 truc du genre :
 </p>
 <p>
 <code>
image = /boot/vmlinuz_fb
label = fb
root = /dev/hda3 &num; adaptez à votre partition
vga = ask
 </code>
</p> <p>
Là, il y a une astuce vicieuse. Quand vous allez démarrer Linux, à la lecture
 de l'option, Lilo va vous demander un code. Il faut répondre d'abord par Entrée
 (la touche retour chariot), <em>ne pas s'occuper de l'aide affichée</em> qui ne s'applique
 pas (!) et taper le code à essayer <em>en hexadécimal</em>. Essayez toutes les valeurs
 qui vous paraissent utiles, chaque carte a ses préférences. Quand vous aurez
 trouvé le bon code, vous remplacerez ask par la <em>valeur décimale</em> de ce code.
 </p>
 <p>
Je ne peux pas taper de tableau en sgml, voici donc les valeurs séparées
 par des virgules. Le code hexa est donné en premier, suivi du code décimal
 entre parenthèses :
 </p>
 <p>
nombre de couleurs, 640x480, 800x600,1024x768, 1280x1024, 1600x1200
 </p>
 <p>
256 (8 bits), 301 (769), 303 (771), 305 (773), 307 (775), 31c (796)
 </p>
 <p>
32768 (15 bits), 310 (784), 313 (787), 316 (790), 319 (793), 31d (797)
 </p>
 <p>
65536 (16 bits), 311 (785), 314 (788), 317 (791), 31a (794), 31e (798)
 </p>
 <p>
16.8 M (24 bits), 312 (786), 315 (789), 318 (792), 31b (795), 31f (799)
 </p>
 <p>
Vous allez voir si ça marche d'abord au fait que vous n'aurez pas de message
 d'erreur, ensuite à l'apparition d'une petite image de tux le pingouin dans
 un coin de l'écran (une vrai image bitmap, pas un dessin ASCII).
 </p>
 <p>
Vous verrez aussi (peut-être) que le fonctionnement de l'écran est curieux.
 Prenez le temps de faire les essais et quand vous aurez trouvé la valeur qui
 vous plaît, mettez cette valeur en décimal (le chiffre entre parenthèses) à
 la place du mot "ask".
 </p>
 <p>
C'est tout pour le mode console. Il est indispensable de faire cette configuration
 pour pouvoir utiliser le mode graphique.
 </p>
 <p>
Si vous avez installé l'utilitaire "fbset" (très petit, donc très facile
 à télécharger), il vous confirmera les paramètres que vous avez mis en place.
 En juillet 99 les options de changement de ces paramètres ne fonctionnaient
 pas.
 </p>
 <sect1>
Mode graphique
 <sect2>
Serveur
 <p>
Il vous faut d'abord trouver un serveur fb adapté à votre version de x.
 Le nom du serveur varie selon les sources, il s'appelle en général XF86_FBDev
 (ou XF68_FBDev), mais le nom peut varier. En fait c'est l'opération la plus
 difficile (trouver le fichier).
 </p>
 <p>
Une fois le fichier trouvé (c'est un petit exécutable), il faut lier X
 à ce fichier. C'est pour l'instant la seule opération qui empêche de pouvoir
 bouter sur l'un ou l'autre système. Si vous bidouillez startx pour en faire
 un startx_fb qui lance directement XF86_FBDev, vous aurez le choix de bouter
 en fb ou en normal. Pour l'instant je ne sais pas le faire, mais ça ne doit
 pas être très difficile.
 </p>
 <p>
DONC venez dans /usr/X11R6/bin et effacez le lien X par rm X, tout simplement.
 Faites ensuite :
 </p>
 <p>
ln -s /usr/X11R6/bin/XF86_FBDev /usr/X11R6/bin/X
 </p>
 <p>
Bien sur, mettez les chemins qui correspondent chez vous s'ils ne sont
 pas comme ci-dessus. Le serveur fb est parfois appelé XF68_FBDev (68 au lieu
 de 86) car il a été initialement développé pour atari ou amiga (je ne sais
 plus). Adaptez à ce que vous avez.
 </p>
 <sect2>
XF86Config
 <p>
La configuration de XF86Config est assez délicate. Si vous n'avez pas encore
 ce fichier, je vous conseille la chose suivante : lancez xf86config (l'utilitaire
 de configuration le plus rustique) et configurez pour une carte quelconque,
 mais avec le bon moniteur, souris, etc.
 </p>
 <p>
Ensuite, remplacez dans XF86Config la section Screen par l'exemple suivant.
 Vous pouvez aussi <em>ajouter</em> cette section dans un fichier XF86Config déjà configuré,
 ça ne devrait pas poser de problème. Section à ajouter :
 </p>
 <p>
 <code>
Section "Screen"
Driver "FBDev" &num; ligne essentielle
Device "ma carte" &num; le nom de votre carte vidéo, définie dans la section "Device". 
En fait peu importe quel nom vous donnez, pourvu que ce soit le même dans les deux sections
Monitor "Mon moniteur" &num; le nom défini dans la section "Monitor"
SubSection "Display"
Modes "default" &num; le premier d de default doit être en minuscule
EndSubSection
EndSection
 </code>
</p> <p>
Sauvegardez, startx et ça doit marcher !
 </p>
 <sect>
Conclusion
 <p>
J'ai installé de cette façon l'appareil de ma mère en Juillet 99 (carte
 s3 trio 3d, connue mais non supportée à cette époque).
 </p>
 <p>
Comme je ne l'ai pas sur mon appareil perso (tous mes appareils sont en
 vesa 1 !), je ne peux pas vérifier ce que je suis en train d'écrire. En cas
 de problème, écrivez-moi.
 </p>


 </article>
