Je viens de récupérer un vieil écran cathodique datant d’un autre temps et de marque Zenith Data Systems ; celui-ci chauffe un peu mais a le mérite de toujours fonctionner et d’avoir une luminosité plutôt correcte.
Le problème c’est que celui-ci ne fonctionne pas de base sous Linux. Analysons le pourquoi du comment.
Premiers tests
Le BIOS et le bootloader s’affichent correctement sur l’écran au démarrage.
Cependant lors du boot, Linux va passer en 1024x768 sans vraiment comprendre que l’écran ne supporte pas une telle résolution, ce qui provoque ce genre d’affichage :
Après plusieurs essais à coup de xrandr on remarque que cet écran est fait pour supporter une résolution de 640x480 au maximum.
On peut essayer de forcer Linux à rester dans ce mode en allant modifier la configuration de GRUB2 avec les paramètres GRUB_GFXMODE et GRUB_PAYLOAD_LINUX mais sans trop de succès : en effet GRUB2 va bien lancer le noyau dans cette résolution mais celui-ci va par la suite, après avoir chargé quelques modules, repasser en 1024x768.
Essayons de comprendre ensemble pourquoi cela ne fonctionne pas.
Le protocole EDID
Ou encore Extended Display Identification Data.
Ce protocole est utilisé pour faire communiquer les cartes/chipsets graphiques et les écrans afin de s’échanger des informations utiles qui sont stockées dans une (EE)PROM dans l’écran.
Parmis ces informations on peut retrouver :
- La référence de l’écran ;
- Le nom de son constructeur ;
- Les résolutions disponibles avec la fréquence de rafraichissement associée ainsi que la profondeur des couleurs ;
- Et d’autres paramètres.
Ces informations transitent par un Display Data Channel qui est une variante d’I2C, et qui passe par quelques pins du port VGA 15 broches.
Cependant si on regarde bien le connecteur VGA de l’écran on remarque facilement que ces pins ne disposent pas de broches correspondantes pour faire transiter ces informations.
Et KMS dans tout ça
KMS, pour Kernel Mode Setting est l’utilitaire noyau qui va s’occuper de changer la résolution au début du processus de démarrage afin d’utiliser la meilleure résolution possible pour afficher le reste des messages de boot.
Sauf que, vous l’aurez deviné, pour trouver la meilleure résolution KMS va tenter d’utiliser le protocole EDID. Et c’est lui qui va se rabattre sur une résoltion de 1024x768 si l’écran n’implémente pas ce protocole.
À mon avis il aurait été plus malin d’utiliser une résolution plus petite si l’écran ne dispose pas de ce protocole pour être sur que l’affichage sera fonctionnel même sur de très vieux écrans.
La solution : désactiver KMS !
Cette solution provenant du wiki Archlinux, bien que brutale, fonctionne parfaitement bien.
Comme écrit dans le wiki, il faut ajouter quelques options à la ligne de commande lançant notre noyau.
On va tout d’abord essayer de le faire lors du boot pour vérifier que tout fonctionne. Lors du démarrage de GRUB2 il faut appuyer sur la touche c pour pouvoir éditer l’entrée de boot et ainsi rajouter les options de démarrage à notre noyau.
Voici les deux options rajoutées après le quiet :
[...] ro quiet nomodeset i915.modeset=0
Le nomodeset est l’option de base, i915.modeset=0 est à rajouter si vous possédez un chipset graphique Intel®. Attention, l’éditeur de GRUB est paramétré pour les claviers QWERTY par défaut.
Un appui sur F10 pour lancer le noyau avec ces paramètres. Après voir défiler les premières lignes de chargement on constate que contrairement à avant le reste des lignes défile et la résolution reste la même !
Si le boot se fait également en 1024x768 par défaut (ce qui n’est pas le cas sous Archlinux mais sur le CD d'’nstallation de Debian par exemple), il faudra également rajouter dans cette ligne un mode VGA de 600x400 comme par exemple le mode vga=785 pour du 600x400 16 bits.
Le noyau garde bien maintenant la résolution fixée par GRUB2 au démarrage, il ne reste plus qu’à éditer la configuration de GRUB2 (dans /etc/default/grub) pour rendre cette modification permanente en ajoutant les options de désactivation sur la ligne de chargement du noyau.
Et pour Xorg ?
Si vous voulez éviter que Xorg essaye lui-aussi de déduire la résolution adéquate par lui-même, vous pouvez invoquer xrandr comme ceci :
xrandr --output default --mode 640x480
Que vous pouvez placer au début de votre .xinitrc.
Si vous utilisez Openbox en procédant de la sorte les fenêtres seront très bizarres car le changement de résolution aura eu lieu trop tôt. Il faut alors invoquer cette commande dans le fichier autostart de Openbox plutôt que dans le .xinitrc pour laisser le temps à Openbox d’adapter sa résolution.