我已经提取了连接到计算机的当前显示器的速记版本。
这是一个例子: vendor "VSC", prod id "18500"
在 Ubuntu 的监视器首选项中,它被标识为Viewsonic Corporation 16"
.
我如何提取这种人类可读的形式? ...另外,我如何确定监视器是 aCRT
还是 a LCD
? (这实际上是我开始这个任务的原因)
EDID格式可以在维基百科上找到:扩展显示识别数据Vendor
这是用于获取 EDID和的 代码Product id
edid=$(xrandr -q --verbose |
sed -n '/^[[:space:]]\+00ffffffffffff00/,/[^a-fA-F0-9[:space:]]/{
/[^a-fA-F0-9[:space:]]/d
s/[[:space:]]\+//g; p}')
nibble=({0..1}{0..1}{0..1}{0..1})
vend=$(for i in {16..19} ;do
printf "%s" ${nibble[$((16#${edid:$i:1}))]}
done)
vend="$(for i in 1 6 11 ;do
printf \\x$(printf %x $((2#${vend:$i:5} +64)))
done)"
prod=$((16#${edid:22:2}${edid:20:2}))
printf "monitor: vendor \"%s\", prod id \"%s\"\n" "${vend}" "$prod"
编辑:以下是 outpt 的前导行xrandr -q verbose
...直到 EDID 十六进制转储的末尾
Screen 0: minimum 320 x 200, current 1280 x 960, maximum 8192 x 8192
VGA1 connected 1280x960+0+0 (0x47) normal (normal left inverted right x axis y axis) 320mm x 240mm
Identifier: 0x41
Timestamp: 26386
Subpixel: unknown
Clones:
CRTC: 0
CRTCs: 0 1
Transform: 1.000000 0.000000 0.000000
0.000000 1.000000 0.000000
0.000000 0.000000 1.000000
filter:
EDID:
00ffffffffffff005a63444809000000
15090101682018b1e84f22a157479925
0f484ffffe00315945596159714f8140
818001010101000000ff004848393231
30303030390a2020000000fd0032781e
46ff000a202020202020000000fc0056
696577536f6e696320453737000000fc
00312d320a2020202020202020200084
1280x1024 (0x46) 108.0MHz +HSync +VSync
h: width 1280 start 1328 end 1440 total 1688 skew 0 clock 64.0KHz
v: height 1024 start 1025 end 1028 total 1066 clock 60.0Hz
1280x960 (0x47) ....
...
... etc
答案1
在 Ubuntu 的显示器首选项中,它被识别为 Viewsonic Corporation 16"。我如何提取这个人类可读的形式?
人类可读的形式(“优派公司”)并不直接来自您的 EDID:Ubuntu 使用下面的 gnome 库。libgnome-desktop
解码 edid 并通过pnp.ids
转换三个字母的供应商 ID (“VSC”在您的特定情况下)转换为“显示的漂亮名称。
在我的系统上
grep VSC /usr/share/hwdata/pnp.ids
返回:
VSC ViewSonic Corporation
除此之外,还可以从 EDID(即描述符块)中提取附加信息。来自相同的维基百科链接:
描述符块。详细的时序描述符,按优先顺序递减。在所有详细的时序描述符之后,允许使用附加描述符:
- 监控范围限制(必填)
- ASCII 文本(显示器名称(必需)、显示器序列号或非结构化文本)
- 6 附加标准定时信息块
- 色点数据
目前定义的描述符类型有:
- 0xFF:显示器序列号(文本)
- 0xFE:未指定的文本(文本)
- 0xFD:监控范围限制。 6 或 13 字节二进制描述符。
- 0xFC:监视器名称(文本)
- 0xFB:附加白点数据。 2× 5 字节描述符,用 0A 20 20 填充。
- 0xFA:附加标准时序标识符。 6×2字节描述符,用0A填充。
在您的 EDID 中,描述符 1(字节 54-71)中有0xFF
(序列号):
00 ff 00 48 48 39 32 31 30 30 30 30 39 0a 20 20 00 00
0xFC
并且描述符 3(字节 90–107)和 4(字节 108–125)中有(监视器名称):
00 fc 00 56 69 65 77 53 6f 6e 69 63 20 45 37 37 00 00
00 fc 00 31 2d 32 0a 20 20 20 20 20 20 20 20 20 00 84
所以只需从那里提取信息即可,例如描述符 3:
56 69 65 77 53 6f 6e 69 63 20 45 37 37
>>优派E77
最后,我不知道如何确定(在linux中)显示器是LCD还是CRT。我不知道有任何库实现了这样的功能(比如这个来自微软)。
答案2
像这样的东西应该工作得更好(所有其他答案在这里都没有100%工作):
for file in `ls -1 /sys/class/drm/*/edid`; do text=$(tr -d '\0' <"$file"); if [ -n "$text" ]; then edid-decode "$file" | grep -e Manufacturer: -e Product; sleep 0.0001; fi done
我在这里用两台显示器进行了测试。我的主要显示器是内置笔记本电脑显示器,辅助显示器是 DELL 25"。输出如下:
Manufacturer: DELL Model 53359 Serial Number 809781068
Display Product Serial Number: YKFWP5790DGL
Display Product Name: DELL U2515H
Manufacturer: LGD Model 1133 Serial Number 0
您必须已edid-decode
在发行版中安装了。我的设置是 DELL Latitude e5450 和 Ubuntu 20.04。
答案3
以下工具有助于解码 edid 信息: http://cgit.freedesktop.org/xorg/app/edid-decode
答案4
我一直在尝试获取一些连接到运行 Ubuntu 16.04 LTE 的旧电脑的戴尔平板显示器的型号。这是最终对我有用的方法。
- 我安装了 edid-decode 包。
$ sudo apt 更新 $ sudo apt install -y edid 解码
- edid-decode 手册页指出,
概要 edid 解码 [输入] [输出] 描述 [...]有两个参数,正常输出被抑制,并且 二进制 EDID blob 被写入由 第二个论点。 [...] 笔记 并非所有字段都被解码或完全解码。一些 字段的解码可能会损坏输出......
“注释”部分下有关损坏输出的声明正在发生在我身上。在输出一些人类可读的文本之前,运行 edid-decode 会产生一些乱码输出(非打印字符)。
鉴于手册页中的信息,我尝试了以下命令行:
$ edid-解码 /sys/class/drm/card0/card0-VGA-1/edid vga.edid
不幸的是,这并没有产生输出文件vga.edid
。因此,我手动创建了一个名为的空文件vga.edid
,然后重新运行 edid-decode 命令行:
$触摸vga.edid $ edid-解码 /sys/class/drm/card0/card0-VGA-1/edid vga.edid
这次,edid-decode 将 EDID 数据转储到输出文件中vga.edid
。
接下来,我使用该应用程序xxd
生成 file 内容的十六进制转储vga.edid
。十六进制转储输出的最后一行产生了显示器的型号:
$ xxd vga.edid [...其他的东西...] 00000070:0044 454c 2031 3930 3846 5042 4c4b 00ad.DEL 1908FPBLK..
因此,显示器是 Dell 1908FP(黑色外壳)。
FWIW,上面显示的 edid-decode 命令行也为显示器制造商显示了此信息:
制造商:DEL 型号 4047 序列号 xxxxxxxxx
(注意:我模糊了序列号值。)我环顾四周,但在网上找不到将整数值 4047 映射到特定戴尔显示器产品的查找表。
我已经在两台不同的戴尔显示器上尝试过这种方法,两者都是较旧的型号,并且它为两者生成了正确的戴尔型号。