コンピューターに接続されている現在のモニターの簡略版を抽出しました。
例を示します:vendor "VSC", prod id "18500"
Ubuntuのモニター設定では、Viewsonic Corporation 16"
として識別されます。
この人間が読める形式をどのように抽出できますか? ...また、モニターがCRT
かLCD
かをどのように判断できますか? (これが実際にこのクエストを始めたきっかけです)
EDID形式はWikipediaにあります:拡張ディスプレイ識別データ
これは、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 verbose
outpt ... EDIDの16進ダンプの最後までの先頭行は次のとおりです
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
Ubuntuのモニター設定では、Viewsonic Corporation 16 "として識別されます。この人間が読める形式を抽出するにはどうすればよいですか?
人間が読める形式( "Viewsonic Corporation")は、EDIDから(直接)取得されません。
Ubuntuは下にあるgnomeライブラリを使用します。 libgnome-desktop
edidをデコードする および- pnp-ids を介して-3文字のベンダー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から、つまり記述子ブロックから追加情報を抽出できます。同じウィキペディアのリンクから:
記述子ブロック。優先順位の降順の詳細なタイミング記述子。すべての詳細なタイミング記述子の後、追加の記述子が許可されます。
- 監視範囲の制限(必須)
- ASCIIテキスト(モニター名(必須)、モニターのシリアル番号または非構造化テキスト)
- 6追加の標準タイミング情報ブロック
- カラーポイントデータ
現在定義されている記述子タイプは次のとおりです。
- 0xFF:モニターのシリアル番号(テキスト)
- 0xFE:未指定のテキスト(テキスト)
- 0xFD:監視範囲の制限。 6バイトまたは13バイトのバイナリ記述子。
- 0xFC:モニター名(テキスト)
- 0xFB:追加の白色点データ。 2×5バイト記述子、0A 20 20でパディング。
- 0xFA:追加の標準タイミング識別子。 6バイトの2バイト記述子。0Aが埋め込まれます。
EDIDには0xFF
(シリアル番号)記述子1(バイト54〜71):
00 ff 00 48 48 39 32 31 30 30 30 30 39 0a 20 20 00 00
そしてあなたは0xFC
(モニター名)、記述子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
つまり、そこから情報を抽出するだけです。記述子3:
56 69 65 77 53 6f 6e 69 63 20 45 37 37
>>Viewsonic E77
EDIDを解析するLinuxツールがいくつかあります...私は monitor-edid
。これが私のマシンのPerlダンパー形式の出力です。
(
+{
'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
}
,
)
最後に、モニターがLCDまたはCRTであるかどうかを(Linuxで)判断する方法がわかりません。このような関数を実装するライブラリ( this oneなど)は知りません MSから)。
次のツールは、edid情報のデコードに役立ちます。 http://cgit.freedesktop.org/xorg/app/edid-decode