まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

Une Borne d'Arcade maison -4-

Suite de l'étude précédente :
>>Sommaire ici !<<

Méthode N°2

[validée sur Ubuntu 10.04LTS]

Introduction :

dsc07597.jpgExploiter AdvanceMAME en mode FB, pour Frame Buffer, permet de se passer d'une interface graphique comme X, et donc d'alléger le système d'exploitation;
Autre avantage, et non des moindres, le nombre de cartes vidéos supportés est encore plus important.

Pour imposer l'usage du fb à AdvanceMAME', on édite /home/makoto/.advance/advmame.rc'', pour modifier ces deux lignes :

device_sound alsa
device_video fb slang


1 - Activation du Frame Buffer de Linux : :

Attention, une fois le fb activé, la méthode N°1 avec Xorg modifié en 15kHz ne fonctionnera plus !

Quand on essaye la commande suivante alors qu'on se trouve dans X :

advmame 3wonders

AdvanceMAME - Copyright (C) 1999-2003 by Andrea Mazzoleni
MAME - Copyright (C) 1997-2003 by Nicola Salmoria and the MAME Team
Unable to initialize the video driver. The errors are:
fb: Unsupported in X.

Pour ceux qui n'auraient pas suivit l'affaire, on vient de prouver qu'X est inutile et que pour utiliser fb il faut passer en mode console tty (ctrl+alt+F2)

Une fois logué, en réessaye :

advmame 3wonders

Unable to initialize the video driver. Theses errors are :
fb: Error opening the frame buffer /dev/fb0. Error 13 (permission denied).

Pour résoudre ce problème de droit d'accès, soit utiliser sudo, soit faire :

sudo chown root:root /usr/local/bin/advmame
sudo chmod u+s /usr/local/bin/advmame

Nouvelle tentative, cette fois on nous répond :

Unable to initialize the video driver. Theses errors are :
fb: This 'VGA16 VGA' FrameBuffer driver doesn't seem to allow the creation of new video modes.

Bien…

  • Le Frame Buffer par défaut ne fonctionnant pas, on peut en tenter un autre, en l'activant dans /etc/default/grub; pour cela, il faut modifier la ligne suivante :

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset video=radeonfb"

  • Et pour prendre en compte ce changement, lancer :
sudo update-grub

Le mot magique c'est donc radeonfb, le seul qui puisse fonctionner, tous les autres testés (atyfb, vesafb, vga16fb…) renvoyant la même erreur que précédemment.

  • Le soucis c'est que, par défaut, radeonfb est blacklisté dans le fichier /etc/modprobe.d/blacklist-framebuffer.conf

Il faut donc l'éditer et commenter ou supprimer la ligne :

#blacklist radeonfb

De là, il faut redémarrer l'ordi…
On peut alors vérifier :

lsmod |grep fb

fbcon 35102 71
tileblit 1999 1 fbcon
font 7557 1 fbcon
bitblit 4707 1 fbcon
vga16fb 11385 0
vgastate 8961 1 vga16fb
radeonfb 85280 1
fb_ddc 1418 1 radeonfb
i2c_algo_bit 5028 2 radeonfb,radeon

On peut donc essayer à nouveau de lancer un jeux, mais on risque de recevoir :

No video modes available for the current game
video_init failed

En effet, il faut maintenant configurer advmame.rc pour lui indiquer les paramètres d'affichages.
Ceci se fait avec l'utilitaire advcfg
pour éditer advmame.rc d'AdvanceMAME

advcfg -advmamec

pour éditer advmemu.rc d'AdvanceMEMU

advcfg -advmemuc


2 - Configurer AdvanceMame pour un écran d'ordi :

Là il va nous falloir les caractéristiques de notre écran, notés dans sa notice. On a besoin de la :
- Fréquence de Synchro Horizontale : 30-86kHz
- Fréquence de Synchro Verticale : 50-180Hz
- Bande passante : 130MHz dot clock

  • On peut y aller…
sudo advcfg -advmamec

Choisir : PC Monitor (>30kHz)
puis : Custon - SUGGESTED - Read tho values in your Monitor Manual - Custom
dsc07576.jpg dsc07577.jpg
Entrer les valeurs : 5-130/30-86/50-180
Puis : Manual Low centering - SUGGESTED - (low freguency settings)
dsc07578.jpg dsc07579.jpg
Si besoin, ajuster l'image avec les flèches pour déplacer le cadre, i et (shift+i) pour étirer en x, k et (shift+k) pour étirer en y.
Enfin valider, Save & Exit.
dsc07580.jpg dsc07581.jpg

  • Ces deux lignes ont été rajoutées dans advmame.rc

device_video_format 30000 0.76 0.04 0.12 0.08 0.914 0.02 0.002 0.064
device_video_clock 5-130 / 30-86 / 50-180

Maintenant les jeux devraient fonctionner !
L'écran switche automatiquement dans les résolutions natives de chaque jeux.
Au besoin, on peut ajouter des résolution avec l'utilitaire advv.

Note :
- Tests réalisés avec un CRT iiYama 17".
- Je ne suis arrivé à rien avec un écran LCD 17", l'écran se mettant en protection lors de la dernière étape, et ce malgré avoir entré les paramètres inscrit dans la notice.

3 - Configurer AdvanceMame pour un écran TV :

Tout d'abord, un truc très important que j'ai découvert après pas mal d'incompréhensions…
Il faut débrancher l'écran d'ordi de la carte vidéo durant le démarrage d'Ubuntu ! Bon, ça ne le fait pas avec toutes les cartes vidéo, et ça dépend aussi de l'écran mais il se trouve que lors du démarrage les caractéristiques de l'écran (edid) sont détectées au démarrage de X… On peut les voir avec :

cat /var/log/Xorg.0.log | more

Cela empêche parfois le fonctionnement d'advcfg, advv (aucun mode testable, tous au rouge) et advmame (video init failed)

  • Allons-y
sudo advcfg -advmamec

Choisir : TV PAL (50Hz)
Puis : Generic - PAL TV (European)
Puis : Manual Low centering - SUGGESTED - (low freguency settings)

  • Mais advcfg plante sévère lors de sa dernière étape, alors qu'à priori on lui donne les bons paramètres, proposés par le soft, à défaut de connaitre les caractéristiques du téléviseur.

J'ai découvert qu'en utilisant TV PAL (50Hz), puis Generic - Arcade Monitor Standard CGA Resolution 15 kHz (ou Generic - NTSC TV (USA)), advcfg ne plantait pas et que même si les valeurs n'étaient pas idéales on parvenait à ajuster l'image…

  • On peut maintenant débrancher l'écran d'ordi et brancher la télé, puis avec les flèches, déplacer le cadre, i et (shift+i) pour étirer en x, k et (shift+k) pour étirer en y.

Enfin valider, Save & Exit.

  • On retrouve alors ces paramètres ajoutés dans advmame.rc :

device_video_clock 5-100 / 15.75 / 60
device_video_format 15750 0.8 0.05 0.05 0.1 0.923664 0.0114504 0.00763359 0.0572519

Sauf qu'à l'usage des jeux, on se retrouve avec une image tronquée, et souvent inexploitable par advmame !
On va donc devoir passer en manuel avec advv.

Configurer l'affichage sur le TV avec advv :

Tout d'abord, advmame.rc à besoin qu'on lui donne les paramètres de l'écran TV qui vont servir de limites d'exploitation; On va extrapoler idéalement :
- Fréquence de Synchro Horizontale : 15-16kHz''
- Fréquence de Synchro Verticale : 50Hz''
- Bande passante : 16-17MHz dot clock (pixel clock)''

Mais à l'usage, je me suis rendu compte que c'était trop restrictif pour advv, rendant alors la quasi totalités des résolutions proposées OUT OF RANGE.
Mieux vaut donc être un peu plus large sur le pixel clock, avec 5-25MHz.
En effet, plus la résolution est basse, plus le pixel clock est bas (genre 7MHz), et plus elle est haute plus il tend vers 17MHz.

  • On note ça ainsi dans advmame.rc :

device_video_clock 5-25/15-16/50

(on peux virer la ligne device_video_format, devenue inutile)

dsc07591.jpg

  • Donc par exemple, on va créer la résolution ATI_320x240,

Touche F5 puis on entre 50, puis 320 et 240 et on valide.

Une ligne a été créée en surbrillance bleu, elle s'appelle generate.
On peut la renommer avec tabulation en ATI_320x240.
Puis on valide.

  • Nous étions donc connecté à l'écran d'ordi, on branche donc maintenant l'écran de télé et on se retrouve sur une image brouillée
  • Il faut maintenant ajuster l'image... ici avec shift i pour augmenter le pclock :

Toutes les actions sont disponibles avec F1.
dsc07586.jpg

Ok ! Donc de ça………………………………………………… on doit passer à ça…
dsc07588.jpg dsc07584.jpg
On peut alors valider, on s'assure également que la ligne est toujours sélectionnée, donc en surbrillance bleu et on fait F2 pour sauver.

  • On retrouve alors le modeline crée dans advmame.rc :

device_video_modeline ATI_320x240 15.75 320 576 608 1008 240 267 270 312 -hsync -vsync

Et ainsi de suite pour toutes les résolutions correspondantes aux jeux (elles sont indiquées dans le bandeau de mame quand on lance un jeux)

Note : Toutes les résolutions en rouge ne rentrent pas dans les clous, c'est à dire quelles ne sont pas comprises dans les valeurs limite de device_video_clock...
De meme si on sort de ces valeurs, par ex en passant en entrelacé un modeline progressif (touche c), ce qui va doubler la fréquence clock verticale de 50 à 100Hz, une résolution qu'on vient de créer peut se retrouver out of range; il faut alors retoucher la valeur fautive (shift k) pour retourner à + ou - 50Hz.

Mais quelque chose cloche, non ???!!
C'est quoi cette vignette là ?
Ne devrait-on pas avoir une image plein écran ??

  • En fait, on se rends compte que le TV ne supporte pas des valeurs de pclock[1] basses, et qu'on obtient une image que vers 15MHz… Il suffit de comparer le modelines qu'on vient de créer à celui proposé le plus approchant :

device_video_modeline ATI_320x240 15.75 320 576 608 1008 240 267 270 312 -hsync -vsync
device_video_modeline pal_320x240 6.125 320 328 360 392 240 267 270 312 -hsync -vsync

Et de constater que de 6.125 on est passé à 15.75, à force de shift i.
dsc07602.jpg Ainsi, cette image s'affichant par rapport à ce pixel clock, sa taille est alors dépendante de sa résolution !
Donc si la résoltion est de 320x240, sur le TV on aura une vignette de 320x240 !

On aura beau avoir configuré toutes les résolutions correspondantes aux jeux, les petites résolutions s'afficheront en vignette, quand bien même on activera l'option rezise fractionnal dans le fichier advmame.rc.

Par contre, dans la résolution native du TV, 768x576, l'option rezise fractionnal donnera bien une image plein écran… Sans elle (rezise none) on obtient une vignette, ce qui cette fois est normal.
dsc07597.jpg dsc07600.jpg

  • Pourquoi un tel comportement ?

L'explication que j'ai envisagée porterait à croire que, bien que la carte vidéo supporte l'envoie d'un faible pixel clock, le TV n'est capable de fonctionner que dans sa résolution native, avec un pixel clock élevé (15 à 17MHz).
Contrairement aux moniteurs d'Arcade CGA, qui commencent à travailler de 5 à 7MHz, autorisant alors une image plein écran pour une très faible résolution.
Je peux bien sûr me tromper et je serais heureux qu'on m'infirme tout ça à coup d'explications et d'expérimentations claires, mais toujours est-il qu'à moins d'avoir un téléviseur qui accepte un faible pclock (testé 2 télé, résultats idem), je ne vois pas comment exploiter correctement le mode Frame Buffer d'AdvanceMame sur un TV !!

Conclusion :

Le mode Frame Buffer :

  • est utilisable sur écran de PC à tube cathodique.
  • ne fonctionne pas sur écran LCD.
  • est utilisable sur écran d'arcade CGA 15,72Khz
  • fonctionne sur écran TV en résolution native + resize, mais on perd alors toute l'essence d'AdvanceMame avec sa fonction essentielle de basculement de résolution pour chaque jeux !
  • consulter ce nouveau billet pour des explications approfondies.


À suivre…

Ressources :
http://www.gamoover.net/Forums/index.php?topic=586.0
http://easymamecab.mameworld.info/html/monito10.htm http://www.faqs.org/docs/Linux-HOWTO/Framebuffer-HOWTO.html#s17
https://wiki.ubuntu.com/FrameBuffer
http://blog.rom1v.com/2010/05/splash-screen-ubuntu-lucid-lynx-10-04-et-pilote-nvidia-proprietaire/

Note

[1] Le pixel clock est en fait le nombre de pixels par seconde que la carte vidéo est capable d'envoyer à sa sortie

Ajouter un commentaire

Les commentaires peuvent être formatés en utilisant une syntaxe wiki simplifiée.

Fil des commentaires de ce billet