2015-03-30 2 views
4

Поэтому я могу использовать «tvservice -o», чтобы отключить HDMI на малине Pi и «tvservice -p», чтобы включить его. После его повторного включения мне, видимо, нужно сделать «fbset -depth 8 & & fbset -depth 16", чтобы повторно включить буфер кадра, а затем принудительно перерисовать X11.Как отключить/включить HDMI на Raspberry Pi?

Мой вопрос: как мне это сделать в C? У меня есть приложение X11, и я могу управлять перерисованием X11 без проблем, но как отключить/снова включить HDMI в C и как снова включить буфер кадра после повторного включения HDMI?

Чтобы предоставить фоновое изображение, у меня есть приложение без заголовка, работающее как медиа-сервер, управляемый приложением Android. В настоящее время я окончательно отключил выключение HDMI после таймаута. Однако для экономии энергии я хотел бы отключить HDMI, когда приложение не используется, а затем включить его и отобразить приложение RPi на экране с помощью libcec, чтобы определить, когда телевизор использует соединение HDMI RPi, чтобы включить HDMI и выкл.

ответ

3

Если вы хотите пойти на чистом C, посмотрите на исходный код для tvservice, что программа C. Вы можете найти at github. Это, как представляется, с помощью функции vc_tv_hdmi_power_on_preferred();, определенной в #include "interface/vmcs_host/vc_tvservice.h"

Если вы решили назвать программу tvservice как в ответе @ moffeltje, вы могли бы использовать execl() это немного безопаснее - вы должны дать полный путь к двоичному файлу. (С этих функций имеют вы также можете иметь контроль над переменными окружения):

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, спасибо. Любая идея, где найти исходный код для fbset? Я подозреваю, что он использует ioctls и без документа или кода примера на устройстве буфера кадров. Я немного застрял. – AlastairG

+0

@AlastairG, да, он должен быть в пакете util-linux: https: //www.kernel.org/pub/linux/utils/util-linux /, но если нет, просто Google для него, там тоже есть реализация busybox. –

0

Вы можете использовать команду 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; 

} 
+0

Как правило, я избегаю системы. Я предпочитаю execl() и т. Д., Но для предпочтения я предпочел бы встроить функции в свою собственную программу. – AlastairG

0

Я нашел

xset dpms force on 

обновить XOrg материал после выполнения tvservice -o и вернуть его с tvservice -p , Выполнение этого метода fbset для меня не очень хорошо.

+0

Я спросил, как это сделать в C, а не в сценарии/командной строке. – AlastairG

-1

Я получил лучшие результаты с cec-client.

sudo apt install cec-utils

Выключите монитор:

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

Включите монитор на:

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

+0

Я спросил, как это сделать в C, а не в сценарии/командной строке. Кроме того, это просто посылает команды CEC и фактически не изменяет физический статус порта HDMI (AFAIK). – AlastairG

0

https://gist.github.com/AGWA/9874925 От я нашел полезность chvt. Поэтому я предлагаю вызвать команды оболочки

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

с системой().