Club robotique de Sophia-Antipolis

Accueil > POBOTpedia > Ordinateurs embarqués (SBC) > La carte Raspberry PI > Où est passée ma sortie vidéo HDMI ?

Où est passée ma sortie vidéo HDMI ?

lundi 16 décembre 2013, par Eric P.

Ca fait plusieurs fois que la chose m’arrive : au bout d’un moment de fonctionnement, plus d’image sur le moniteur connecté à la sortie HDMI de la RasPi. Je ne m’en suis pas plus préoccupé que cela pour plusieurs raisons :
 mis sur le compte d’un faux-contact au niveau du câble ou des connecteurs,
 mis sur le compte de la qualité de l’écran (un de ces mini-téléviseurs plats vendus à moins de 100 Euros en grande surface)
 ça ne me dérangeait pas plus que cela, étant donné que j’utilise mes RasPi en mode headless, et que la première chose que je fais après installation est de désactiver le démarrage de l’environnement graphique et d’allouer le minimum de mémoire possible à la carte graphique

Ceci étant, c’est intellectuellement frustrant de ne pas savoir de quoi il retourne exactement.

Qu’en est-il réellement ?

En fait, il semble que ce ne soit pas du tout une panne, mais tout simplement le système d’économie d’écran, qui existe également pour les consoles texte. Pour s’en persuader, il suffit de jeter un oeil sur la documentation de la commande setterm et plus précisément sur l’option -blank :

-blank [0-60|force|poke] (virtual consoles only)
  Sets the interval of inactivity, in minutes, after which the 
  screen will be automatically blanked (using APM if available).  
  Without an argument, gets the  blank  status (returns which 
  vt was blanked or zero for unblanked vt).

Sherlock Holmes au travail

Regardons si quelqu’un n’utiliserait pas setterm quelque part lors de l’initialisation. Comme il y a de fortes chances que cela se passe dans l’un des scripts d’init, allons faire un tour dans /etc/init.d et tentons un grep setterm *. Le résultat est intéressant :

pi@raspberrypi /etc/init.d $ grep setterm *
kbd:    setterm_args=""
kbd:        setterm_args="$setterm_args -blank $BLANK_TIME"
kbd:        setterm_args="$setterm_args -powersave $BLANK_DPMS"
kbd:        setterm_args="$setterm_args -powerdown $POWERDOWN_TIME"
kbd:    if [ "$setterm_args" ]; then
kbd:        setterm $setterm_args 

En allant voir ce qui se passe dans le script kbd, on tombe sur ceci :

182     # screensaver stuff
183     setterm_args=""
184     if [ "$BLANK_TIME" ]; then
185         setterm_args="$setterm_args -blank $BLANK_TIME"
186     fi
187     if [ "$BLANK_DPMS" ]; then
188         setterm_args="$setterm_args -powersave $BLANK_DPMS"
189     fi
190     if [ "$POWERDOWN_TIME" ]; then
191         setterm_args="$setterm_args -powerdown $POWERDOWN_TIME"
192     fi
193     if [ "$setterm_args" ]; then
194         setterm $setterm_args
195     fi
196 

Cela confirme l’hypothèse d’un économiseur d’écran, qui est donc piloté entre autres par la variable d’environnement BLANK_TIME.

Cherchons donc maintenant où et comment elle est initialisée. Ce genre de chose peut être réalisé par un script stocké dans /etc/default. La commande grep BLANK_TIME * ne donne cependant aucun résultat. Remontons d’un cran pour ratisser plus large, et depuis /etc tentons un sudo grep -r BLANK_TIME * (notez bien l’option -r qui effectue un parcours récursif des sous-répertoires). La commande est passée en sudo car certains répertoires et fichiers ont des droits d’accès limités. Le résultat est le suivant :

pi@raspberrypi /etc $ sudo grep -r BLANK_TIME *
init.d/kbd:    if [ "$BLANK_TIME" ]; then
init.d/kbd:        setterm_args="$setterm_args -blank $BLANK_TIME"
kbd/config:BLANK_TIME=30
kbd/config:# blanking method (VESA DPMS mode to use after BLANK_TIME, before powerdown):
kbd/config:# minutes _after_ blanking.  (POWERDOWN_TIME + BLANK_TIME after the last input)

Le hit dans init.d/kbd est déjà connu de nos services, mais le second dans kbd/config confirme toutes nos suppositions (aux environ des lignes 30 à 40) :

#  **** screen saver/DPMS settings: all VCs ****
# These settings are commented by default to avoid the chance of damage to
# very old monitors that don't support DPMS signalling.
  
# screen blanking timeout.  monitor remains on, but the screen is cleared to
# range: 0-60 min (0==never)  kernels I've looked at default to 10 minutes.
 # (see linux/drivers/char/console.c)
BLANK_TIME=30

Conclusion

Certains sites web proposent de modifier /etc/rc.local en y ajoutant la ligne setterm -blank 0, mais il est finalement beaucoup plus propre de modifier le fichier de configuration /etc/kbd/config qui est précisément fait pour cela.

Maintenant, je suis rassuré sur l’état de santé du port HDMI de ma RasPi, dont l’extinction ne devait rien à une défaillance matérielle.

Bonus

Et que faire pour rallumer la sortie HDMI si l’économiseur a déjà fait sont oeuvre ?

Très simple : utiliser la commande tvservice avec l’option -p.

Son effet est de configurer la sortie HDMI avec les prefered settings, c’est à dire ceux qui auront été déterminés au démarrage par analyse des informations retournées par le moniteur connecté (pour peu qu’il soit poli et qu’il sache retourne des EDID et qu’elles soient valides). Il faudra également re-activer le framebuffer en passant la commande fbset -depth 8. Si ça ne marche pas, essayez avec 16 au lieu de 8, car ça peut varier en fonction de la résolution de votre écran.

Un message, un commentaire ?

modération a priori

Attention, votre message n’apparaîtra qu’après avoir été relu et approuvé.

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.