【问题标题】:How to disable/enable HDMI on Raspberry Pi?如何在 Raspberry Pi 上禁用/启用 HDMI?
【发布时间】:2015-03-30 07:35:16
【问题描述】:

所以我可以使用“tvservice -o”关闭树莓派上的 HDMI,并使用“tvservice -p”重新打开它。重新打开后,我显然需要执行“fbset -depth 8 && fbset -depth 16”来重新启用帧缓冲区,然后强制 X11 重绘。

我的问题是,我如何在 C 中做到这一点?我有一个 X11 应用程序,我可以管理 X11 重绘没有问题,但是如何在 C 中禁用/重新启用 HDMI,以及在重新启用 HDMI 后如何重新启用帧缓冲区?

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

【问题讨论】:

    标签: c raspberry-pi hdmi


    【解决方案1】:

    如果您想使用纯 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?
    }
    

    【讨论】:

    • 可爱,谢谢。知道在哪里可以找到 fbset 的源代码吗?我怀疑它使用 ioctls 并且没有帧缓冲设备上的文档或示例代码,我有点卡住了。
    • @AlastairG,是的,它应该在 util-linux 包中:kernel.org/pub/linux/utils/util-linux 但如果不是,只需 google 即可,那里也有一个 busybox 实现。
    【解决方案2】:

    您可以使用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;
    
    }
    

    【讨论】:

    • 作为一般规则,我避免使用系统。我更喜欢 execl() 等,但出于偏好,我宁愿将功能嵌入到我自己的程序中。
    【解决方案3】:

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

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

    使用系统()。

    【讨论】:

    • 在我当前的配置中,我需要更改 chvt 命令: hdmion() { tvservice -p;须藤 chvt 7;须藤 chvt 1; }
    【解决方案4】:

    我找到了

    xset dpms force on
    

    在执行 tvservice -o 并使用 tvservice -p 将其恢复后刷新 xorg 内容。以 fbset 方式进行操作对我来说效果不佳。

    【讨论】:

      【解决方案5】:

      cec-client 取得了最好的结果。

      sudo apt install cec-utils

      关闭显示器:

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

      打开显示器:

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

      【讨论】:

      • 我问的是如何在 C 中做到这一点,而不是脚本/命令行。此外,这只是发送 CEC 命令,并不会真正改变物理 HDMI 端口状态 (AFAIK)。
      猜你喜欢
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 2018-01-19
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      相关资源
      最近更新 更多