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
-
@ZeckFR bonjour,
Je souhaite faire la même chose que toi, mais il y a plusieurs que je ne maîtrise pas.
J'essaie de suivre ton tuto sous lubuntu.
J'arrive à créer un répertoire "switchscreen" dans le répertoire "RECALBOX/boot".Ensuit, si j'ai bien compris, il faut copier le fichier config.txt et ajouter la ligne #select hdmi et enregistrer ce nouveau fichier avec l'extension .sdi?
Mais après ça, je suis trop débutant pour comprendre les autres étapes. Notamment, l'ajout du script et son intégration... Là je suis perdu !
Est-ce possible d'avoir de l'aide ?
Merci d'avance.
-
@ZeckFR bonjour,
Je me permets de te relancer car je n'ai eu aucun retour de ta part.J'ai réussi à faire tout ce que tu as décris, mais lorsque je connecte une télé ou un écran en hdmi, la framboise apparait bien à l'écran, mais le boot de Recalbox continu sur le DSI et l'écran hdmi rest noir. on voit qu'il reçoit un signal, mais recalbox tourne uniquement sur le DSI.
J'ai vraiment besoin d'un ptit coup de main parce que je passe un temps fou à chercher une solution en vain.
En espérant avoir de l'aide!
Merci
-
Bonjour @JC17
Je ne découvre tes messages qu'aujourd'hui, n'ayant pas reçu de notification par mail et n'allant que très rarement sur le forum...
Je découvre aussi quelques erreurs dans mon pseudo-tutorial en tentant de l'implémenter sur une autre plateforme... (des inversion de sdi/dsi, comme dans l'article, mais je n'arrive pas à l'éditer pour le corriger...)L'idée générale est de créer 2 templates de fichier de configuration, l'un pour l'écran 7" et l'autre pour fonctionner en HDMI.
On ajoute ensuite un script qui sera exécuté à chaque démarrage pour détecter si un écran HDMI est branché ou non, et qui change donc le fichier de configuration en fonction de cet état, puis reboot si nécessaire.
Ca passe par l'intégration du script /boot/switchscreen/switchscreen.sh (qui fait la détection) et l'ajout d'un script d'init dans la phase de boot de ton système (/etc/init.d/S01switchscreen) qui lance le script de détection.
J'aurai pu ne faire qu'un script, mais les init scripts sont écrasés lors des mises à jour, il faudrait donc tout refaire à chaque fois...Pour tester que la configuration "HDMI forcée" fonctionne, tu peux supprimer le script d'init /etc/init.d/S01switchscreen et copier le fichier /boot/switchscreen/config.hdmi en lieu et place du fichier /boot/config.txt.
Si ca fonctionne comme attendu (display & son sur HDMI), cela confirmera que la configuration est bonne et qu'il faut juste adapter le script de détection...Normalement, tu devrais obtenir un fichier de log ici : /tmp/switchscreen.logfile
Sinon, pour comprendre un peu ce qui se passe, via ssh, décommente le 'set -x' au début du script /boot/switchscreen/switchscreen.sh et donne le résultat.
Lance aussi la commande 'tvservice -l'. Il faudra peut-être adapter le script en conséquence...Je vais surveiller le forum et ce post dans les jours qui viennent pour essayer de t'apporter mon aide.
Vraiment désolé pour le délai... -
@zeckfr Bonjour et merci pour ta réponse.
De la même manière que toi, je viens de constater qu'à l'instant ta réponse (c'est dommage qu'il n'y ait pas de notification de message).
En fait, j'ai contourné le problème en mettant un interrupteur sur l'alim de l'écran. Du coup, je peux soit démarrer sur le DSI soit sur HDMI. Mais je suis obligé d'éteindre et redémarrer si je souhaite passer d'écran à un autre.
Mon souci aujourd'hui (qui est partagé par beaucoup !) est lié à la mise à jour 7.2 de RECALBOX.
Il n'y a pas de détection du DSI et c'est très agaçant.Peut-être aurais-tu une idée ?