รับจอภาพยี่ห้อและรุ่นและข้อมูลอื่น ๆ ในรูปแบบที่มนุษย์อ่านได้


19

ฉันได้แยกเวอร์ชันชวเลขของจอภาพปัจจุบันที่ต่ออยู่กับคอมพิวเตอร์ออกแล้ว
นี่คือตัวอย่าง: vendor "VSC", prod id "18500"

ใน Ubuntu Viewsonic Corporation 16"ของการตั้งค่าการตรวจสอบก็ถูกระบุว่าเป็น

ฉันจะดึงรูปแบบที่มนุษย์อ่านได้นี้ออกมาได้อย่างไร ... และฉันจะทราบได้อย่างไรว่าจอภาพเป็นCRTหรือLCDไม่? (นี่คือสิ่งที่ทำให้ฉันเริ่มภารกิจนี้ได้)

รูปแบบ 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 verboseoutpt ... จนถึงจุดสิ้นสุดของการถ่ายโอนข้อมูล 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

มีหัวข้อที่คล้ายกันคือในstackoverflow.com
pevik

@ peter-o คุณอาจหมายถึง xrandr -q --verbose (พิมพ์ผิดในคำสั่งของคุณ)
dovah

คำตอบ:


8

ในการตั้งค่าการตรวจสอบของ Ubuntu จะระบุว่าเป็นวิวโซนิคคอร์ปอเรชั่น 16 "ฉันจะแยกรูปแบบที่มนุษย์อ่านได้นี้ได้อย่างไร

แบบฟอร์มที่มนุษย์อ่านได้ ( "Viewsonic Corporation" ) ไม่ได้มาจาก EDID ของคุณโดยตรง:
Ubuntu ใช้ gnome library ใต้ 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 คือจากบล็อกตัวอธิบาย จากลิงค์วิกิพีเดียเดียวกัน:

บล็อก Descriptor ตัวบอกเวลาโดยละเอียดในลำดับที่ลดลง หลังจากตัวบอกเวลาโดยละเอียดทั้งหมดแล้วตัวอธิบายเพิ่มเติมจะได้รับอนุญาต:

  • การตรวจสอบช่วง จำกัด (จำเป็น)
  • ข้อความ ASCII (ชื่อจอภาพ (จำเป็น), หมายเลขซีเรียลมอนิเตอร์หรือข้อความที่ไม่มีโครงสร้าง)
  • 6 บล็อกข้อมูลเวลามาตรฐานเพิ่มเติม
  • ข้อมูลจุดสี

ประเภท descriptor ที่กำหนดในปัจจุบันคือ:

  • 0xFF: ตรวจสอบหมายเลขซีเรียล (ข้อความ)
  • 0xFE: ข้อความที่ไม่ระบุ (ข้อความ)
  • 0xFD: จำกัด ช่วงการตรวจสอบ ตัวบ่งชี้ไบนารี 6- หรือ 13 ไบต์
  • 0xFC: ชื่อจอภาพ (ข้อความ)
  • 0xFB: ข้อมูลจุดสีขาวเพิ่มเติม 2 × 5 ไบต์อธิบาย, เบาะด้วย 0A 20 20
  • 0xFA: ตัวระบุเวลามาตรฐานเพิ่มเติม 6 × 2 ไบต์อธิบายพร้อมด้วย 0A

ใน EDID ของคุณคุณมี0xFF(หมายเลขซีเรียล) ใน descriptor 1 (ไบต์ 54-71):

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

และคุณมี0xFC(ชื่อการตรวจสอบ) ใน descriptor 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

ดังนั้นมันเป็นเพียงเรื่องของการดึงข้อมูลจากที่นั่นเช่น descriptor 3:

56 69 65 77 53 6f 6e 69 63 20 45 37 37>> วิวโซนิค E77

มีบางเครื่องมือลินุกซ์ออกมีที่ EDIDs แยกเป็น ... monitor-edidฉันใช้ นี่คือผลลัพธ์ในรูปแบบ Perl dumper บนเครื่องของฉัน:

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


นั่นเป็นคำตอบที่ยอดเยี่ยม ขอบคุณสำหรับความพยายาม
Peter.O

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.