dimanche 12 février 2012

La puce graphique Intel i810

À chaque fois que je parle d'un truc technique, je pers confiance en moi car je sais que je n'ai ni les connaissances ni le vocabulaire nécessaire/suffisant.
C'est un peu comme si je savais à la fois que ce que je dis est vrai que je ne sais absolument pas de quoi je parle.

Aujourd'hui donc je vais parler de quelque chose que je maîtrise affreusement mal (comme tout le reste en informatique) le framebuffer.

J'ai la (mal)chance d'avoir un petit tas d'ordinateur ici qui ne possèdent rien d'autre qu'une puce Intel i810 pour l'affichage.
En vérité, le nom de la puce qui apparaît lorsque l'on fait un lspci est tout autre, mais à grand coup de recherches sous DuckDuckGo, j'ai fini par comprendre qu'il s'agissait d'une i810.

Le défaut du driver fourni par Intel (pour Xorg) est qu'il ne donne aucun accès au framebuffer. Ce n'est pas un secret, Intel le dit lui même sur son site (j'ai la flemme de refaire les recherches nécessaires pour vous le prouver).
Par dessus tout, le support pour Mesa a été retiré récemment (ainsi que pour d'autres appareils) donc le support pour la 3D (aussi maigre soit il) se voit lui aussi amputé.

Apparemment l’intérêt du framebuffer est que des applications graphiques peuvent communiquer directement avec le matériel sans passer par un serveur X pour afficher quelque chose, ce qui rendrait tout plus rapide. Le projet MESS prétend pouvoir atteindre des gains de performances jusqu'à 300% en utilisant le framebuffer plutôt que X pour l'affichage.

J'ai récemment découvert que quelques années plus tôt, quelqu'un s'était penché sur la question et avait fait un driver pour avoir accès au framebuffer du i810. Le driver fait partie du noyau GNU/Linux (depuis la version 2.6 ce celui-ci) en tant que module sous le nom "i810fb".

Le petit problème étant que le périphérique /dev/fb0 n'est pas créé au démarrage du système. Un modprobe i810 ne mène donc à rien puisqu'il n'y a pas de périphérique à initialiser/utiliser.
Il faut donc créer le périphérique à la main en utilisant la commande mknod /dev/fb0 c 29 0.

Malheureusement, une fois l'ordinateur redémarré, il faut tout recommencer.
J'ai donc modifié mon fichier /etc/rc.local pour contenir les lignes suivantes :
mknod /dev/fb0 c 29 0
modprobe i810fb

Ainsi, le framebuffer est activé automatiquement à chaque démarrage de l'ordinateur.

Comment être certain que cela fonctionne ? Il suffit de lire une vidéo avec MPlayer en utilisant le paramètre -vo fbdev2. La vidéo s'affiche en mode console, sans avoir besoin de X.