如何在 Raspberry Pi 上 disable/enable HDMI?
How to disable/enable HDMI on Raspberry Pi?
所以我可以使用 "tvservice -o" 关闭 raspberry Pi 上的 HDMI,然后 "tvservice -p" 将其重新打开。重新打开后,我显然需要做 "fbset -depth 8 && fbset -depth 16" 来重新启用帧缓冲区,然后强制 X11 重绘。
我的问题是,如何在 C 中执行此操作?我有一个 X11 应用程序,我可以毫无问题地管理 X11 重绘,但是我如何 disable/re-enable C 中的 HDMI,以及如何在重新启用 HDMI 后重新启用帧缓冲区?
作为背景,我有一个无头应用程序 运行 作为一种媒体服务器,由 Android 应用程序控制。目前我在超时后永久禁用 HDMI 的关闭。但是为了节省能源,我想在应用程序不使用时禁用 HDMI,然后重新打开它并使用 libcec 在屏幕上显示 RPi 应用程序以确定电视何时使用 RPi 的 HDMI 连接打开 HDMI 和关闭。
您可以使用 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;
}
如果您想使用纯 C,请查看 tvservice
的源代码,这是一个 C 程序。可以找到at github。它似乎正在使用 #include "interface/vmcs_host/vc_tvservice.h"
中定义的 vc_tv_hdmi_power_on_preferred();
函数
如果您决定像@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?
}
我找到了
xset dpms force on
在执行 tvservice -o 并使用 tvservice -p 将其恢复后刷新 xorg 内容。 fbset 方式对我来说效果不是很好。
我用 cec-client
获得了最好的结果。
sudo apt install cec-utils
关闭显示器:
echo "standby 0" | cec-client -s -d 1
打开显示器:
echo "on 0" | cec-client -s -d 1
从https://gist.github.com/AGWA/9874925我发现了chvt
的用处。所以我建议调用 shell 命令
hdmioff() { tvservice -o; }
hdmion() { tvservice -p; sudo chvt 1; sudo chvt 7; }
使用系统()。
所以我可以使用 "tvservice -o" 关闭 raspberry Pi 上的 HDMI,然后 "tvservice -p" 将其重新打开。重新打开后,我显然需要做 "fbset -depth 8 && fbset -depth 16" 来重新启用帧缓冲区,然后强制 X11 重绘。
我的问题是,如何在 C 中执行此操作?我有一个 X11 应用程序,我可以毫无问题地管理 X11 重绘,但是我如何 disable/re-enable C 中的 HDMI,以及如何在重新启用 HDMI 后重新启用帧缓冲区?
作为背景,我有一个无头应用程序 运行 作为一种媒体服务器,由 Android 应用程序控制。目前我在超时后永久禁用 HDMI 的关闭。但是为了节省能源,我想在应用程序不使用时禁用 HDMI,然后重新打开它并使用 libcec 在屏幕上显示 RPi 应用程序以确定电视何时使用 RPi 的 HDMI 连接打开 HDMI 和关闭。
您可以使用 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;
}
如果您想使用纯 C,请查看 tvservice
的源代码,这是一个 C 程序。可以找到at github。它似乎正在使用 #include "interface/vmcs_host/vc_tvservice.h"
vc_tv_hdmi_power_on_preferred();
函数
如果您决定像@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?
}
我找到了
xset dpms force on
在执行 tvservice -o 并使用 tvservice -p 将其恢复后刷新 xorg 内容。 fbset 方式对我来说效果不是很好。
我用 cec-client
获得了最好的结果。
sudo apt install cec-utils
关闭显示器:
echo "standby 0" | cec-client -s -d 1
打开显示器:
echo "on 0" | cec-client -s -d 1
从https://gist.github.com/AGWA/9874925我发现了chvt
的用处。所以我建议调用 shell 命令
hdmioff() { tvservice -o; }
hdmion() { tvservice -p; sudo chvt 1; sudo chvt 7; }
使用系统()。