Bonjour
Je suis confronté à un problème assez bizarre, je vais tenter d'expliquer (ca va être long ^^).
J'ai une carte PC de type SBC de marque AAEON modele 9310 qui vient de sortir, avec le chipset Intel 945GM. Je dois faire tourner dessus une application graphique sous linux , et je dois absolument faire ressortir l'image sur un maximum de sortie. Cette carte possède de base une sortie CRT (VGA), une sortie LVDS, et une sortie TV-OUT (Composite, YUV ou S-Video). On peut egalement avoir VIA une carte additionnelle DVO une sortie DVI, une seconde sortie TV et je crois une seconde sortie LVDS.
Ce chipset possède 2 pipes ce qui signifie que selon le cablage de l'intégrateur, on peut avoir différentes combinaisons simultanées pour du clonage écran, ou carrément 2 écrans différents (ce qui m'intéresse, c'est le clonage écran). On peut ainsi combiner CRT+TV , CRT+LVDS , LVDS+TV , etc... (CRT+DVI, TV1+TV2 ...). Je ne souhaite pas utiliser la sortie LVDS, je n'ai rien à brancher dessus. Par contre, j'ai besoin de CRT + TV , et éventuellement plus tard, DVI + TV , et CRT + DVI (mais je n'ai pas la carte extension DVO pour le moment donc je ne peux pas le tester).
Maintenant passons à linux
J'ai installé dessus un système linux en me basant sur la documentation LFS (www.linuxfromscratch.org), et j'arrive à obtenir un système stable. J'ai du faire quelques modifications sur le choix des packages car le matériel est trop récent pour les versions de packages proposées. J'ai du mettre le dernier noyau linux (2.6.22 à la place du 2.6.11.12), et j'ai du changer la version de XOrg, car le driver intel dans XOrg 6.8 ne détecte pas le chipset 945GM. J'ai donc installé la version 7.3 de XOrg (la derniere donc). J'ai également installé la derniere version de libxine (1.1.7) pour faire des tests de video.
Après avoir compilé Xorg (ce qui n'est pas simple !) , je teste d'abord la sortie CRT de ma carte, et là, ca fonctionne très bien : lecture d'un DVD avec xine, xine utilise bien le driver xvideo et affiche la vidéo sans ralentissement et 13% d'utilisation CPU (avec le précédent xorg, le driver intel ne detectant pas le chipset, c est le driver vesa qui prenait le relais, et c'était la catastrophe en terme de performances).
- Premier petit souci, quoi que je fasse dans xorg.conf , je n'arrive pas à changer la résolution de mon écran elle reste tout le temps figé sur 1280x1024. Le seul moyen (étrange) que j'ai réussi à utiliser pour changer de résolution est de forcer un moniteur avec des faibles caractéristiques. J'arrive difficilement par ce moyen à passer en 640x480 ou en 1280x1024 avec une fréquence de rafraichissement différente (faudra que je teste les autres résolutions).
Par contre si je mets ca dans la section screen :
Code :
- Section "Screen"
- Identifier "Screen0"
- Device "Card0"
- Monitor "Monitor0"
- DefaultDepth 24
- SubSection "Display"
- ViewPort 0 0
- Depth 24
- Modes "800x600" (ou n'importe quel autre mode)
- EndSubSection
- EndSection
- Ca ne change rien quelque soit le mode que je met, ca reste en 1280x1024 :(
|
- Bon c'est pas grave, je teste la TV-OUT.Et la, je comprends plus rien. Impossible de faire marcher la TV-OUT avec le peu de doc que je trouve sur internet.
En allant sur le site http://www.intellinuxgraphics.org/ (redirigé depuis le site intel.com) , je tombe sur un peu de doc (http://www.intellinuxgraphics.org/man.html) sur les options de la carte graphique. Dont une option qui m'intéresse :
Citation :
Option "MonitorLayout" "anystr"Allow different monitor configurations. e.g. "CRT,LFP" will configure a CRT on Pipe A and an LFP on Pipe B. Regardless of the primary heads' pipe it is always configured as "<PIPEA>,<PIPEB>". Additionally you can add different configurations such as "CRT+DFP,LFP" which would put a digital flat panel and a CRT on pipe A, and a local flat panel on pipe B.For single pipe configurations you can just specify the monitors typeson Pipe A, such as "CRT+DFP" which will enable the CRT and DFPon Pipe A.Valid monitors are CRT, LFP, DFP, TV, CRT2, LFP2, DFP2, TV2 and NONE.NOTE: Some configurations of monitor types may fail, this depends onthe Video BIOS and system configuration.Default: Not configured, and will use the current head's pipe and monitor.
|
J'ai testé cette option et quelque soit la combinaison que je mets, ca ne fait rien. Pire, quand je regarde dans Xorg.0.0.log , je tombe sur la ligne de log suivante :
(WW) intel(0): Option "MonitorLayout" is not used.
D'ailleurs quand je suis les différentes manip proposés sur ce site et d'autres (http://doc.ubuntu-fr.org/materiel/multi-ecran) , je n'arrive à rien faire.
En analysant les logs d'un peu plus pret, je tombe sur des lignes intéressantes :
j'ai les 3 lignes suivantes :
Code :
- (II) intel(0): Output VGA using monitor section Mon1
- (II) intel(0): Output LVDS has no monitor section
- (II) intel(0): Output TV has no monitor section
|
Le driver détecte bien mes 3 sorties. Par contre on voit que seule la sortie VGA à un monitor. En regardant de plus près dans les sources du driver, je tombe la dessus (provient du fichier xf86CrtC.c faisant partie du xorg-server) :
Code :
- static void
- xf86OutputSetMonitor (xf86OutputPtr output)
- {
- char *option_name;
- static const char monitor_prefix[] = "monitor-";
- char *monitor;
- if (!output->name)
- return;
- if (output->options)
- xfree (output->options);
- output->options = xnfalloc (sizeof (xf86OutputOptions));
- memcpy (output->options, xf86OutputOptions, sizeof (xf86OutputOptions));
-
- option_name = xnfalloc (strlen (monitor_prefix) +
- strlen (output->name) + 1);
- strcpy (option_name, monitor_prefix);
- strcat (option_name, output->name);
- monitor = xf86findOptionValue (output->scrn->options, option_name);
- if (!monitor)
- monitor = output->name;
- else
- xf86MarkOptionUsedByName (output->scrn->options, option_name);
- xfree (option_name);
- output->conf_monitor = xf86findMonitor (monitor,
- xf86configptr->conf_monitor_lst);
- /*
- * Find the monitor section of the screen and use that
- */
- if (!output->conf_monitor && output->use_screen_monitor)
- output->conf_monitor = xf86findMonitor (output->scrn->monitor->id,
- xf86configptr->conf_monitor_lst);
- if (output->conf_monitor)
- {
- xf86DrvMsg (output->scrn->scrnIndex, X_INFO,
- "Output %s using monitor section %sn",
- output->name, output->conf_monitor->mon_identifier);
- xf86ProcessOptions (output->scrn->scrnIndex,
- output->conf_monitor->mon_option_lst,
- output->options);
- }
- else
- xf86DrvMsg (output->scrn->scrnIndex, X_INFO,
- "Output %s has no monitor sectionn",
- output->name);
- }
|
J'en ai déduit (et après tests c'est bien ca) que xorg attribue automatiquement le moniteur configuré dans la section screen à la premiere sortie (donc ici mon0 pour VGA), et que le seul moyen d'attribuer un moniteur pour les autres sorties est de nommer le moniteur exactement comme la sortie. Pas mal, mais ca, c'est pas documenté
A noter que le nom du moniteur est prioritaire par rapport au moniteur spécifié dans la section screen.
Ensuite plus loin dans le log j'ai :
Code :
- (II) intel(0): Output VGA Connected
- (II) intel(0): Output LVDS Connected
- (II) intel(0): Output TV Connected
|
D'après ce que j'ai compris, le driver détecte s'il y a un cable branché ou non dessus (sauf pour le LVDS qu'il voit tout le temps connecté). La conséquence est que si au démarrage il ne voit aucun cable branché (= aucun signal), il ne fait pas le reste de l'initialisation pour la sortie. C'est assez génant...
Puis :
Code :
- (II) intel(0): Output VGA using initial mode 1280x1024
- (II) intel(0): Output LVDS using initial mode 1024x768
- (II) intel(0): Output TV enabled but has no modes
|
Je n'ai pas trouvé comment changer ce mode quoi que je fasse, je n'arrive pas à le faire varier SAUF en changeant les caractéristiques du moniteur attaché.
Puis vient les dernières lignes intéressantes :
Code :
- (II) intel(0): Output configuration:
- (II) intel(0): Pipe A is on
- (II) intel(0): Display plane A is now enabled and connected to pipe A
- (II) intel(0): Pipe B is on
- (II) intel(0): Display plane B is now enabled and connected to pipe B
- (II) intel(0): Output VGA is connected to pipe A
- (II) intel(0): Output LVDS is connected to pipe B
- (II) intel(0): Output TV is connected to pipe none
|
D'après ce que j'ai compris, la carte 945GM gère 2 Pipes, et à nous de les brancher comme on veut sur telle ou telle sortie. Normalement c'est censé se faire avec l'option "MonitorLayout". Sauf que ca marche pas, je peux essayer toutes les combinaisons ca n'a aucune influence, et comme je l'ai marqué plus haut, ca me dit que que l'option n'est pas utilisé.
Par contre, en bidouillant un peu, j'ai reussi a passer le pipe A sur VGA, OU sur TV selon si je force tel ou tel écran. En gros, si je configure juste un seul moniteur spécialement pour le VGA, il bascule le pipe A sur VGA, si par contre je configure un écran spécialement pour la TV (avec un rafraichissement faible) il bascule automatiquement sur la TV. Le pb, c'est que j'ai soit l'un, soit l'autre (et en plus je ne peux pas fixer la résolution ). PAr contre le pipe B, lui, reste toujours sur LVDS et impossible de le bouger.
Du coup, j'ai tenté de mettre en commentaire dans le source l'initialisation de la sortie LVDS. Dans cette fonction :
Code :
- static void
- I830SetupOutputs(ScrnInfoPtr pScrn)
- {
- xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (pScrn);
- I830Ptr pI830 = I830PTR(pScrn);
- int o;
- /* everyone has at least a single analog output */
- i830_crt_init(pScrn);
- /* Set up integrated LVDS */
- if (IS_MOBILE(pI830) && !IS_I830(pI830))
- i830_lvds_init(pScrn);
- if (IS_I9XX(pI830)) {
- i830_sdvo_init(pScrn, SDVOB);
- i830_sdvo_init(pScrn, SDVOC);
- } else {
- i830_dvo_init(pScrn);
- }
- if (IS_I9XX(pI830) && !IS_I915G(pI830))
- i830_tv_init(pScrn);
-
- for (o = 0; o < config->num_output; o++)
- {
- xf86OutputPtr output = config->output[o];
- I830OutputPrivatePtr intel_output = output->driver_private;
- int crtc_mask;
- int c;
-
- crtc_mask = 0;
- for (c = 0; c < config->num_crtc; c++)
- {
- xf86CrtcPtr crtc = config->crtc[c];
- I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
- if (intel_output->pipe_mask & (1 << intel_crtc->pipe))
- crtc_mask |= (1 << c);
- }
- output->possible_crtcs = crtc_mask;
- output->possible_clones = i830_output_clones (pScrn, intel_output->clone_mask);
- }
- }
|
j'ai commenté ca :
Code :
- if (IS_MOBILE(pI830) && !IS_I830(pI830))
- i830_lvds_init(pScrn);
|
et la, miracle, ca marche : comme il ne detecte plus que 2 sorties , il me met automatiquement le pipe A sur VGA, et le pipe B sur TV, et j'ai bien les 2 images en meme temps sur les 2 ecrans. Par contre vu que je ne peux pas fixer la resolution de ma sortie VGA (qui reste en 1280x1024), la resolution de la TV etant 720x576, il me rogne l'image , et je n'ai pas tout sur la TV. Le seul moyen que j'ai trouvé pour avoir la meme image sur les 2 est de forcer le 640x480 sur ma sortie VGA (en mettant des parametres de moniteur tres faible expres), et du coup, j'ai egalement du 640x480 sur ma sortie TV.
Vous allez me dire, au final, ca marche, mais en fait ca ne me convient pas pour plusieurs raisons :
- je ne souhaite pas mettre un driver bancale (avec mon truc en commentaire bourrin) dans mon systeme, donc je prefererai une solution par configuration.
- je ne sais pas si ma bidouille marche avec la carte additionnelle permettant de gérer le DVI (et j'en aurai besoin).
Pour cela, je souhaiterai savoir si quelqu'un a déja configuré ce type de chipset sous linux et connaitrait un peu mieux les différents parametres à utiliser pour pouvoir :
- changer la resolution a souhait sur la sortie VGA
- configurer le VGA + TV en meme temps sans bidouiller le driver.
- existe-t-il une doc reellement complete expliquant le fonctionnement de xorg.conf, je n'ai trouvé que ca : http://www.x.org/archive/X11R6.8.0 [...] onf.5.html et je trouve que ca n'est pas suffisamment précis.
En espérant que quelqu'un pourra m'aider