#This file was created by <jdd> Fri Nov 12 18:19:03 1999
#LyX 1.0 (C) 1995-1999 Matthias Ettrich and the LyX Team
\lyxformat 2.15
\textclass linuxdoc
\language default
\inputencoding default
\fontscheme default
\graphics default
\paperfontsize 10
\spacing single 
\papersize Default
\paperpackage a4
\use_geometry 0
\use_amsmath 0
\paperorientation portrait
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\defskip medskip
\quotes_language english
\quotes_times 2
\papercolumns 1
\papersides 1
\paperpagestyle default

\layout Title
\added_space_top vfill \added_space_bottom vfill 
Frame Buffer
\layout Author

Jean-Daniel Dodin
\newline 
jdanield@linux-france.org
\newline 
http://perso.club-internet.fr/jdanield 
\layout Date

V 2.0 Novembre 1999
\layout 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.
\layout Standard


\begin_inset LatexCommand \tableofcontents{}

\end_inset 


\layout Section

Préliminaire
\layout Standard

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
\protected_separator 
!
\layout Standard

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.
\layout Standard

Il est donc souhaitable de vérifier la compatibilité de votre carte.
 Ce n'est pas si facile.
\layout Standard

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.
\layout Standard

Peut-être tout simplement votre carte l'affiche-t-elle quand vous allumez
 votre ordinateur.
\layout Standard

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.
\layout Section

Sources
\layout Standard

On commence à trouver pas mal d'informations sur le Frame Buffer.
 J'ai utilisé principalement deux documents
\protected_separator 
:
\layout Standard

Le mini HOWTO Vesafb, sans doute à 
\begin_inset LatexCommand \url[mini-HOWTO]{http://www.freenix.org/unix/linux/HOWTO-vo/mini/Vesafb}

\end_inset 

 (en anglais).
\layout Standard

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
\protected_separator 
:
\layout Standard


\begin_inset LatexCommand \url[banshee]{http://www.uno.edu./~adamico/banshee}

\end_inset 


\layout Standard


\begin_inset LatexCommand \url[ragefury]{http://ruff.cs.jmu.edu/~beetle/ragefury.htm}

\end_inset 


\layout Standard


\begin_inset LatexCommand \url[ragefury2]{http://www.0wned.org/~cain/ragefury.htm}

\end_inset 


\layout Standard

Dans la documentation du noyau, vous avez également des fichiers dans file:/usr/
src/linux-2.2.7/Documentation/fb.
\layout Standard

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)
\layout Standard

vous pouvez aussi regarder dans les fichiers man, pour
\protected_separator 
: bootparam, vidmode, fbset, fb.modes, XF86_FBDev (ou XF68...)
\layout Standard

Bien sur il y a beaucoup d'anglais, mais pour jouer au plus fin avec linux,
 un peu d'anglais est indispensable.
\layout Standard

Avec ça vous devriez vous y retrouver.
\layout Section

Qu'est-ce que le Frame Buffer
\layout Standard

C'est une possibilité très répandue des cartes vidéo, depuis plusieurs années,
 appelé dans le monde windows 
\begin_inset Quotes eld
\end_inset 

mode Vesa 2
\begin_inset Quotes erd
\end_inset 

.
 Il permet d'utiliser les cartes sans pilote spécifique au prix d'une (légère)
 pénalité en vitesse.
\layout Standard

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.
\layout Standard

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.
\layout Standard

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...
\layout Section

Mise en oeuvre
\layout Subsection

Le noyau
\layout Standard

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
\protected_separator 
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é.
\layout Standard

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).
\layout Standard

Validez d'abord dans Code Maturity Level le Prompt for...
 (la seule option du menu).
\layout Standard

Dans 
\begin_inset Quotes eld
\end_inset 

console drivers
\begin_inset Quotes erd
\end_inset 

, validez 
\layout Itemize

VGA text console
\layout Itemize

Video mode selection support
\layout Itemize

Support for frame buffer device (experimental)
\layout Itemize

Vesa VGA graphic console
\layout Itemize

si vous avez une carte matrox, il vous faudra peut-être cocher le support
 de cette carte (pas essayé)
\layout Standard

Ensuite il est possible qu'il soir nécessaire de valider ce qui suit, mais
 je n'en suis pas sur.
\layout Itemize

Advanced low level drivers option, puis
\begin_deeper 
\layout Itemize

monochrome support
\layout Itemize

2, 4, 8, 16, 24, 32 bpp packed pixel support
\layout Itemize

VGA character/attribute support
\end_deeper 
\layout Standard

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/bzI
mage et copiez-le par exemple dans /boot/vmlinuz-fb.
\layout Standard

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 
\begin_inset Quotes eld
\end_inset 

fb
\begin_inset Quotes erd
\end_inset 

).
\layout Standard

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é).
\layout Standard


\emph on 
Chaque fois que vous modifiez lilo.conf, dès que la modification est enregistrée,
 il faut exécuter 
\begin_inset Quotes eld
\end_inset 

lilo
\begin_inset Quotes erd
\end_inset 

 (sans option) pour valider les changements.
\layout Standard

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).
\layout Section

le frame buffer lui-même
\layout Standard

Ben oui, il faut un device...
\layout Standard

Faites
\protected_separator 
:
\layout Standard

mknod /dev/fb0 c 29 0 # 0 est le chiffre zéro
\layout Standard

ln -s /dev/fb0 /dev/fb0current # pas sur que ce soit nécessaire.
\layout Subsection

La console
\layout Standard

Vous avez donc modifié /etc/lilo.conf.
 Vous allez à nouveau le modifier et ajouter l'option 
\begin_inset Quotes eld
\end_inset 

vga=ask
\begin_inset Quotes erd
\end_inset 

 dans votre configuration fb.
 Vous devez avoir un truc du genre
\protected_separator 
:
\layout Code

image = /boot/vmlinuz_fb
\layout Code

label = fb
\layout Code

root = /dev/hda3 # adaptez à votre partition
\layout Code

vga = ask
\layout Standard

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), 
\emph on 
ne pas s'occuper de l'aide affichée
\emph default 
 qui ne s'applique pas (!) et taper le code à essayer 
\emph on 
en hexadécimal
\emph default 
.
 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 
\emph on 
valeur décimale
\emph default 
 de ce code.
\layout Standard

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
\protected_separator 
:
\layout Standard

nombre de couleurs, 640x480, 800x600,1024x768, 1280x1024, 1600x1200
\layout Standard

256 (8 bits), 301 (769), 303 (771), 305 (773), 307 (775), 31c (796)
\layout Standard

32768 (15 bits), 310 (784), 313 (787), 316 (790), 319 (793), 31d (797)
\layout Standard

65536 (16 bits), 311 (785), 314 (788), 317 (791), 31a (794), 31e (798)
\layout Standard

16.8 M (24 bits), 312 (786), 315 (789), 318 (792), 31b (795), 31f (799)
\layout Standard

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).
\layout Standard

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 
\begin_inset Quotes eld
\end_inset 

ask
\begin_inset Quotes erd
\end_inset 

.
\layout Standard

C'est tout pour le mode console.
 Il est indispensable de faire cette configuration pour pouvoir utiliser
 le mode graphique.
\layout Standard

Si vous avez installé l'utilitaire 
\begin_inset Quotes eld
\end_inset 

fbset
\begin_inset Quotes erd
\end_inset 

 (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.
\layout Subsection

Mode graphique
\layout Subsubsection

Serveur
\layout Standard

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).
\layout Standard

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.
\layout Standard

DONC venez dans /usr/X11R6/bin et effacez le lien X par rm X, tout simplement.
 Faites ensuite
\protected_separator 
:
\layout Standard

ln -s /usr/X11R6/bin/XF86_FBDev /usr/X11R6/bin/X
\layout Standard

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.
\layout Subsubsection

XF86Config
\layout Standard

La configuration de XF86Config est assez délicate.
 Si vous n'avez pas encore ce fichier, je vous conseille la chose suivante
\protected_separator 
: lancez xf86config (l'utilitaire de configuration le plus rustique) et
 configurez pour une carte quelconque, mais avec le bon moniteur, souris,
 etc.
\layout Standard

Ensuite, remplacez dans XF86Config la section Screen par l'exemple suivant.
 Vous pouvez aussi 
\emph on 
ajouter
\emph default 
 cette section dans un fichier XF86Config déjà configuré, ça ne devrait
 pas poser de problème.
 Section à ajouter
\protected_separator 
:
\layout Code

Section 
\begin_inset Quotes eld
\end_inset 

Screen
\begin_inset Quotes erd
\end_inset 


\layout Code

Driver 
\begin_inset Quotes eld
\end_inset 

FBDev
\begin_inset Quotes erd
\end_inset 

 # ligne essentielle
\layout Code

Device 
\begin_inset Quotes eld
\end_inset 

ma carte
\begin_inset Quotes erd
\end_inset 

 # le nom de votre carte vidéo, définie dans la section 
\begin_inset Quotes eld
\end_inset 

Device
\begin_inset Quotes erd
\end_inset 

.
 
\layout Code

En fait peu importe quel nom vous donnez, pourvu que ce soit le même dans
 les deux sections
\layout Code

Monitor 
\begin_inset Quotes eld
\end_inset 

Mon moniteur
\begin_inset Quotes erd
\end_inset 

 # le nom défini dans la section 
\begin_inset Quotes eld
\end_inset 

Monitor
\begin_inset Quotes erd
\end_inset 


\layout Code

SubSection 
\begin_inset Quotes eld
\end_inset 

Display
\begin_inset Quotes erd
\end_inset 


\layout Code

Modes 
\begin_inset Quotes eld
\end_inset 

default
\begin_inset Quotes erd
\end_inset 

 # le premier d de default doit être en minuscule
\layout Code

EndSubSection
\layout Code

EndSection
\layout Standard

Sauvegardez, startx et ça doit marcher
\protected_separator 
!
\layout Section

Conclusion
\layout Standard

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).
\layout Standard

Comme je ne l'ai pas sur mon appareil perso (tous mes appareils sont en
 vesa 1
\protected_separator 
!), je ne peux pas vérifier ce que je suis en train d'écrire.
 En cas de problème, écrivez-moi.
\the_end
