Obtenez la marque et le modèle du moniteur et d'autres informations sous une forme lisible par l'homme


19

J'ai extrait la version abrégée du moniteur actuel connecté à l'ordinateur.
Voici un exemple: vendor "VSC", prod id "18500"

Dans les préférences du moniteur d'Ubuntu, il est identifié comme Viewsonic Corporation 16".

Comment puis-je extraire cette forme lisible par l'homme? ... et aussi, comment puis-je déterminer si un moniteur est un CRTou un LCD? (c'est en fait ce qui m'a lancé dans cette quête)

Le format EDID se trouve sur Wikipedia: Données d'identification étendues de l'affichage
Voici le code utilisé pour obtenir l'EDID VendoretProduct 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"

Edit: Voici les principales lignes de xrandr -q verbosesortie ... jusqu'à la fin du vidage hexadécimal 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

Il existe un sujet similaire dans stackoverflow.com .
pevik

@ peter-o vous vouliez probablement dire xrandr -q --verbose (faute de frappe dans votre commande)
dovah

Réponses:


8

Dans les préférences du moniteur d'Ubuntu, il est identifié comme Viewsonic Corporation 16 ". Comment puis-je extraire ce formulaire lisible par l'homme?

Cette forme lisible par l'homme ( "Viewsonic Corporation" ) ne provient pas (directement) de votre EDID:
Ubuntu utilise des bibliothèques de gnomes en dessous. libgnome-desktop décode l'edid et - via pnp-ids - convertit l'ID de fournisseur à trois lettres ( "VSC" dans votre cas particulier) en un joli nom pour l'affichage.

gnome-pnp-ids.c , ligne 51:

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

Sur mon système

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

Retour:

VSC    ViewSonic Corporation

Cela mis à part, des informations supplémentaires peuvent être extraites de l'EDID, à savoir des blocs descripteurs. Du même lien wikipedia:

Blocs descripteurs. Descripteurs de synchronisation détaillés, par ordre de préférence décroissant. Après tous les descripteurs de synchronisation détaillés, des descripteurs supplémentaires sont autorisés:

  • Surveiller les limites de plage (obligatoire)
  • Texte ASCII (nom du moniteur (requis), numéro de série du moniteur ou texte non structuré)
  • 6 blocs d'informations de synchronisation standard supplémentaires
  • Données sur les points de couleur

Les types de descripteurs actuellement définis sont:

  • 0xFF: surveiller le numéro de série (texte)
  • 0xFE: texte non spécifié (texte)
  • 0xFD: Surveiller les limites de plage. Descripteur binaire de 6 ou 13 octets.
  • 0xFC: nom du moniteur (texte)
  • 0xFB: données supplémentaires de point blanc. Descripteurs 2 × 5 octets, remplis de 0A 20 20.
  • 0xFA: identificateurs de synchronisation standard supplémentaires. Descripteurs 6 × 2 octets, remplis de 0A.

Dans votre EDID, vous avez 0xFF(numéro de série) dans le descripteur 1 (octets 54-71):

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

et vous avez 0xFC(nom du moniteur) dans le descripteur 3 (octets 90-107) et 4 (octets 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

il ne s'agit donc que d'en extraire les informations, par exemple le descripteur 3:

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

Il existe des outils Linux qui analysent les EDID ... que j'utilise monitor-edid. Voici la sortie au format dumper Perl sur ma machine:

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

Enfin, je ne sais pas comment déterminer (sous Linux) si un moniteur est LCD ou CRT. Je ne connais aucune bibliothèque qui implémente une telle fonction (comme celle-ci de MS).


Voilà une excellente réponse. Merci pour l'effort.
Peter.O

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.