Nhận màn hình và mô hình và thông tin khác ở dạng người có thể đọc được


19

Tôi đã trích xuất phiên bản tốc ký của màn hình hiện tại được gắn vào máy tính.
Đây là một ví dụ: vendor "VSC", prod id "18500"

Trong Tùy chọn màn hình của Ubuntu, nó được xác định là Viewsonic Corporation 16".

Làm thế nào tôi có thể trích xuất hình thức có thể đọc được của con người này? ... Và còn nữa, làm cách nào để xác định xem màn hình là một CRThay LCD? (đây thực sự là những gì tôi đã bắt đầu trong nhiệm vụ này)

Định dạng EDID có thể được tìm thấy trên Wikipedia: Dữ liệu nhận dạng hiển thị mở rộng
Đây là mã được sử dụng để lấy EDID VendorProduct 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"

Chỉnh sửa: Dưới đây là các dòng xrandr -q verboseoutpt hàng đầu ... cho đến hết kết xuất 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

Có chủ đề tương tự trong stackoverflow.com .
pevik

@ peter-o có lẽ bạn có nghĩa là xrandr -q --verbose (lỗi chính tả trong lệnh của bạn)
dovah

Câu trả lời:


8

Trong Tùy chọn giám sát của Ubuntu, nó được xác định là Viewsonic Corporation 16 ". Làm cách nào tôi có thể trích xuất dạng có thể đọc được của con người này?

Hình thức có thể đọc được của con người đó ( "Tập đoàn Viewsonic" ) không đến (trực tiếp) từ EDID của bạn:
Ubuntu sử dụng các thư viện gnome bên dưới. libgnome-desktop giải mã edid và - thông qua pnp-ids - chuyển đổi ID nhà cung cấp ba chữ cái ( "VSC" trong trường hợp cụ thể của bạn) thành một tên đẹp cho màn hình.

gnome-pnp-ids.c , dòng 51:

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

Trên hệ thống của tôi

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

trả về:

VSC    ViewSonic Corporation

Ngoài ra, thông tin bổ sung có thể được trích xuất từ ​​EDID, cụ thể là từ các khối mô tả. Từ cùng một liên kết wikipedia:

Khối mô tả. Mô tả thời gian chi tiết, theo thứ tự ưu tiên giảm. Sau khi tất cả các mô tả thời gian chi tiết, mô tả bổ sung được cho phép:

  • Giám sát giới hạn phạm vi (bắt buộc)
  • Văn bản ASCII (tên màn hình (bắt buộc), số sê-ri màn hình hoặc văn bản phi cấu trúc)
  • 6 khối thông tin thời gian tiêu chuẩn bổ sung
  • Dữ liệu điểm màu

Các loại mô tả được xác định hiện tại là:

  • 0xFF: Theo dõi số sê-ri (văn bản)
  • 0xFE: Văn bản không xác định (văn bản)
  • 0xFD: Giám sát giới hạn phạm vi. Bộ mô tả nhị phân 6 hoặc 13 byte.
  • 0xFC: Tên màn hình (văn bản)
  • 0xFB: Dữ liệu điểm trắng bổ sung. Bộ mô tả 2 × 5 byte, được đệm bằng 0A 20 20.
  • 0xFA: Định danh thời gian tiêu chuẩn bổ sung. Bộ mô tả 6 × 2 byte, được đệm bằng 0A.

Trong EDID của bạn, bạn có 0xFF(số sê-ri) trong mô tả 1 (byte 54-71):

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

và bạn có 0xFC(tên màn hình) trong mô tả 3 (byte 90 Kiểu 107) và 4 (byte 108 Way125):

  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

Vì vậy, đó chỉ là vấn đề trích xuất thông tin từ đó, ví dụ: mô tả 3:

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

Có một số công cụ linux hiện có phân tích EDID ... Tôi sử dụng monitor-edid. Đây là đầu ra ở định dạng máy xúc lật Perl trên máy của tôi:

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

Cuối cùng, tôi không biết làm thế nào để xác định (trong linux) nếu một màn hình là LCD hoặc CRT. Tôi không biết bất kỳ thư viện nào thực hiện chức năng như vậy (như thư viện này từ MS).


Đó là một câu trả lời tuyệt vời. Cảm ơn cho những nỗ lực.
Peter.O 18/03/13

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.