以人類可讀的形式獲取顯示器品牌和型號以及其他資訊
我已經提取了連接到電腦的目前監視器的速記版本。
這是一個例子:
vendor "VSC", prod id "18500"
在 Ubuntu 的 Monitor Preferences 中,它被標識為
Viewsonic Corporation 16"
.如何提取這種人類可讀的形式?…而且,我如何確定顯示器是 a
CRT
還是 aLCD
?(這實際上是讓我開始這個任務的原因)EDID 格式可以在 Wikipedia 上找到:Extended display Identification data
這是用於獲取 EDID
Vendor
和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"
編輯:這是
xrandr -q verbose
outpt 的主要行…直到 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
在 Ubuntu 的 Monitor Preferences 中,它被標識為 Viewsonic Corporation 16"。如何提取這種人類可讀的形式?
這種人類可讀的形式(“Viewsonic Corporation”)不是(直接)來自您的 EDID:
Ubuntu 在下面使用 gnome 庫。
libgnome-desktop
解碼 edid並 - 通過pnp-ids - 將三個字母的供應商 ID(在您的特定情況下為*“VSC” )轉換為顯示器的*漂亮名稱。gnome-pnp-ids.c,第 51 行:
* Note: we now prefer to use data coming from hwdata (and shipped with gnome-desktop)*
在我的系統上
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
0xFF
中,描述符 1(字節 54-71)中有(序列號):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 工具可以解析 EDID… 我使用
monitor-edid
. 這是我機器上 Perl 轉儲器格式的輸出:( +{ 'EISA_ID' => 'CMO1574', 'checksum' => 25, 'detailed_timings' => [ { 'ModeLine' => '"1600x900" 97.75 1600 1648 1680 1760 900 903 908 926 -hsync -vsync', 'ModeLine_comment' => '# Monitor preferred modeline (60.0 Hz vsync, 55.5 kHz hsync, ratio 16/9, 118 dpi)', 'digital_composite' => 3, 'horizontal_active' => 1600, 'horizontal_blanking' => 160, 'horizontal_border' => 0, 'horizontal_dpi' => '118.139534883721', 'horizontal_image_size' => 344, 'horizontal_sync_offset' => 48, 'horizontal_sync_positive' => 0, 'horizontal_sync_pulse_width' => 32, 'interlaced' => 0, 'pixel_clock' => '97.75', 'preferred' => 1, 'stereo' => 0, 'vertical_active' => 900, 'vertical_blanking' => 26, 'vertical_border' => 0, 'vertical_dpi' => '118.445595854922', 'vertical_image_size' => 193, 'vertical_sync_offset' => 3, 'vertical_sync_positive' => 0, 'vertical_sync_pulse_width' => 5 } ], 'diagonal_size' => '15.5292379824145', 'edid_revision' => 3, 'edid_version' => 1, 'established_timings' => [], 'extension_flag' => 0, 'feature_support' => { 'DPMS_active_off' => 0, 'DPMS_standby' => 0, 'DPMS_suspend' => 0, 'GTF_compliance' => 0, 'has_preferred_timing' => 1, 'rgb' => 0, 'sRGB_compliance' => 0 }, 'file' => '/sys/class/drm/card0-LVDS-1/edid', 'gamma' => 120, 'manufacturer_name' => 'CMO', 'max_size_horizontal' => '34.4', 'max_size_precision' => 'mm', 'max_size_vertical' => '19.3', 'monitor_details' => '', 'monitor_text' => [ 'N156O6-L01', 'CMO', 'N156O6-L01' ], 'product_code' => 5492, 'ratio' => '1.78238341968912', 'ratio_name' => '16/9', 'ratio_precision' => 'mm', 'serial_number' => 0, 'standard_timings' => [], 'video_input_definition' => { 'composite_sync' => 0, 'digital' => 1, 'separate_sync' => 0, 'sync_on_green' => 0, 'voltage_level' => 0 }, 'week' => 41, 'year' => 2008 } , )
最後,我不知道如何確定(在 linux 中)顯示器是 LCD 還是 CRT。我不知道有任何庫實現了這種功能(比如MS 中的這個)。