Gamoover

[move]Vous aimez le couscous-boulettes, le chorizo, la Force 4, et la mimolette ? Alors soyez les bienvenus sur Gamoover ! [/move]

Tuto : Patcher un Linux en 15kHz

Démarré par MaKoTo, Lundi 26 Novembre 2012, 20:58:21 PM

MaKoTo

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.04LTS
http://makotoworkshop.org/packages/linux-image-3.2.32-patched15khz_i386.deb
Pour 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ésinstallation

Si 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"
http://makotoworkshop.org/

Message tapé en bépo sur un clavier orthogonal TypeMatrix
Sous GNU/Linux Ubuntu

dapsaille

#1
Merci beaucoup pour ce partage  ;)


Histoire de compléter ce feu d'artifice, aurais tu les infos pour patcher kms/grub ?

Mea Culpae c'est déja en place  :D

f4brice

Clap clap clap (bruit d'applaudissement) !  :-)=

AsPiC

Bon alors à la première lecture j'ai rien compris ;D (a la deuxième non plus d'ailleurs) mais dans tous les cas merci pour ce tuto ^-

Me reste plus qu'à appliquer et ça devrais être plus compréhensible en le fessant en même temps que je le lit :)

dilomos

Je trouve ce tuto très interressant et ca permettra peut être a des possesseur de Nvidia d'avoir accès a du 15kHz (même si je dois reconnaitre que ca n'est pas forcement a la portée de tous).
Reste a ajouter un petit groovyMame la dessus et on se retrouve avec une linuxCab toute belle ^-^

Question : on peut ajouter autant de modeline qu'on veut dans le xorg.conf ?

Iro

Aaaah Linux et ces lignes de commandes de barbu :D
Merci pour le tuto <:)
"Jet set 2, c'est avec Robert Garcia ?" Kaneda, Lapsus de sac Vol.1
Peter Shou Owner' Club

WIPs : Naomi - SEGA Rally - AB Cop - Lethal Enforcers - COMPUMI - Terminator 2 - Space Invaders - Artworks pour Boitiers K7 Naomi CF - Ma collec' de panels

LES TUTOS DE GAMO   

MaKoTo

#6
CitationMerci beaucoup pour ce partage   :)


Histoire de compléter ce feu d'artifice, aurais tu les infos pour patcher kms/grub ?

Mea Culpae c'est déja en place   :D
Oui, depuis les linux v3.x KMS est déjà activé dans le fichier de config du noyaux.
Donc rien à y modifier ^^


CitationBon alors à la première lecture j'ai rien compris  ;D(a la deuxième non plus d'ailleurs) mais dans tous les cas merci pour ce tuto  ^-

Me reste plus qu'à appliquer et ça devrais être plus compréhensible en le fessant en même temps que je le lit  :)
Si tu débutes avec GNU/Linux, ça va être chaud ^^;
Je pense que le travail est pas mal mâché, mais il n'est pas exempt que quelques ajustements soient à faire, notamment adapter la ligne de compilation qui n'est valable que pour la famille de distribution debian (debian, ubuntu, mint, etc)
Donc si tu veux tenter l'aventure, utilise plutôt une debian, y'aura moins de mauvaise surprise.


CitationJe trouve ce tuto très interressant et ca permettra peut être a des possesseur de Nvidia d'avoir accès a du 15kHz (même si je

dois reconnaitre que ca n'est pas forcement a la portée de tous).
Reste a ajouter un petit groovyMame la dessus et on se retrouve avec une linuxCab toute belle  ^-^

Question : on peut ajouter autant de modeline qu'on veut dans le xorg.conf ?
Je pense que le 15kHz n'est pas moins accessible sur nVidia que sur ATI, du moins avec GNU/Linux.
Toutes les cartes nVidia et ATI que j'ai testé fonctionnent sans se taper tout le tuto !!
Rappelons que le patch de Linux n'est utile que si l'on souhaite afficher des petites résolutions d'image, sans ça, ça fonctionne déjà, et je dirais même plus que le pilote « nouveau » pour carte nVidia gère déjà les faibles résolutions, mais malheureusement assez mal, ce qui fait que l'image était de mauvaise qualité, tremblotante notamment. Alors qui le pilote « radeon » pour ATI laissait une image totalement brouillée ou noire.

Pour les nVidia qui ne fonctionnaient pas c'était dû à la pin N°9 du connecteur VGA qui ne délivrait pas de 5V… ce qui veut dire écran noir ! Y'a donc moyen d'ajouter cette tension directement sur l'adaptateur VGA/péritel.

Réponse : Oui bien sûr, mais il faudra un environnement de bureau et passer par les réglages graphique pour gérer le switch entre ces résolutions, un peu comme sous Windows avec Soft15kHz.
On peut faire mieux que ça ! Et j'y travaille ^^
Y'a moyen de switcher avec des commandes xrandr, j'indiquerais comment plus tard.
J'essaye de voir si je peux bidouiller un truc pour AdvanceMame et GroovyMame.


CitationAaaah Linux et ces lignes de commandes de barbu  :D
Merci pour le tuto  <:)
Ouép… j'ai bien cherché un moyen plus simple pour le même résultat, mais il n'existe pas.
Parce que la compilation de Linux c'est le genre de truc qui fait peur aux débuttants, et qui fouarre souvent sans qu'on sache vraiment pourquoi, du moins, à mon petit niveau en la matière.

http://makotoworkshop.org/

Message tapé en bépo sur un clavier orthogonal TypeMatrix
Sous GNU/Linux Ubuntu

dilomos

Citation de: MaKoTo le Mardi 27 Novembre 2012, 14:02:14 PM
Je pense que le 15kHz n'est pas moins accessible sur nVidia que sur ATI, du moins avec GNU/Linux.
La était tout le sens de ma remarque ;)
Je voulais dire que sous windows soit on a une ATI est généralement tout ce passe plutot bien soit on a une Nvidia et c'est plus ou moins la loterie (et encore je ne me plein pas ma 7900GS fonctionne très bien avec soft15Khz et switchres ;)

Et pour moi le 15kHz va de paire avec un système de switch de résolution, tant qu'a etre en 15kHz autant jouer en resolution native.
C'est cette partie qui pour moi n'était pas encore très claire concernant linux, je savais que groovyMame était dispo et que donc on devait pouvoir switcher les resolution mais je ne savait pas s'il existait d'équivalent a soft15kHZ/switchres de windows.
Pour etre franc j'ai pas non plus beaucoups chercher et ca commence a faire un moment que je n'ai plus patcher de noyau et bidouiller de xorg  ;D
Mais tu m'a bien éclairer sur cette question.

Ca marchait sur ma vieille becane en windows XP j'ai pas chercher plus loin (oui je sais c'est pas bien  >:D)

MaKoTo

Ok !
D'après ce que j'ai vu en testant, Switchres est intégré dans le binaire de GroovyMame.
Reste qu'il génère des modelines automatiquement et que j'ai envie de comprendre comment ça se passe, pour pouvoir customiser le fonctionnement...

Étant partis de 0, c'est ainsi qu'en étudiant AdvanceMame en Frame Buffer puis avec X, j'en suis venu à tous un tas de conclusions, elles mêmes remises en cause par de nouvelles expérimentations sur le fonctionnement de GroovyMame...
Tiens bah faudrait que je résume ça en quelques lignes, histoire le mettre les choses au clair sur le fonctionnement des cartes graphiques et des modes d'affichages logiciel vis à vis d'un téléviseur...
Ça permettrait au débutant de mieux comprendre, et de ne pas perdre ces nombreuses heures passées à chercher/tester, frustré de ne pas trouver ce type d'infos.
http://makotoworkshop.org/

Message tapé en bépo sur un clavier orthogonal TypeMatrix
Sous GNU/Linux Ubuntu

dilomos

En effet depuis quelque version switchres est intégré dans groovymame (avant il était séparé et on doit encore pouvoir trouver les sources séparées).
Mais si je dis pas de betise (en tout cas sur windows) il faut que les modelines est été intégré auparavant ce que fait soft15kHz sur windows et qui est fait par l'intermediaire du xorg.conf sous linux.
Reste a calculer ces modelines ou du moins a les trouvé deja calculé.

Du coups, que veux tu dire quand tu dis qu'il génére des modelines automatiquement?
Groovymame pourrait switcher la resolution tout seul? sans que toute les resolutions necessaire soit listée dans le xorg.conf?

MaKoTo

Oui, d'après ce que j'ai compris, il est censé lire la résolution du jeu, et générer le modeline qui va bien, dans la mesure du possible (faux positifs potentiels...), à moins qu'il ne soit simplement sélectionné dans une liste codée dans switchres, il faut que j'étudie ça...

En tous cas les modelines de chaque résolutions n'ont pas besoin d'être listées dans xorg, car GroovyMame bascule la résolution avec Xrandr.
Donc pour résumer :
-> Lancement du jeu,
-> détection de la résolution du jeu par Switchres,
-> génération/sélection du modelines par Switchres, envoyée à Xrandr,
-> Xrandr sélectionne cette résolution et bascule y l'affichage de Xorg.

Je noterais les commandes ce soir.
http://makotoworkshop.org/

Message tapé en bépo sur un clavier orthogonal TypeMatrix
Sous GNU/Linux Ubuntu

dapsaille

c'est exactement ça, les modelines sont extraits à la volée et passés à Xrandr qui bascule la réso ^^

Quand je parlais du grub/kms, c'était pour qu'il soit en 15k direct sans X, il semblerait que ton patch l'inclue ^^

MaKoTo

Oui, mais alors comment l'exploiter ?
C'est que j'ai découvert KMS récemment, et je ne vois pas trop comment faire.

Passer des options dans grub pour fixer une résolution/modelines c'est ça ?
Ce qui donnerais une console tty en 320x240 par exemple.
http://makotoworkshop.org/

Message tapé en bépo sur un clavier orthogonal TypeMatrix
Sous GNU/Linux Ubuntu

dapsaille

Citation de: MaKoTo le Mardi 27 Novembre 2012, 17:47:05 PM
Oui, mais alors comment l'exploiter ?
C'est que j'ai découvert KMS récemment, et je ne vois pas trop comment faire.

Passer des options dans grub pour fixer une résolution/modelines c'est ça ?
Ce qui donnerais une console tty en 320x240 par exemple.

exactement, la partie KMS est patchée et après grub on as un screen en 15khz.

Voir les patches de groovymame pour ça

MaKoTo

Bon, faudra que j'essaye ça…

Voilà, j'ai édité le premier billet pour ajouter les commandes Xrandr, ce qui permet pas a pas, de comprendre un peu ce que fait GroovyMame.
http://makotoworkshop.org/

Message tapé en bépo sur un clavier orthogonal TypeMatrix
Sous GNU/Linux Ubuntu

zebassprophet

une question bête, au niveau des resolutions specifiques a chaque jeux, il y'a une manip a faire ou mame s'en charge?


(merci pour le tuto by the way