# [TIP] uvesafb et les cartes intel

## Mickael

Il est connu que les chipsets des cartes vidéos intel pour des écrans larges de type widescreen ont un BIOS boggé, qui ne reconnait pas la résolution native de votre écran. C'est mon cas avec une résolution de 1280x800. Uvesafb lit les résolutions qui sont décrites dans le bios, et par conséquent si la résolution de votre écran ne s'y trouve pas, uvesa ne fournira pas l'affichage que vous souhaitez.

Heureusement, vous avez à votre disposition deux outils : 855resolution et 915resolution, qui vont vous permettre de patcher votre bios afin d'y inclure la bonne résolution. C'est donc le couple XXXresolution/uvesafb qui vont faire le travail d'Intel. Ne vous en faite pas, lorsque vous serez sous X 915resolution n'alternera pas votre affichage, puisque depuis la version 2.0.0 des pilotes intel, ces derniers ne sont plus basés sur les informations contenues dans le BIOS de votre carte graphique. Comment faire :

Il vous faut suivre dans un premier temps les indications de Spock : 

mais attention, le point numéro 2 varie un tout petit peu, le pilote Graphics support ---> Userspace VESA VGA graphics support doit être compilé en tant que module (M) et non pas en dur (* ou y). 

le site : http://dev.gentoo.org/~spock/projects/uvesafb/

Maintenant installer XXXresolution. Ceci fait, vous devez configurez correctement /etc/conf.d/915resolution suivant vos besoins. Exemple qui concerne mon portable DELL inspiron 6400 :

```
 915resolution -l

Intel 800/900 Series VBIOS Hack : version 0.5.3

Chipset: 945GM

BIOS: TYPE 1

Mode Table Offset: $C0000 + $269

Mode Table Entries: 36

Mode 30 : 640x480, 8 bits/pixel

Mode 32 : 800x600, 8 bits/pixel

Mode 34 : 1024x768, 8 bits/pixel

Mode 38 : 1280x1024, 8 bits/pixel

Mode 3a : 1600x1200, 8 bits/pixel

Mode 3c : 1920x1440, 8 bits/pixel

Mode 41 : 640x480, 16 bits/pixel

Mode 43 : 800x600, 16 bits/pixel

Mode 45 : 1024x768, 16 bits/pixel

Mode 49 : 1280x1024, 16 bits/pixel

Mode 4b : 1600x1200, 16 bits/pixel

Mode 4d : 1920x1440, 16 bits/pixel

Mode 50 : 640x480, 32 bits/pixel

Mode 52 : 800x600, 32 bits/pixel

Mode 54 : 1024x768, 32 bits/pixel

Mode 58 : 1280x1024, 32 bits/pixel

Mode 5a : 1600x1200, 32 bits/pixel

Mode 5c : 1920x1440, 32 bits/pixel

```

Dans cette liste, on choisie un mode qui ne nous sert à rien, et je choisis le Mode50 : 640x480, 32 bits/pixel. Maintenant on se dirige dans le fichier de configuration de 915resolution, /etc/conf.d/915resolution : 

 *Quote:*   

> # Copyright 1999-2006 Gentoo Foundation
> 
> # Distributed under the terms of the GNU General Public License v2
> 
> # $Header: /var/cvsroot/gentoo-x86/sys-apps/915resolution/files/confd,v 1.3 2007/04/17 16:52:24 genstef Exp $
> ...

 

Comme vous pouvez le voir c'est assez explicite, dans mon cas je fais un :

```
replace="'50 1280 800 24'"
```

 c'est pas la peine de tenter le diable avec une profondeur en 32 bits, pour le framebuffer, le mode 24 bits suffira. 

Pour que l'ensemble fonctionne, il faut que 915resolution patch votre BIOS au démarrage et avant que le module uvesafb ne soit lancé. On place le service 915resolution au boot: 

```
eselect rc add 915resolution boot 

Adding 915resolution to following runlevels

  boot                      [done]

```

Passons à uvesafb. Il vous faut créer le fichier /etc/modules.d/uvesafb et y spécifier ces options : 

```
options uvesafb mode=1280x800-24 mtrr=3 scroll=ywrap vbemode=348
```

 Comment optenir l'option vbemode. C'est très simple : 

```
emerge pv lrmi
```

```
 vbetest 

VBE Version 3.0

Intel(r) 82945GM Chipset Family Graphics Chip Accelerated VGA BIOS

[261] 1024x768 (256 color palette)

[279] 1024x768 (5:6:5)

[280] 1024x768 (8:8:8)

[274] 640x480 (8:8:8)

[276] 800x600 (5:6:5)

[277] 800x600 (8:8:8)

[257] 640x480 (256 color palette)

[259] 800x600 (256 color palette)

[273] 640x480 (5:6:5)

Type a mode number, or 'q' to quit - q

```

On charge 915resolution : 

```
/etc/init.d/915resolution start

915resolution     | * Caching service dependencies ...                                                               [ ok ]

915resolution     | * Patching video BIOS with new video modes ...                                             [ ok ]
```

```
 vbetest 

VBE Version 3.0

Intel(r) 82945GM Chipset Family Graphics Chip Accelerated VGA BIOS

[261] 1024x768 (256 color palette)

[279] 1024x768 (5:6:5)

[280] 1024x768 (8:8:8)

[274] 1280x800 (8:8:8)

[276] 800x600 (5:6:5)

[277] 800x600 (8:8:8)

[257] 1280x800 (256 color palette)

[259] 800x600 (256 color palette)

[273] 1280x800 (5:6:5)

Type a mode number, or 'q' to quit - q

```

C'est le mode 274 qui nous intéresse. :

```
options uvesafb mode=1280x800-24 mtrr=3 scroll=ywrap vbemode=274
```

Maintenant il suffit de lancer le module uvesafb après 915resolution lors du boot :

nano /etc/init.d/uvesafb :

```
#!/sbin/runscript

depend() {

        # uvesafb doit être chargé après 915resolution

        after 915resolution

        before xdm

   before consolefont

}

start() {

        # affiche un message sur ce qui est fait

        ebegin "Starting uvesafb"

        # Lance le module

        modprobe uvesafb mode=1280x800-16@60 || retval=$? #pour des noyaux < 2.6.27

!!!OU ALORS!!!

        modprobe uvesafb mode_option=1280x800-16@60 || retval=$? #pour de noayaux =/> 2.6.27

        # Affiche le succès ou l'échec

        eend $ {retval}

}

```

Pis voilà, maintenant je vais tester ce que je viens d'écrire, et je corrigerai.  :Smile:  !!

Dernier point : Il est inutile de configurer grub avec video=etcetc.

EDIT : alors cela fonctionne. Mais je me suis rendu compte que cela était également décrit pour un eepc sur le wiki. J'ai repris de ce Wiki le script d'init. Par contre je me demande si le fichier dans modules.d est nécessaire puisque l'on passe les options du module dans le fichier d'init.

----------

## UB|K

Salut,

pour info, on peut faire encore mieux: un bô gensplash directement en 12800x800 (ou autres résolutions non-standard qui nous ont tant fait suer avec nos pauvres cartes intel).

En gros, il s'agit d'inclure directement une partie du code de 915resolution dans v86d et d'inclure l'initramfs produit par ce dernier dans le noyau. On peut alors mettre des options type "video=uvesafb:1280x800-24" dans le bootloader sans que le noyau soit perdu et ainsi bénéficier dès les premiers instants du boot d'un frame-buffer dans la résolution native de l'écran.

Bon, c'est un peu confus mon truc mais si ça intéresse quelqu'un, j'essayerai de retrouver le post qui parle de ça et d'en faire une traduction un peu plus consistante...

----------

## Mickael

Ha mais te gênes pas!

----------

## UB|K

Voilou, j'ai retrouvé le post en question. D'après l'auteur, c'est un hack un peu crade mais j'aime bien   :Twisted Evil:  . La marche à suivre est la suivante:

1. Patcher v86d

 Copier l'eduild de sys-app/v86d dans un overlay

Décompresser 915resolution quelque part et copier 915resoltion.c dans ${FILESDIR}

Copier dans ${FILESDIR} le patch quivabien (de son petit nom: v86d-915.patch):

```
diff -Naur v86d-0.1.2/Makefile v86d-0.1.2.new/Makefile

--- v86d-0.1.2/Makefile   2007-11-04 17:00:20.000000000 +0200

+++ v86d-0.1.2.new/Makefile   2007-11-08 12:15:14.000000000 +0200

@@ -39,7 +39,7 @@

 %.o: %.c v86.h

    $(CC) $(CFLAGS) -c -o $@ $<

 

-v86d: v86.o v86_common.o $(V86OBJS)

+v86d: v86.o v86_common.o 915resolution.o $(V86OBJS)

    $(CC) $(LDFLAGS) $+ $(LDLIBS) -o $@

 

 testvbe: testvbe.o v86_common.o $(V86OBJS)

diff -Naur v86d-0.1.2/v86.c v86d-0.1.2.new/v86.c

--- v86d-0.1.2/v86.c   2007-11-04 17:00:20.000000000 +0200

+++ v86d-0.1.2.new/v86.c   2007-11-08 12:19:52.000000000 +0200

@@ -61,6 +61,8 @@

 }

 

 

+int main_915(int argc, char *argv[]);

+

 int main(int argc, char *argv[])

 {

    char buf[CONNECTOR_MAX_MSG_SIZE];

@@ -69,6 +71,10 @@

    struct sockaddr_nl l_local;

    struct cn_msg *data;

    struct pollfd pfd;

+   char *args_915[] = {"915resolution", "58", "1280", "800", "32", 0};

+    

+   /* Hacking i915 bios */

+   main_915(5, args_915);

 

    s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);

    if (s == -1) {

```

 Modifer le patch (29ème ligne) afin que 915resolution s'occupe du bon mode (dans mon cas je modifie le mode 58 pour qu'il marche en 1280x800-32)

Modifier l'ebuild de la façon suivante:

    - ajouter "eutils" à "inherit ..." pour que portage comprenne la commande "epatch"

    - copier 915resolution et le patch en ajoutant

```
cp ${FILESDIR}/915resolution.c ${S}/

epatch ${FILESDIR}/v86d-915.patch
```

 refaire le digest de tout ça et emerger v86d

2. Ajouter l'initramfs de v86d au kernel

modifier:

```
General setup  --->

      CONFIG_INITRAMFS_SOURCE
```

afin que ça pointe sur "/usr/share/v86d/initramfs"

recompiler le kernel et l'installer

3. Configuer GRUB

Maintenant, on peut utiliser uvesafb dans une résolution non-standard dès le boot soit dans mon cas (1280x800 32bits):

```
kernel /boot/kernel-2.6.25-tuxonice root=/dev/sda1 video=uvesafb:1280x800-32,mtrr:3,ywrap blahblah...
```

voire éventuellement les options qui concernent gensplash si l'on a pris soin de créer un initrd contenant un thème dans la résolution choisie.

4. Banzai

Reboot et sous vos yeux ébahis, un splash (ou juste la console si vous n'aimez pas gensplash) dans la résolution native de votre écran wide.

----------

## Mickael

C'est beau!  :Crying or Very sad:   merci !

----------

## geekounet

Je confirme, ça fonctionne chez moi  :Smile: 

Par contre en plus de ça, j'ai du patcher 915resolution.c pour le support des Intel 965GM, et tout passe ensuite  :Smile: 

L'ebuild est ici (par contre ça va bouger de place dans qq temps pour l'url, changement de dépot  :Razz: ), mais par contre le patch force du 1280x800-32 en dur, c'est pas suffisamment souple, donc faut modifier le patch au besoin. Je tenterai à l'occasion de coder un truc propre par dessus, voire intégrer 915resolution dans uvesafb lui-même.  :Razz: 

----------

## UB|K

 *geekounet wrote:*   

> Je confirme, ça fonctionne chez moi 
> 
> Par contre en plus de ça, j'ai du patcher 915resolution.c pour le support des Intel 965GM, et tout passe ensuite 
> 
> L'ebuild est ici (par contre ça va bouger de place dans qq temps pour l'url, changement de dépot ), mais par contre le patch force du 1280x800-32 en dur, c'est pas suffisamment souple, donc faut modifier le patch au besoin. Je tenterai à l'occasion de coder un truc propre par dessus, voire intégrer 915resolution dans uvesafb lui-même. 

 

Sur que le fait que le mode soit renseigné directement dans le patch c'est pas pratique. J'avais réfléchi vite fait à une solution un peu plus propre et je pense que le plus simple serait d'avoir une variable dans le make.conf (style 915_MODE="58 1280 800 32") qui spécifie le mode, la résolution à patcher afin de modifier directement le patch à gros coup de sed avant de l'appliquer...

Bon, après c'est pas si simple que ça: j'ai déjà pas réussi à récupérer correctement ma variable lors de l'emerge alors j'ai laissé tout ça en plan. Puis à l'usage, comme v86d n'est pas mis à jour trop fréquemment  je n'ai eu à faire la manip' qu'une seule fois donc à part pour la beauté du geste c'est pas vraiment vital de trouver un solution plus propre (feignasse inside   :Embarassed:  ).

Par conte, à l'occaz', ça pourrait être bien de traduire tout ça en anglais car cette astuce est passée complètement inaperçue chez nos amis anglophones: suffit de voir les gens galérer avec la solution 'uvseafb en module' sur le thread UvesaFB ...

----------

## geekounet

Je voyais mieux une solution du genre l'intégrer à uvesafb et y rajouter une option kernel spéciale 915resolution, ça serai carrément plus souple.  :Smile: 

----------

## Pixys

On peut utiliser cette méthode pour un ecran 1680x1050 sur une carte nvidia ?

----------

## geekounet

 *Pixys wrote:*   

> On peut utiliser cette méthode pour un ecran 1680x1050 sur une carte nvidia ?

 

Non, c'est que avec Intel, et avec des drivers libres qui sentent bon.  :Smile: 

----------

## Mickael

Pour être un peu plus précis par rapport à la réponse de Geekounet : les méthodes décrites ici avec 915resolution ne fonctionnent que pour du matos Intel. Par contre tu peux jetter un oeil sur le forum ainsi que sur bgo car uvesafb fonctionne également avec les autres modèles de carte : ATI NVIDIA SIS etc. Ta résolution tu ne l'auras qu'à la seule condition quelle soit implantée dans le BIOS. Nous utilisons 915resolution pour patcher temporairement, lors du démarrage, nos BIOS car Intel+ConstructeurPC(exemple DELL)  n'implémentent pas nos résolutions d'écrans .... c'est balo. Vendre un portable en 1280x800 et écrire un bios en 800x600 1024x780 c'est tout de même un peu con...

Enfin, ça ne fonctionne plus pour moi et un saut sur bgo ne m'a pas aidé, malgré un bug ouvert. Qui confirme svp.

----------

## geekounet

Chez moi tout fonctionne toujours. J'ai refait mon propre patch proprement, qui corrige à la fois pour le 1280x800 et le 1440x900. Ya un ebuild tout fait dans mon overlay (layman -a akoya) pour ceux qui ne veulent pas se prendre la tête, suffit juste de rajouter le use 915resolution_hack sur v86d et de le réemerger.  :Smile: 

EDIT: ha c'est vrai que j'en avais déjà un peu causé plus haut de mon ebuild.  :Razz: 

----------

## Mickael

Dit geekounet, par rapport à mon premier poste j'ai des trucs à changer si j'applique ton patch ?

----------

## geekounet

Bah heu, en gros avec mon patch, 915resolution est en dur dans v86d, comme ce qu'a proposé UB|K, donc tu peux mettre uvesafb en dur si t'as envie, et il faut juste recompiler un coup ton kernel pour y ré-inclure le v86d patché dans l'initramfs.  :Smile:  Et dans les arguments du kernel dans grub, tu mets ton video=uvesafb:1280x800-32,mtrr:1,ywrap comme d'habitude (à adapter bien sur), et pas de 915resolution à lancer au boot du coup aussi.  :Smile: 

Et ça fonctionne au moins chez kopp et moi si ça peut te rassurer.  :Razz: 

----------

## Mickael

 *Mickael wrote:*   

> Pour être un peu plus précis par rapport à la réponse de Geekounet : les méthodes décrites ici avec 915resolution ne fonctionnent que pour du matos Intel. Par contre tu peux jetter un oeil sur le forum ainsi que sur bgo car uvesafb fonctionne également avec les autres modèles de carte : ATI NVIDIA SIS etc. Ta résolution tu ne l'auras qu'à la seule condition quelle soit implantée dans le BIOS. Nous utilisons 915resolution pour patcher temporairement, lors du démarrage, nos BIOS car Intel+ConstructeurPC(exemple DELL)  n'implémentent pas nos résolutions d'écrans .... c'est balo. Vendre un portable en 1280x800 et écrire un bios en 800x600 1024x780 c'est tout de même un peu con...
> 
> Enfin, ça ne fonctionne plus pour moi et un saut sur bgo ne m'a pas aidé, malgré un bug ouvert. Qui confirme svp.

 

Depuis la version 27 des noyaux, il faut mettre   modprobe uvesafb mode_option=1280x800-16@60 scroll=ywrap || retval=$? en lieu et place de option, et ça roule.

Enjoy.

----------

