如何在英特尔图形上创建“监视器插入”回调?

问题描述:

我有一个英特尔图形eeepc。我想将脚本挂接到通过VGA插入的显示器事件。怎么做?如何在英特尔图形上创建“监视器插入”回调?

+1

对于正在寻找Windows解决方案的用户:http://*.com/questions/1440285/how-to-detect-hot-plugging-of-monitor-in-a-win32-application http:// *。 com/questions/3267722 /在监视器上显示热插拔事件http://*.com/questions/5981520/detect-external-display-being-connected-or-removed-under-windows -7 – hippietrail 2011-05-13 08:12:00

作为一个粗略的解决方案,您可能能够在sysfs上进行轮询。在我的笔记本电脑,我有:

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

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

我猜这需要内核DRM和可能KMS。

要查看您是否可以自动触发某些内容,您可以运行udevadm monitor --property,并在您(显示)连接显示器时查看是否报告了事件。

用我的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(别忘了让这个脚本可执行文件):

#!/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",我仍然在启动时收到了一些事件,因此您可能希望在脚本中以某种方式考虑这一点。

+1

好的开始,但我不喜欢投票。 – Reactormonk 2011-04-19 18:19:59

+0

@Tass如果您正在获取活动,请ping我,并且我可能会想出一个udev规则来运行脚本 – Andy 2011-04-21 04:48:24

+0

发送活动。 http://pastie.org/1832835 - 并且VGA状态更改为“已连接”。 – Reactormonk 2011-04-25 21:04:52

你有三种选择:在sysfs中的特定条目

  1. 投票。
  2. 使用inotify检测sysfs中的更改。
  3. 使用带有NETLINK_KOBJECT_UEVENT的netlink套接字并监听所需设备的change事件。

在上述任何一种方式中,您仍然需要以某种方式进行轮询,所以我只是选择第一种方式。

+2

'inotify'和'netlink'套接字使您可以使用'select()'和朋友。你真的认为“投票”? – 2012-11-30 03:03:00

+0

使用'select()'仍在轮询更新。 – jmkeyes 2012-11-30 17:47:33

+0

使用select()或poll()用于“轮询更新”的美妙之处在于,您可以进入休眠状态,直到超时或内核唤醒您告诉您“轮询”的某项内容(有点误导,它与大多数人所称的“轮询”不同,它甚至是GPIO中断的接口...;)) - 因此减少了CPU资源的浪费等等。 '使用select()或poll()接口更好地“轮询”。 – Svartalf 2015-02-23 16:52:01

假设您正在运行X,脚本可以解析xrandr的输出以查看连接了哪些监视器。这应该适用于任何显卡。这是您可能会用于使用脚本中的更改的相同工具。

它不能解决通知自动运行脚本的问题。虽然我没有很好的通用解决方案,但常见的情况是检测何时存在外接显示器,因为笔记本电脑已连接到扩展坞。在这种情况下,您可以让脚本触发连接到扩展坞时触发的其他事物,例如添加或移除USB键盘或以太网。

谢谢sebastianwagner!

有了这些信息,我就可以在电视关闭的情况下成功启动我的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服务器作为根):

#!/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规则,当你进行任何更改您的脚本(这被我逼疯了!):

udevadm control --reload-rules 

小心禁用任何科迪屏幕保护程序,因为它们处于激活状态永远当你终于开机了电视。 另一方面,节能/ DPMS似乎工作正常。