Подтвердить что ты не робот

Как создать обратный вызов для "монитора подключен" к графике Intel?

У меня есть eeepc с графикой Intel. Я хотел бы подключить script к событию монитора, подключенного через VGA. Как это сделать?

4b9b3361

Ответ 1

Как сырое решение, вы можете опросить sysfs. На моем ноутбуке я:

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

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

Я предполагаю, что для этого требуется DRM ядра и, возможно, KMS.

Чтобы убедиться, что вы можете запускать что-то автоматически, вы можете запустить udevadm monitor --property и смотреть, пока вы находитесь (dis-), подключая монитор, чтобы узнать, сообщаются ли события.

С моим radeon я получаю событие при первом подключении монитора VGA, но никаких событий при последующем отключении и повторном подключении не происходит. Событие должно выглядеть примерно так (используя ваш пример):

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

К сожалению, не так много, чтобы соответствовать, но пока есть только одна видеокарта на картинке, которая не слишком важна. Найдите, где udev получает правила из вашей системы (возможно, /etc/udev/rules.d/), и создайте файл 99-monitor-hotplug.rules с помощью

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

udev будет запускать hotplug.sh при подключении дисплея. В качестве теста я поставил следующее в /root/hotplug.sh (не забудьте сделать этот script исполняемый файл):

#!/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

С этим я получил запись в hotplug.log после подключения внешнего дисплея. Даже фильтрация для ACTION=="change", у меня все еще есть некоторые события при загрузке, поэтому вы можете как-то учесть это в своем script.

Ответ 2

У вас есть три варианта:

  • Опрос о конкретной записи в sysfs.
  • Используйте inotify для обнаружения изменений в sysfs.
  • Используйте сокет netlink с NETLINK_KOBJECT_UEVENT и прослушайте change uevent для устройства, которое вы хотите.

В любом из упомянутых способов вам все равно придется опросить так или иначе, поэтому я просто перейду с первым вариантом.

Ответ 3

Предполагая, что вы используете X, script может анализировать вывод xrandr, чтобы увидеть, какие мониторы подключены. Это должно работать с любой графической картой. Это тот же инструмент, который вы, вероятно, будете использовать, чтобы использовать изменения в script.

Он не решает проблему с уведомлениями для автоматического запуска script. Хотя у меня нет большого общего решения, обычный случай обнаруживает, когда присутствует внешний монитор, потому что ноутбук подключен к док-станции. В этом случае вы можете отключить триггер script от чего-то другого, который срабатывает при подключении к док-станции, например, добавление или удаление USB-клавиатуры или ethernet.

Ответ 4

Спасибо sebastianwagner!

С этой информацией я смог успешно загрузить мой медиацентр Kodi с выключенным телевизором. Действительно, когда телевизор выключен, драйвер Intel не хочет настраивать режим, и я получил пустой экран, когда позже включил телевизор.

Журнал Kodi показал следующую строку:

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

Итак, я создал следующую строку в файле /etc/udev/rules.d/99-monitor-hotplug.rules:

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

Содержимое/usr/sbin/hotplugtv.sh(мой X-сервер работает от имени 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

Не забудьте перезагрузить правила udev, когда вы внесете какие-либо изменения в свой script (это сводило меня с ума!):

udevadm control --reload-rules

Будьте осторожны, чтобы отключить любую экранную заставку в Kodi, потому что они остаются активированными навсегда, когда вы наконец включите телевизор. С другой стороны, энергосбережение /DPMS работает нормально.