Dapatkan monitor make dan model serta info lainnya dalam bentuk yang dapat dibaca manusia

19

Saya telah mengekstraksi versi singkat dari monitor saat ini yang terpasang pada komputer.
Berikut ini sebuah contoh: vendor "VSC", prod id "18500"

Dalam Preferensi Monitor Ubuntu, ia diidentifikasi sebagai Viewsonic Corporation 16".

Bagaimana saya bisa mengekstrak formulir yang dapat dibaca manusia ini? ... dan juga, bagaimana saya bisa menentukan apakah monitor adalah CRTatau tidak LCD? (Ini sebenarnya yang membuat saya memulai pencarian ini)

Format EDID dapat ditemukan di Wikipedia: Data identifikasi tampilan diperluas
Berikut adalah kode yang digunakan untuk mendapatkan EDID VendordanProduct 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"

Sunting: Berikut adalah baris terkemuka dari xrandr -q verboseoutpt ... hingga akhir dump hex 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
Peter.O
sumber
Ada topik serupa di stackoverflow.com .
pevik
@ peter-o mungkin maksudmu xrandr -q --verbose (salah ketik pada perintahmu)
dovah

Jawaban:

8

Dalam Preferensi Monitor Ubuntu, ia diidentifikasi sebagai Viewsonic Corporation 16 ". Bagaimana saya bisa mengekstrak formulir yang dapat dibaca manusia ini?

Formulir yang dapat dibaca manusia ( "Viewsonic Corporation" ) tidak datang (langsung) dari EDID Anda:
Ubuntu menggunakan pustaka gnome di bawahnya. libgnome-desktop menerjemahkan edid dan - melalui pnp-id - mengubah ID vendor tiga huruf ( "VSC" dalam kasus khusus Anda) menjadi nama yang cantik untuk tampilan.

gnome-pnp-ids.c , baris 51:

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

Di sistem saya

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

pengembalian:

VSC    ViewSonic Corporation

Selain itu, informasi tambahan dapat diekstraksi dari EDID, yaitu dari blok deskriptor. Dari tautan wikipedia yang sama:

Blok deskriptor. Penjelasan waktu terperinci, dalam mengurangi urutan preferensi. Setelah semua penjelas waktu terperinci, penjelas tambahan diizinkan:

  • Batas jangkauan monitor (wajib)
  • Teks ASCII (nama monitor (wajib), pantau nomor seri atau teks tidak terstruktur)
  • 6 tambahan blok informasi waktu standar
  • Data titik warna

Jenis deskriptor yang saat ini didefinisikan adalah:

  • 0xFF: Pantau nomor seri (teks)
  • 0xFE: Teks (teks) tidak spesifik
  • 0xFD: Batas jangkauan monitor. Deskriptor biner 6- atau 13 byte.
  • 0xFC: Nama monitor (teks)
  • 0xFB: Data titik putih tambahan. Deskriptor 2 × 5 byte, diisi dengan 0A 20 20.
  • 0xFA: Pengidentifikasi waktu tambahan standar. Deskriptor 6 × 2 byte, diisi dengan 0A.

Di EDID Anda, Anda memiliki 0xFF(nomor seri) dalam deskripsi 1 (byte 54-71):

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

dan Anda memiliki 0xFC(nama monitor) di deskriptor 3 (byte 90–107) dan 4 (byte 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

jadi itu hanya masalah mengekstraksi informasi dari sana, misalnya deskriptor 3:

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

Ada beberapa alat linux di luar sana yang mengurai EDID ... saya gunakan monitor-edid. Berikut ini adalah output dalam format dumper Perl di mesin saya:

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

Akhirnya, saya tidak tahu cara menentukan (di linux) apakah monitor adalah LCD atau CRT. Saya tidak tahu ada perpustakaan yang mengimplementasikan fungsi seperti itu (seperti ini dari MS).

don_crissti
sumber
Itu jawaban yang bagus. Terima kasih atas usahanya.
Peter.O