Pour qui :Ce tuto s'adresse aux gens qui cherchent à comprendre un peu plus comment fonctionne l'affichage en 15kHz sur un ordinateur, et à ceux qui souhaiteraient customiser leur système d'exploitation pour avoir une utilisation particulière de leurs émulateurs.
Pour les autres :Et je pense directement à ceux que la compilation de noyau rebute, ou pour qui le tuto se passerait mal (interruption inexpliquée de la compilation…) je vous propose de télécharger le linux que j'ai compilé et testé sur
Debian Wheezy et sur
Ubuntu 12.04LTShttp://makotoworkshop.org/packages/linux-image-3.2.32-patched15khz_i386.debPour l'installer, suffit d'utiliser dpkg avec les droits root ou via un sudo :
dpkg -i linux-image-3.2.32-patched15khz_i386.deb
Notes :- Quand je dis «Linux» je parle bien entendu du noyau (kernel) et non de la distribution GNU/Linux (debian, Ubuntu, RedHat…)
- L'image iso «GroovyArcade Linux»
http://code.google.com/p/groovyarcade/ fournie par l'équipe de
Calamity comporte déjà un Linux Patché, utilisable seulement avec la distribution fournie.
- Le caractère # signifie qu'on est logué en root où que les droits root sont nécessaires (sudo).
- Le caractère $ signifie qu'on est logué en utilisateur.
Introduction :Il est en fait déjà possible d'afficher une image en 15kHz sur un téléviseur grâce à Xorg configuré à l'ancienne avec xorg.conf, avec xrandr, ou maintenant avec
KMS.
MAJ - 06-01-2013 : C'était vrai avant sous debian, à partir du noyau 3.2.0.4 l'installation du paquet paquet « firmware-linux-nonfree » est désormais nécessaire.
Avec Ubuntu, ça reste vrai quelque soit la version du noyau, puisque le paquet « linux-firmware » est installé par défaut !Il suffit pour cela de passer un modeline au pilote libre ATI (radeon) ou nVidia (nouveau).
Voici un exemple de fichier xorg.conf qui fonctionne à tous les coups :
Section "Device"
Identifier "ATI"
Driver "radeon"
EndSection
Section "Monitor"
Identifier "TV"
HorizSync 15.0 - 20.0
VertRefresh 50.0 - 60.0
# Le modeline TV @15kHz
Modeline "768x288x50.08" 15.375000 768 792 880 964 288 288 288 322 -HSync -VSync
EndSection
Section "Screen"
Identifier "Default Screen"
Device "ATI"
Monitor "TV"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "768x288x50.08"
EndSubSection
EndSection
Donc on affiche une image progressive de 768x288 avec un PixelClock de 15.375 Hz.
Pourquoi Patcher Linux alors ?Pour afficher une image plus petite, le PixelClock sera donc plus petit, de l'ordre de 6 ou 7 Hz…
Et bien tests à l'appuis, force est de constater que les pilotes libres contenus dans Linux ne sont pas capables de gérer un faible PixelClock !
Impossible donc d'afficher une image à 320x240.
L'équipe de
Calamity fournit des patchs pour modifier les sources de n'importe quel Linux qu'il faut ensuite compiler et installer sur sa distribution préférée.
Les voici rassemblés ici par mes soins :
http://makotoworkshop.org/sources/patch15khz/Pour l'exemple, je vais compiler un Linux sur
Debian Wheezy qui tourne pour le moment avec un kernel 3.2 :
_____________________________________________________________________________________________________________
Prérequis Installer les programmes nécessaires à la compilation :
# apt-get install build-essential kernel-package debconf-utils dpkg-dev debhelper ncurses-dev fakeroot zlib1g-dev
_____________________________________________________________________________________________________________
Préparation et récupération des sources Aller dans son répertoire personnel et Créer le répertoire de travail :
$ cd
$ mkdir src
$ cd src
~/src$
_____________________________________________________________________________________________________________
Obtenir les sources à partir des dépôts Connaître les sources disponibles pour votre système :
$ aptitude search linux-source
Renverra quelque chose du genre :
v linux-source - Linux kernel source (meta-package)
p linux-source-2.6 - Linux kernel source (dummy package)
p linux-source-3.2 - Linux kernel source for version 3.2 with Debian patches
Pour obtenir les sources, il suffit de se placer dans votre répertoire ~/src et de taper la commande :
$ cd
$ mkdir src
$ su -
mot de passe:
# apt-get install linux-source-3.2
# cp /usr/src/linux-source-3.2.tar.bz2 /home/votre_user/src
# chown votre_user:votre_user /home/votre_user/src/linux-source-3.2.tar.bz2
# exit
$
_____________________________________________________________________________________________________________
Préparer la compilation du noyau Une fois les paquets installés il va falloir décompresser les sources de votre futur noyau. Il est conseillé de déléguer les tâches de configuration du noyau à un utilisateur. Pour cela, l'utilisateur doit appartenir au groupe src.
Pour ajouter par exemple l'utilisateur laurent au groupe src :
$ su -
# adduser laurent src
Adding user `laurent' to group `src' ...
Adding user laurent to group src
Done.
# exit
Décompresser et dépaqueter les sources :
~/src$ tar xvjf linux-3.2.tar.bz2
On ajoute enfin le lien symbolique linux qui pointe vers le répertoire de vos sources. Ainsi suivant la version de nos sources on sait qu'elles se trouveront toujours dans le répertoire ~/src/linux :
~/src$ cd /usr/src
Remarque: Il est possible que le lien symbolique existe déjà, auquel cas il faudra l'effacer...
/usr/src# ln -s ~/src/linux-3.2 linux
/usr/src$ cd ~/src
~/src$ ln -s ~/src/linux-3.2 linux
_____________________________________________________________________________________________________________
Patcher les sources Se rendre dans votre home :
~/src$ cd ~/
Télécharger le TarGz de patch correspondant à votre noyau, ici le fichier patch-3.2.tar.gz pour le noyau 3.2, puis les extraires :
~$ wget makotoworkshop.org/sources/patch15khz/patch-3.2.tar.gz
~$ tar xvf patch-3.2.tar.gz
se rendre dans le dossier linux
~$ cd src/linux
Patcher les sources successivement avec ces 3 commandes :
~/src/linux$ patch -p1 < ~/patch-3.2/ati9200_pllfix-3.4.diff
~/src/linux$ patch -p1 < ~/patch-3.2/avga3000-3.4.diff
~/src/linux$ patch -p1 < ~/patch-3.2/linux-3.4.diff
Astuce : patch -p1 --dry-run <[fichier-patch] pour tester le patch sans l'appliquer
_____________________________________________________________________________________________________________
Récupérer la configuration du noyau ~/src/linux$ cp -vi /boot/config-`uname -r` .config
mettre à jour la configuration avec "make oldconfig".
~/src/linux$ make oldconfig
Puisqu'on compile la même version que le noyau actuel, la commande ne doit constater aucune différence, et donc ne poser aucune question.
_____________________________________________________________________________________________________________
Nettoyage ~/src/linux$ make-kpkg clean
_____________________________________________________________________________________________________________
La compilation ~/src/linux$ fakeroot make-kpkg --initrd --append-to-version "-pached15khz" kernel-image kernel-headers
La commande ci-dessus vous sortira un paquet nommé "linux-image-3.2-patched15khz_3.2-patched15khz-10.00.Custom_i386.deb" La commande fakeroot permet de simuler l'environnement root au programme make-kpkg pour que ce dernier puisse générer les paquets de votre futur noyau. Cela a l'avantage d'éviter de faire la compilation en tant que root.
La compilation sur une machine puissante dure à peine 30 minutes. Cela peut dépasser plusieurs heures en fonction de votre configuration.
Astuce : Il peut alors être utile d'utiliser VirtualBox pour compiler le noyau sur un PC puissant, puis de récupérer le paquet compilé pour aller l'installer sur sa vieille machine de récup destinée à la borne.
_____________________________________________________________________________________________________________
Installation du noyau~/src/linux$ su -
mot de passe:
# dpkg -i linux-image-3.2-patched15khz_3.2-patched15khz-10.00.Custom_i386.deb
Redémarrer l'ordinateur !
_____________________________________________________________________________________________________________
DésinstallationSi pour une raison ou une autre vous n'arrivez pas à démarrer sur votre nouveau noyau et que vous souhaitiez le désinstaller. Redémarrez sur le dernier noyau opérationnel, puis :
~$ su -
Mot de passe :
root@Squeeze:~# apt-get remove --purge linux-image-3.2-patched15khz_3.2-patched15khz-10.00.Custom_i386.deb
_____________________________________________________________________________________________________________
Ressources :
http://www.isalo.org/wiki.debian-fr/index.php?title=Compiler_et_patcher_son_noyau_____________________________________________________________________________________________________________
Pour tester le noyau avec xorg.conf,Modifier ou créer le fichier :
# nano /etc/X11/xorg.conf
et modifier le modeline pour celui-ci en 320x240 (testé compatible ATI Radeon 9000 et 9200 et nVdia TNT2 Model 64 et Elsa Erazor X)
Section "Device"
Identifier "ATI"
Driver "radeon"
EndSection
Section "Monitor"
Identifier "TV"
HorizSync 15.0 - 20.0
VertRefresh 50.0 - 60.0
# Le modeline TV @15kHz
Modeline "320x240" 6.452 320 344 376 408 240 242 245 264 -HSync -VSync
EndSection
Section "Screen"
Identifier "Default Screen"
Device "ATI"
Monitor "TV"
DefaultDepth 24
SubSection "Display"
Depth 24
Modes "320x240"
EndSubSection
EndSection
Pour une carte nvidia, remplacer simplement :
Driver "radeon"
par
Driver "nouveau"
Démarrer X :
$ startx
Enjoy
Note de MAJ du 06-01-2013 : Le patch rendant possible l'utilisation d'un téléviseur l'installation du paquet paquet « firmware-linux-nonfree » pourrait paraitre inutile, mais elle reste indispensable pour permettre l'utilisation du Direct Rendering par la carte graphique (sinon, c'est cisaillement dans l'image (tearing) et crénelage sévères des contours).
C'est inutile avec Ubuntu, voir au début du tuto…_____________________________________________________________________________________________________________
Pour tester le noyau avec Xrandr, sans fichier xorg.conf(oui ce fichier n'est plus nécessaire de nos jours. Son absence n'empêchera par X de démarrer)
Démarrer X :
$ startx
Xrandr permet de changer de la résolution d'X par une simple commande.
Elle permet aussi d'ajouter des modelines en plus; Taper :
$ xrandr
Et apparait alors la liste des résolutions disponibles, donc en 31kHz !
Une astérisque repère la résolution en cour…
Pour ajouter le modeline d'exemple, taper ceci :
$ xrandr --newmode "320x240" 6.452 320 344 376 408 240 242 245 264 -hsync -vsync
Taper à nouveau xrandr permet de voir que le mode a été créé, mais il n'est pas encore utilisable en l'état !
320x240 (0x1da) 6.0MHz
h: width 320 start 344 end 376 total 408 skew 0 clock 14.7KHz
v: height 240 start 242 end 245 total 264 clock 55.7Hz
En effet, il faut l'associer à une sortie de la carte graphique (selon la carte, VGA-0 ou DVI-0 avec ATI)
$ xrandr --addmode DVI-0 "320x240"
Un nouveau xrandr listera maintenant la résolution disponible.
Reste donc à basculer dessus avec :
$ xrandr --output DVI-0 --mode "320x240"
L'affichage bascule en 320x240, débrancher vite l'écran VGA et connecter le téléviseur sur la carte graphique…
Enjoy
De là il est bien sûr possible d'automatiser cela avec un script bash, histoire de ne pas avoir à se repalucher les lignes de commande !
Genre comme ça :
#!/bin/sh
xrandr --newmode "256x264" 5.356 256 272 296 328 264 265 268 278 -hsync -vsync
xrandr --newmode "304x240" 6.208 304 328 360 392 240 243 246 264 -hsync -vsync
xrandr --newmode "320x240" 6.452 320 344 376 408 240 242 245 264 -hsync -vsync
xrandr --newmode "384x288" 7.851 384 408 448 496 288 289 292 309 -hsync -vsync
xrandr --newmode "640x288" 13.125 640 680 744 832 288 289 292 309 -hsync -vsync
xrandr --addmode DVI-0 "256x264"
xrandr --addmode DVI-0 "304x240"
xrandr --addmode DVI-0 "320x240"
xrandr --addmode DVI-0 "384x288"
xrandr --addmode DVI-0 "640x288"