如何在Raspberry Pi上禁用/启用HDMI?

时间:2015-03-30 07:35:16

标签: c raspberry-pi hdmi

所以我可以使用“tvservice -o”来关闭覆盆子Pi上的HDMI,并使用“tvservice -p”将其重新打开。重新打开之后我显然需要做“fbset -depth 8&& fbset -depth 16”来重新启用帧缓冲区然后强制重写X11。

我的问题是,如何在C中执行此操作?我有一个X11应用程序,我可以管理X11重绘没问题,但如何在C中禁用/重新启用HDMI,以及如何重新启用HDMI后重新启用帧缓冲?

为了给出背景,我有一个无头应用程序作为一种媒体服务器运行,由Android应用程序控制。目前,我暂时禁用超时后关闭HDMI。然而,为了节省能量,我想在不使用应用程序时禁用HDMI,然后重新打开并使用libcec在屏幕上显示RPi应用程序,以确定电视何时使用RPi的HDMI连接打开HDMI和关闭。

5 个答案:

答案 0 :(得分:5)

如果你想使用纯C,请查看tvservice的源代码,这是一个C程序。它可以找到at github。它似乎使用了vc_tv_hdmi_power_on_preferred();

中定义的#include "interface/vmcs_host/vc_tvservice.h"函数

如果您决定像@ moffeltje的答案那样致电tvservice计划,您可以使用execl()它更安全一点 - 您必须提供完整的途径二进制文件。 (使用execlp,您还可以控制环境变量):

pid_t pid;


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

答案 1 :(得分:1)

您可以使用system()命令来使用您描述的那些命令。

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;

}

答案 2 :(得分:1)

https://gist.github.com/AGWA/9874925我发现了chvt的用处。所以我建议调用shell命令

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

with system()。

答案 3 :(得分:0)

我找到了

xset dpms force on

在做一个tvservice -o之后刷新xorg的东西并用tvservice -p将它带回来。做fbset方式对我来说不是很好。

答案 4 :(得分:-1)

cec-client我获得了最佳效果。

sudo apt install cec-utils

关闭显示器:

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

打开显示器:

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