Jak utworzyć wywołanie zwrotne dla "monitora podłączonego" na grafice intel?

Mam eeepc z Grafiką Intela. Chciałbym podłączyć skrypt do zdarzenia monitora podłączonego przez VGA. Jak to zrobić?

Author: Andy, 2011-03-29

5 answers

Jako prymitywne rozwiązanie, możesz być w stanie przeprowadzić ankietę na sysfs. Na laptopie mam:

$ cat /sys/class/drm/card0-LVDS-1/status
connected

$ cat /sys/class/drm/card0-VGA-1/status
disconnected

Zgaduję, że to wymaga jądra DRM i prawdopodobnie KMS.

Aby sprawdzić, czy możesz uruchomić coś automatycznie, możesz uruchomić udevadm monitor --property i obserwować, gdy podłączasz monitor, aby sprawdzić, czy zdarzenia są zgłaszane.

Z moim Radeonem, dostaję Zdarzenie przy pierwszym podłączeniu monitora VGA, ale żadnych zdarzeń przy kolejnych rozłączeniach i ponownych połączeniach. Wydarzenie powinno wyglądać coś w stylu (używając Twojego jako przykładu):

KERNEL[1303765357.560848] change /devices/pci0000:00/0000:00:02.0/drm/card0 (drm)
UDEV_LOG=0
ACTION=change
DEVPATH=/devices/pci0000:00/0000:00:02.0/drm/card0
SUBSYSTEM=drm
HOTPLUG=1
DEVNAME=dri/card0
DEVTYPE=drm_minor
SEQNUM=2943
MAJOR=226
MINOR=0

Niestety nie ma z czym się równać, ale o ile Na zdjęciu jest tylko jedna karta graficzna, która nie jest zbyt ważna. Znajdź skąd udev pobiera reguły z twojego systemu (prawdopodobnie /etc/udev/rules.d/) i utwórz plik 99-monitor-hotplug.rules z:

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/root/hotplug.sh"

udev Po podłączeniu wyświetlacza uruchomi się hotplug.sh. W ramach testu umieściłem w /root/hotplug.sh (nie zapomnij wykonać tego skryptu):

#!/bin/sh

for output in DVI-I-1 LVDS-1 VGA-1; do
        echo $output >> /root/hotplug.log
        cat /sys/class/drm/card0-$output/status >> /root/hotplug.log
done

Z tym, mam wpis w hotplug.log Po podłączeniu zewnętrznego wyświetlacza. Nawet filtrowanie dla ACTION=="change", nadal mam pewne zdarzenia na boocie, więc możesz chcieć wziąć to pod uwagę w swoim skrypcie.

 28
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-01 23:58:20

Ta druga odpowiedź jest na właściwej ścieżce: chcesz słuchać zdarzeń DRM z udev.

Zaimplementowałem skrypt Pythona , który uruchamia kod, gdy urządzenia USB lub wyświetlacze zewnętrzne są (nie)podłączone. Poniżej zamieszczam minimalną wersję tego skryptu (niesprawdzoną):

#!/usr/bin/env python3
import pyudev

def udev_event_received(device):
    ...  # Your code here!

context = pyudev.Context()
monitor_drm = pyudev.Monitor.from_netlink(context)
monitor_drm.filter_by(subsystem='drm')
observer_drm = pyudev.MonitorObserver(monitor_drm, callback=udev_event_received, daemon=False)

observer_drm.start()

# This will prevent the program from finishing:
observer_drm.join()

Zobacz też:

 5
Author: Denilson Sá Maia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-01 16:39:11

Masz trzy opcje:

  1. ankieta na konkretny wpis w sysfs.
  2. Użyj inotify do wykrywania zmian w systemie sysfs.
  3. Użyj gniazda netlink z NETLINK_KOBJECT_UEVENT i nasłuchaj change uevent dla urządzenia, które chcesz.

W każdym z wymienionych sposobów, nadal będziesz musiał przeprowadzić ankietę w taki czy inny sposób, więc wybrałbym pierwszą opcję.

 4
Author: jmkeyes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-04-19 19:36:47

Dzięki sebastianwagner!

Dzięki tym informacjom udało mi się pomyślnie uruchomić Kodi media center z wyłączonym telewizorem. Rzeczywiście, gdy telewizor jest wyłączony, sterownik Intela nie chce skonfigurować trybu i mam pusty ekran, gdy później włączam telewizor.

w logu Kodi pojawił się następujący wiersz:

WARNING: CXRandR::Query - output HDMI1 has no current mode, assuming disconnected

Więc utworzyłem następujący wiersz w /etc/udev / rules.d / 99-monitor-hotplug.Zasady:

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/usr/sbin/hotplugtv.sh"

Zawartość /usr/sbin/hotplugtv.sh (mój serwer X jest działa jako root):

#!/bin/bash

export DISPLAY=:0
export XAUTHORITY=/root/.Xauthority

/bin/date 2>&1 >> /var/log/hotplugtv.log;
if [[ $(cat /sys/class/drm/card0-HDMI-A-1/status | grep -Ec "^connected") -eq 1 ]]; then
        echo "TV connected!" >> /var/log/hotplugtv.log;
        /bin/sleep 2s;
        /usr/bin/xrandr --verbose --output HDMI1 --auto 2>&1 >> /var/log/hotplugtv.log;
else
        echo "TV disconnected!" >> /var/log/hotplugtv.log;
fi

Nie zapomnij przeładować reguł udev, gdy wprowadzasz jakiekolwiek zmiany w swoim skrypcie (doprowadzało mnie to do szału!):

udevadm control --reload-rules

Uważaj, aby wyłączyć wygaszacz ekranu w Kodi, ponieważ pozostają aktywowane na zawsze, gdy w końcu włączysz telewizor. Z drugiej strony oszczędzanie energii / DPMS wydaje się działać dobrze.

 3
Author: Gurv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-21 14:06:15

Zakładając, że uruchamiasz X, skrypt może przeanalizować wyjście xrandr, aby zobaczyć, które monitory są podłączone. Powinno to działać z każdą kartą graficzną. Jest to to samo narzędzie, którego prawdopodobnie użyjesz do wykorzystania zmiany w skrypcie.

Nie rozwiązuje problemu z powiadomieniami o automatycznym uruchomieniu skryptu. Chociaż nie mam świetnego ogólnego rozwiązania, powszechnym przypadkiem jest wykrywanie, gdy zewnętrzny monitor jest obecny, ponieważ laptop jest podłączony do stacji dokującej. W tym w przypadku, skrypt można wyłączyć z czegoś innego, co uruchamia się podczas łączenia ze stacją dokującą, takiego jak dodanie lub usunięcie klawiatury USB lub Ethernetu.

 2
Author: user2977712,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-11 03:14:13