所以我可以使用“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和关闭。
答案 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