如何创build一个英特尔graphics“监视器插入”的callback?

我有一个英特尔graphicseeepc。 我想钩上一个脚本,通过VGA插入显示器事件。 怎么做?

作为一个粗略的解决方案,您可能能够在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. 轮询sysfs中的特定条目。
  2. 使用inotify来检测sysfs中的更改。
  3. 使用带有NETLINK_KOBJECT_UEVENT的netlink套接字,并监听所需设备的change

用上面提到的任何一种方式,你仍然需要以这种或那种方式进行轮询,所以我只是选择第一个选项。

假设你正在运行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服务器以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规则(这让我发疯了):

 udevadm control --reload-rules 

小心禁用Kodi中的任何屏幕保护程序,因为当您终于启动电视时,它们将永远保持激活状态。 另一方面节能/ DPMS似乎工作正常。