У меня есть eeepc с графикой Intel. Я хотел бы подключить script к событию монитора, подключенного через VGA. Как это сделать?
Как создать обратный вызов для "монитора подключен" к графике Intel?
Ответ 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 работает нормально.