2015-03-30 2 views
4

Donc, je peux utiliser "tvservice -o" pour éteindre le HDMI sur le framboise Pi, et "tvservice -p" pour le rallumer. Après l'avoir rallumé, je dois apparemment faire "fbset -depth 8 & & fbset -depth 16" pour réactiver le tampon d'image, puis forcer un rafraîchissement X11.Comment désactiver/activer HDMI sur Raspberry Pi?

Ma question est, comment puis-je faire cela en C? J'ai une application X11 et je peux gérer le X11 retracer pas de problème, mais comment désactiver/re-activer HDMI en C, et comment puis-je réactiver le tampon de trame après ré-activation HDMI? Pour donner un arrière-plan, j'ai une application sans tête fonctionnant comme une sorte de serveur multimédia, contrôlée par une application Android. Actuellement, je suis en train de désactiver définitivement l'extinction de HDMI après un délai d'attente. Cependant, pour économiser de l'énergie, je voudrais désactiver le HDMI lorsque l'application n'est pas utilisée, puis le rallumer et afficher l'application RPi à l'écran en utilisant libcec pour déterminer quand le téléviseur utilise la connexion HDMI du RPi pour allumer HDMI et de.

Répondre

3

Si vous voulez aller pur C, regardez le code source pour tvservice, qui est un programme C. Il peut être trouvé at github. Il semble utiliser la fonction vc_tv_hdmi_power_on_preferred(); définie dans #include "interface/vmcs_host/vc_tvservice.h"

Si vous décidez d'appeler le programme tvservice comme dans la réponse de @ moffeltje, vous pouvez utiliser le execl() il est un peu plus sûr - vous devez donner le chemin complet vers le binaire. (Avec execlp, vous pouvez également avoir le contrôle sur les variables d'environnement):

pid_t pid; 


pid = fork(); 
if (0 == pid) { 
    execl("/opt/vc/bin/tvservice", "-p", NULL); 
} 
if (-1 == pid) { 
    // Handle error here, close program? 
} 
+0

Lovely, merci. Une idée où trouver le code source pour fbset? Je suppose qu'il utilise ioctls et sans la documentation ou le code d'exemple sur le dispositif de tampon de trame, je suis un peu coincé. – AlastairG

+0

@AlastairG, oui, il * devrait * être dans le paquet util-linux: https: //www.kernel.org/pub/linux/utils/util-linux/mais sinon, google pour ça, il y a une implémentation de busybox aussi. –

0

Vous pouvez utiliser la commande system() pour utiliser les commandes que vous avez décrites.

int main(){ 

    //some code before disable hdmi 
    system("tvservice -o"); 

    //do somethings when HDMI is disabled 

    //turn HDMI back on 
    system("tvservice -p"); 
    system("fbset -depth 8 && fbset -depth 16"); 

    return 0; 

} 
+0

En règle générale, j'évite le système. Je préfère execl() etc, mais de préférence je préfère intégrer la fonctionnalité dans mon propre programme. – AlastairG

0

J'ai trouvé

xset dpms force on 

pour rafraîchir les choses Xorg après avoir fait une -o tvservice et le ramener avec tvservice -p . Le faire de manière fbset n'a pas très bien fonctionné pour moi.

+0

J'ai demandé comment le faire en C, pas de script/ligne de commande. – AlastairG

-1

J'ai eu les meilleurs résultats avec cec-client.

sudo apt install cec-utils

Eteignez le moniteur:

echo "standby 0" | cec-client -s -d 1

tour moniteur:

echo "on 0" | cec-client -s -d 1

+0

J'ai demandé comment le faire en C, pas de script/ligne de commande. De plus, cela envoie simplement des commandes CEC et ne change pas réellement l'état physique du port HDMI (AFAIK). – AlastairG

0

De https://gist.github.com/AGWA/9874925 j'ai trouvé l'utilité de chvt. Donc, je suggère d'appeler les commandes shell

hdmioff() { tvservice -o; } 
hdmion() { tvservice -p; sudo chvt 1; sudo chvt 7; } 

avec system().