Holen Sie sich Hersteller und Modell des Monitors und andere Informationen in lesbarer Form

19

Ich habe die Kurzfassung des aktuellen Monitors extrahiert, der an den Computer angeschlossen ist.
Hier ist ein Beispiel: vendor "VSC", prod id "18500"

In den Monitoreinstellungen von Ubuntu ist dies als gekennzeichnet Viewsonic Corporation 16".

Wie kann ich diese für Menschen lesbare Form extrahieren? ... und wie kann ich feststellen, ob es sich bei einem Monitor um einen CRToder einen handelt LCD? (Dies ist eigentlich der Grund, warum ich mit dieser Quest angefangen habe.)

Das EDID-Format finden Sie auf Wikipedia: Erweiterte Anzeigeidentifikationsdaten
Hier ist der Code, der zum Abrufen der EDID Vendorund verwendet wirdProduct 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"

Bearbeiten: Hier sind die führenden Zeilen der xrandr -q verboseAusgabe ... bis zum Ende des EDID-Hex-Dumps

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
Peter.O
quelle
In stackoverflow.com gibt es ein ähnliches Thema .
Pevik
@ Peter-o wahrscheinlich meintest du xrandr -q --verbose (Tippfehler in Ihrem Befehl)
Dovah

Antworten:

8

In den Monitoreinstellungen von Ubuntu wird dies als Viewsonic Corporation 16 "bezeichnet. Wie kann ich diese für Menschen lesbare Form extrahieren?

Diese von Menschen lesbare Form ( "Viewsonic Corporation" ) stammt nicht (direkt) von Ihrer EDID:
Ubuntu verwendet darunterliegende Gnombibliotheken . libgnome-desktop decodiert die edid und wandelt über pnp- ids die dreibuchstabige Vendor ID ( in Ihrem speziellen Fall "VSC" ) in einen hübschen Namen für das Display um.

gnome-pnp-ids.c , Zeile 51:

* Note: we now prefer to use data coming from hwdata (and shipped with gnome-desktop)*

Auf meinem System

grep VSC /usr/share/hwdata/pnp.ids

kehrt zurück:

VSC    ViewSonic Corporation

Abgesehen davon können zusätzliche Informationen aus der EDID extrahiert werden, nämlich aus den Deskriptorblöcken. Aus demselben Wikipedia-Link:

Deskriptorblöcke. Detaillierte Timing-Deskriptoren in absteigender Reihenfolge. Nach allen detaillierten Timing-Deskriptoren sind zusätzliche Deskriptoren zulässig:

  • Bereichsgrenzen überwachen (erforderlich)
  • ASCII-Text (Monitorname (erforderlich), Seriennummer des Monitors oder unstrukturierter Text)
  • 6 Zusätzliche Standard-Timing-Informationsblöcke
  • Farbpunktdaten

Derzeit definierte Deskriptortypen sind:

  • 0xFF: Seriennummer überwachen (Text)
  • 0xFE: Nicht angegebener Text (Text)
  • 0xFD: Bereichsgrenzen überwachen. 6- oder 13-Byte-Binärdeskriptor.
  • 0xFC: Monitorname (Text)
  • 0xFB: Zusätzliche Weißpunktdaten. 2 × 5-Byte-Deskriptoren, aufgefüllt mit 0A 20 20.
  • 0xFA: Zusätzliche Standard-Timing-IDs. 6 × 2-Byte-Deskriptoren, aufgefüllt mit 0A.

In Ihrer EDID haben Sie 0xFF(Seriennummer) in Deskriptor 1 (Bytes 54-71):

00 ff 00 48 48 39 32 31 30 30 30 30 39 0a 20 20 00 00

und Sie haben 0xFC(Monitorname) in Deskriptor 3 (Bytes 90-107) und 4 (Bytes 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

Es geht also nur darum, die Informationen von dort zu extrahieren, zB Deskriptor 3:

56 69 65 77 53 6f 6e 69 63 20 45 37 37>> Viewsonic E77

Es gibt einige Linux-Tools, die EDIDs analysieren ... die ich verwende monitor-edid. Hier ist die Ausgabe im Perl-Dumper-Format auf meinem Computer:

(
+{
          '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
        }
,
)

Schließlich habe ich keine Ahnung, wie man (unter Linux) feststellt, ob ein Monitor LCD oder CRT ist. Ich kenne keine Bibliothek, die eine solche Funktion implementiert (wie diese von MS).

don_crissti
quelle
Das ist eine großartige Antwort. Danke für die Mühe.
Peter.O