4 个外接显示器进入:4 个 DisplayLink 品牌外接显卡的集线器。(HDMI 转 USB)
我们称其为基座。基座通过一个 USB(-C) 插入我的笔记本电脑。
我已经制定了一条 udev 规则,它可以检测 dock 的识别属性,并xrandr
在我热插拔它时运行我的命令。
这是 bash 命令:
#!/bin/sh
xrandr \
--output DP-1 --off \
--output DP-2 --off \
--output HDMI-1 --off \
--output HDMI-2 --off \
--output DVI-I-4-3 --mode 1920x1080 --pos 0x0 --rotate normal \
--output DVI-I-5-4 --mode 1920x1080 --pos 0x1080 --rotate normal \
--output DVI-I-2-1 --mode 1920x1080 --pos 1920x240 --rotate left \
--output DVI-I-3-2 --mode 1920x1080 --pos 3000x240 --rotate left \
--output eDP-1 --primary --mode 1920x1080 --pos 4080x1900 --rotate normal
问题是每次热插拔时,内核都会随机加载扩展坞的显示器/卡。换句话说,我无法预测命令DVI-I-M-N
中将使用哪个显示器xrandr
。
您可以在附图中看到:我首先使用 GUI 检测并相应地编写脚本xrandr
,然后我拔下底座,重新插入,现在 GUI 是错误的,因为显示的是以前的布局,而现在情况已经改变,因为当我再次单击检测时出现的红色标签不再与脚本匹配。(这意味着在现实世界中,我现在看到的是一个混乱的安排,而不是屏幕截图中 GUI 上显示的安排)
因此,我需要唯一地标识每个显示器,并在最后一次热插拔时将其映射到内核为其“动态”(自适应)分配的 DVI 端口。为此,我看到了一些 EDID 内容。这里有一个文档,只是为了完整性,但不要费心阅读:
- https://en.wikipedia.org/wiki/Extended_Display_Identification_Data#EDID_1.3_data_format
- https://www.kernel.org/doc/html/latest/admin-guide/edid.html
这里的重点是,所有插头类型都相同:HDMI(虽然在内核中加载为 DVI)。因此,这种方法不可用:https://stackoverflow.com/questions/5469828/how-to-create-a-callback-for-monitor-plugged-on-an-intel-graphics。
更糟糕的是,所有显示器都是同一品牌的同一型号。这意味着所有这些方法:
- $
ls /sys/class/drm/*/edid | xargs -i{} sh -c "echo {}; parse-edid < {}"
(需要 $sudo apt install read-edid -y
),为四个监视器检索相同的Identifier
、ModelName
和。(来源:VendorName
通过命令行显示监视器信息) - $
edid-decode </sys/class/drm/card2-DVI-I-1/edid
应用于 {card3-DVI-I-2
,card4-DVI-I-3
,card5-DVI-I-4
} 检索 2 个不同的Serial Number
,Made in week
, 和两个批次Checkshum
。这是因为我首先购买了 2 台显示器,然后第二年又购买了 2 台。如果您想知道为什么有这么多卡,那么 card0 是英特尔 iGPU,card1 是 nvidia dGPU,其他属于底座https://ibb.co/CJvZPzg.(来源:https://askubuntu.com/a/1149585/1173345) - $
sha1sum /sys/class/drm/card2-DVI-I-1/edid | cut -f1 -d " "
仅为 4 个不同的显示器/卡提供 2 个不同的 40 位密钥。(来源:https://tyler.vc/auto-monitor-detection-on-linux)
失败。
如何为每个监视器获取一个非常独特的标识符,以便在某些 udev 规则中重命名它们,以便知道每个监视器与哪个 DVI 相关联?
我可以自己重写 EDID 吗?怎样做?