Switch automatique entre écran Raspberry DSI officiel 7" et HDMI pour RECALBOX 7.x



  • Avec la v6.x de Recalbox, j'utilisais PINN (NOOBS-like) pour détecter si un écran HDMI était connecté à mon Raspberry en plus de l'écran DSI branché en permanence, et switcher automatique vers cet écran HDMI. Sinon, mon Raspberry bootait par défaut sur l'écran SDI.
    Recalbox 7.x n'étant pas intégré à PINN au moment où j'écris ces lignes, j'ai donc cherché un moyen d'intégrer le mécanisme natif de PINN directement dans Recalbox.

    N'ayant pas trouvé de réponse toute faite à mon problème, je m'y suis collé.
    La manière suivante n'est peut-être pas la plus propre, mais ça fonctionne.

    En cas de changement d'écran (SDI <-> HDMI) lors du démarrage de votre Recalbox, le boot est légèrement plus long puisque le script détecte ce changement, remplace le fichier de configuration /boot/config.txt par celui qui correspond à la nouvelle configuration et reboot pour l'appliquer.

    Cette mise en œuvre nécessite la création d'un répertoire et de 4 nouveaux fichiers.

    Je crée un répertoire /boot/switchscreen qui contient mes nouveaux fichiers. Pour cela, il faut d'abord passer la partition /boot en read/write :

    mount -o remount,rw /boot
    mkdir /boot/switchscreen
    

    je duplique le fichier /boot/config.txt afin d'apporter les modifications nécessaires à chaque configuration.

    Préparation du fichier dédié à l'écran Raspberry officiel branché en SDI :

    On copie le fichier d'origine fourni par Recalbox et on se contente d'ajouter la chaîne #select sdi en première ligne.
    L'ajou de cette première ligne permet au script de détection de savoir si on est déjà dans la bonne configuration ou non, et potentiellement éviter un reboot inutile.
    Si vous n'êts pas à l'aise avec la commande sed, utilisez votre éditeur préféré.

    cp /boot/config.txt /boot/switchscreen/boot/config.sdi
    sed -i '1 i\
    #select sdi' /boot/switchscreen/boot/config.sdi
    

    Pour ma part, j'ai dû ajouter la ligne lcd_rotate=2 pour forcer la rotation de l'affichage en fonction de la position de mon écran SDI dans son boitier.
    Cela reste optionnel.

    Préparation du fichier dédié à tout écran HDMI :

    Sur le même principe, on copie le fichier d'origine, on ajouter une première ligne contenant #select hdmi et les options nécessaires à la redirection vers la sortie HDMI.

    cp /boot/config.txt /boot/switchscreen/boot/config.hdmi
    sed -i '1 i\
    #select hdmi' /boot/switchscreen/boot/config.hdmi
    vi /boot/switchscreen/boot/config.hdmi
    ...
    # force hdmi while the tv can take time before sending the signal on the hdmi output
    display_default_lcd=0
    ignore_lcd=1
    hdmi_force_hotplug=1
    ...
    

    Si vous avez des besoins spécifiques, vous pouvez aussi les ajouter.

    Ajout du script de détection de la configuration :

    $ vi /boot/switchscreen/switchscreen.sh
    #!/bin/sh
    #script adapté du switchscreen de PINN
    #https://sourceforge.net/projects/pinn/files/screenswitch.zip/download
    
    #set -x
    
    logfile=/tmp/switchscreen.logfile
    
    pref="hdmi"
    config=""
    dsi=""
    hdmi=""
    
    #read the current configuration
    config=`cat /boot/config.txt | grep "^#select \(.*\)" | sed -e "s|#select \(.*\)|\1|"`
    echo "Current config=$config" >>$logfile
    
    #Check if  DSI touchscreen is attached
    if [ -e /sys/devices/platform/rpi_ft5406 ]; then
    	dsi="dsi"
    fi
    echo "dsi=$dsi" >>$logfile
    
    #Check if HDMI is attached
    hdminame=$(tvservice -v 2 -n 2>&1)
    echo -n "$hdminame" >>$logfile
    #remove any line feed
    echo -n $hdminame>/tmp/hdmi
    read hdminame</tmp/hdmi
    rm /tmp/hdmi
    if [ "$hdminame" != "[E] No device present" ]; then
    	hdmi="hdmi"
    fi
    echo "hmdi=$hdmi" >>$logfile
    
    default=$config #Choose this for a quicker boot if no display connected (keeps existing)
    #default="hdmi" #Choose this to force HDMI if no display connected.
    
    case $pref in
    dsi)
    	echo "case dsi" >>$logfile
    	if [ "$dsi" = "dsi" ]; then
    		wanted="dsi"
    	else
    		#echo "No display connected"
    		wanted="dsi" # to force dsi to be detected.
    	fi
    	;;
    hdmi)
    	echo "case hdmi" >>$logfile
    	if [ "$hdmi" = "hdmi" ];then
    		wanted="hdmi"
    	elif [ "$dsi" = "dsi" ]; then
    		wanted="dsi"
    	else
    		echo "No display connected" >>$logfile
    		wanted="dsi"
    	fi
    	;;
    *)
    	echo "Shouldn't get here!" >>$logfile
    	#echo "default"
    	wanted=$default
    	;;
    esac
    
    echo "comparing $config with $wanted" >>$logfile
    if [ "$config" = "$wanted" ];  then
    	echo "Keeping original config of $config" >>$logfile
    	echo "==================" >>$logfile
    else
    	echo "Switching to $wanted..." >>$logfile
    	mount -o remount,rw /boot
    	cp /boot/switchscreen/config.$wanted /boot/config.txt
    	sync
    	reboot
    fi
    sync
    

    Intégration de ce script dans le boot du système Recalbox :

    On crée ici un nouveau script de démarrage dans l'init du système Recalbox. Il exécutera notre script /boot/switchscreen/switchscreen.sh à chaque boot du système.

    mount -o remount,rw /
    vi /etc/init.d/S01switchscreen
    #!/bin/sh
    
    # Main
    if [ "$1" == "start" ]; then
      # detect and switch SDI<->HDM if necessary
      /boot/switchscreen/switchscreen.sh
    fi
    

    Et voilà. Un reboot et votre configuration va maintenant s'adapter en fonction des écrans branchés.
    Je vous laisse le soin de modifier l'ensemble suivant vos besoins et peut-être d'en proposer une meilleure version.

    En espérant que cela puisse aider certains d'entre vous 👍



Want to support us ?

251
Online

80.5k
Users

21.6k
Topics

158.2k
Posts