Hardware

以人類可讀的形式獲取顯示器品牌和型號以及其他資訊

  • June 20, 2020

我已經提取了連接到電腦的目前監視器的速記版本。

這是一個例子: vendor "VSC", prod id "18500"

在 Ubuntu 的 Monitor Preferences 中,它被標識為Viewsonic Corporation 16".

如何提取這種人類可讀的形式?…而且,我如何確定顯示器是 aCRT還是 a LCD?(這實際上是讓我開始這個任務的原因)

EDID 格式可以在 Wikipedia 上找到:Extended display Identification data

這是用於獲取 EDIDVendorProduct 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 verboseoutpt 的主要行…直到 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 填充。

在您的 EDID0xFF中,描述符 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 中的這個)。

引用自:https://unix.stackexchange.com/questions/67983